"""Version extraction uses the addon asset, not the manifest schema or game version.""" import importlib.util from pathlib import Path import unittest ROOT = Path(__file__).resolve().parents[1] spec = importlib.util.spec_from_file_location('workshop_changelog', ROOT / 'tools/workshop_changelog.py') tool = importlib.util.module_from_spec(spec) spec.loader.exec_module(tool) PROJECT = 'GameProject { GUID "2528466DE220D91C" }' TEXT = '# Changelog\n\n## Update\n\n- Gameplay fix.\n' class WorkshopTests(unittest.TestCase): def test_asset_version(self): manifest = {'version': 1, 'asset': {'id': '2528466DE220D91C', 'version': '0.0.109', 'gameVersion': '1.8.0.13'}} self.assertEqual(tool.bundled_version(manifest, PROJECT), '0.0.109') def test_reject_wrong_addon_and_invalid_manifest(self): for manifest in (None, [], {}, {'asset': None}, {'asset': {'id': None}}, {'asset': {'id': 'OTHER', 'version': '0.0.109'}}, {'asset': {'id': '2528466DE220D91C', 'version': '99999.0.0'}}, {'version': '0.0.109', 'asset': {'id': '2528466DE220D91C'}}): with self.subTest(manifest=manifest), self.assertRaises(ValueError): tool.bundled_version(manifest, PROJECT) def test_update_preserves_notes_and_is_idempotent(self): updated = tool.update_changelog(TEXT, '0.0.109') self.assertIn('Latest published Workshop version: **0.0.109**', updated) self.assertTrue(updated.endswith('## Update\n\n- Gameplay fix.\n')) self.assertEqual(updated, tool.update_changelog(updated, '0.0.109')) next_release = tool.update_changelog(updated, '0.0.110') self.assertNotIn('0.0.109', next_release) self.assertEqual(next_release.count('Latest published Workshop version:'), 1) def test_bad_layout_refused(self): for text in ('Notes only', TEXT + 'Latest published Workshop version: **0.0.1**\n', '# Changelog\nLatest published Workshop version: **0.0.1**\nLatest published Workshop version: **0.0.2**\n'): with self.subTest(text=text), self.assertRaises(ValueError): tool.update_changelog(text, '0.0.109') if __name__ == '__main__': unittest.main()