import os.path from tempfile import TemporaryDirectory from zipfile import ZipFile from mock import MagicMock from nose2.tools.such import helper from aqt.addons import AddonManager def test_readMinimalManifest(): assertReadManifest( '{"package": "yes", "name": "no"}', {"package": "yes", "name": "no"} ) def test_readExtraKeys(): assertReadManifest( '{"package": "a", "name": "b", "mod": 3, "conflicts": ["d", "e"]}', {"package": "a", "name": "b", "mod": 3, "conflicts": ["d", "e"]}, ) def test_invalidManifest(): assertReadManifest('{"one": 1}', {}) def test_mustHaveName(): assertReadManifest('{"package": "something"}', {}) def test_mustHavePackage(): assertReadManifest('{"name": "something"}', {}) def test_invalidJson(): assertReadManifest("this is not a JSON dictionary", {}) def test_missingManifest(): assertReadManifest( '{"package": "what", "name": "ever"}', {}, nameInZip="not-manifest.bin" ) def test_ignoreExtraKeys(): assertReadManifest( '{"package": "a", "name": "b", "game": "c"}', {"package": "a", "name": "b"} ) def test_conflictsMustBeStrings(): assertReadManifest( '{"package": "a", "name": "b", "conflicts": ["c", 4, {"d": "e"}]}', {} ) def assertReadManifest(contents, expectedManifest, nameInZip="manifest.json"): with TemporaryDirectory() as td: zfn = os.path.join(td, "addon.zip") with ZipFile(zfn, "w") as zfile: zfile.writestr(nameInZip, contents) adm = AddonManager(MagicMock()) with ZipFile(zfn, "r") as zfile: helper.assertEquals(adm.readManifestFile(zfile), expectedManifest)