bombsquad-plugin-manager/test/test_checks.py

182 lines
7.6 KiB
Python
Raw Normal View History

2022-08-31 06:18:24 +05:30
import git
2022-08-29 22:31:28 +05:30
import hashlib
import json
import re
2022-08-31 06:18:24 +05:30
import io
import os
import pathlib
2022-08-29 22:31:28 +05:30
2022-12-05 21:09:01 +05:30
from distutils.version import StrictVersion
2022-08-29 22:31:28 +05:30
import unittest
2022-08-31 06:18:24 +05:30
class TestPluginManagerMetadata(unittest.TestCase):
def setUp(self):
2022-08-29 22:31:28 +05:30
with open("index.json", "rb") as fin:
self.content = json.load(fin)
2022-08-31 06:18:24 +05:30
self.plugin_manager = "plugin_manager.py"
self.api_version_regexp = re.compile(b"(?<=ba_meta require api )(.*)")
self.plugin_manager_version_regexp = re.compile(b"(?<=PLUGIN_MANAGER_VERSION = )(.*)")
2022-08-29 22:31:28 +05:30
2022-08-31 06:18:24 +05:30
self.current_path = pathlib.Path()
self.repository = git.Repo()
2022-08-29 22:31:28 +05:30
def test_keys(self):
2022-08-31 06:18:24 +05:30
self.assertTrue(isinstance(self.content["plugin_manager_url"], str))
self.assertTrue(isinstance(self.content["versions"], dict))
self.assertTrue(isinstance(self.content["categories"], list))
self.assertTrue(isinstance(self.content["external_source_url"], str))
2022-08-29 22:31:28 +05:30
def test_versions_order(self):
versions = list(self.content["versions"].items())
2022-09-08 01:27:21 +05:30
sorted_versions = sorted(
versions,
2022-12-05 21:09:01 +05:30
key=lambda version: StrictVersion(version[0]),
2022-09-08 01:27:21 +05:30
reverse=True,
)
2022-08-29 22:31:28 +05:30
assert sorted_versions == versions
2022-08-31 06:18:24 +05:30
def test_versions(self):
for version_name, version_metadata in self.content["versions"].items():
commit = self.repository.commit(version_metadata["commit_sha"])
plugin_manager = commit.tree / self.plugin_manager
with io.BytesIO(plugin_manager.data_stream.read()) as fin:
content = fin.read()
md5sum = hashlib.md5(content).hexdigest()
api_version = self.api_version_regexp.search(content).group()
plugin_manager_version = self.plugin_manager_version_regexp.search(content).group()
self.assertEqual(md5sum, version_metadata["md5sum"])
self.assertEqual(int(api_version.decode("utf-8")), version_metadata["api_version"])
self.assertEqual(plugin_manager_version.decode("utf-8"), f'"{version_name}"')
def test_latest_version(self):
2022-08-29 22:31:28 +05:30
versions = tuple(self.content["versions"].items())
2022-08-31 06:18:24 +05:30
latest_version_name, latest_version_metadata = versions[0]
plugin_manager = self.current_path / self.plugin_manager
with open(plugin_manager, "rb") as fin:
content = fin.read()
md5sum = hashlib.md5(content).hexdigest()
api_version = self.api_version_regexp.search(content).group()
plugin_manager_version = self.plugin_manager_version_regexp.search(content).group()
self.assertEqual(md5sum, latest_version_metadata["md5sum"])
self.assertEqual(int(api_version.decode("utf-8")), latest_version_metadata["api_version"])
self.assertEqual(plugin_manager_version.decode("utf-8"), f'"{latest_version_name}"')
class TestPluginMetadata(unittest.TestCase):
def setUp(self):
self.category_directories = tuple(
f'{os.path.join("plugins", path)}'
for path in os.listdir("plugins") if os.path.isdir(path)
)
def test_no_duplicates(self):
unique_plugins = set()
total_plugin_count = 0
for category in self.category_directories:
plugins = os.listdir(category)
total_plugin_count += len(plugins)
unique_plugins.update(plugins)
self.assertEqual(len(unique_plugins), total_plugin_count)
class BaseCategoryMetadataTestCases:
class BaseTest(unittest.TestCase):
def setUp(self):
self.api_version_regexp = re.compile(b"(?<=ba_meta require api )(.*)")
self.current_path = pathlib.Path()
self.repository = git.Repo()
def test_keys(self):
self.assertEqual(self.content["name"], self.name)
self.assertTrue(isinstance(self.content["description"], str))
2022-11-30 18:35:17 +05:30
self.assertTrue(self.content["plugins_base_url"].startswith("https"))
2022-08-31 06:18:24 +05:30
self.assertTrue(isinstance(self.content["plugins"], dict))
def test_versions_order(self):
for plugin_metadata in self.content["plugins"].values():
versions = list(plugin_metadata["versions"].items())
sorted_versions = sorted(
versions,
2022-12-05 21:09:01 +05:30
key=lambda version: StrictVersion(version[0]),
2022-08-31 06:18:24 +05:30
reverse=True,
)
self.assertEqual(sorted_versions, versions)
def test_plugin_keys(self):
for plugin_metadata in self.content["plugins"].values():
self.assertTrue(isinstance(plugin_metadata["description"], str))
self.assertTrue(isinstance(plugin_metadata["external_url"], str))
self.assertTrue(isinstance(plugin_metadata["authors"], list))
self.assertTrue(len(plugin_metadata["authors"]) > 0)
for author in plugin_metadata["authors"]:
self.assertTrue(isinstance(author["name"], str))
self.assertTrue(isinstance(author["email"], str))
self.assertTrue(isinstance(author["discord"], str))
self.assertTrue(isinstance(plugin_metadata["versions"], dict))
self.assertTrue(len(plugin_metadata["versions"]) > 0)
def test_versions(self):
for plugin_name, plugin_metadata in self.content["plugins"].items():
for version_name, version_metadata in plugin_metadata["versions"].items():
commit = self.repository.commit(version_metadata["commit_sha"])
plugin = commit.tree / self.category / f"{plugin_name}.py"
with io.BytesIO(plugin.data_stream.read()) as fin:
content = fin.read()
md5sum = hashlib.md5(content).hexdigest()
api_version = self.api_version_regexp.search(content).group()
self.assertEqual(md5sum, version_metadata["md5sum"])
2022-08-31 19:26:52 +05:30
self.assertEqual(int(api_version.decode("utf-8")),
version_metadata["api_version"])
2022-08-31 06:18:24 +05:30
def test_latest_version(self):
for plugin_name, plugin_metadata in self.content["plugins"].items():
2022-08-31 19:26:52 +05:30
latest_version_name, latest_version_metadata = tuple(
plugin_metadata["versions"].items())[0]
2022-08-31 06:18:24 +05:30
plugin = self.current_path / self.category / f"{plugin_name}.py"
with open(plugin, "rb") as fin:
content = fin.read()
md5sum = hashlib.md5(content).hexdigest()
api_version = self.api_version_regexp.search(content).group()
self.assertEqual(md5sum, latest_version_metadata["md5sum"])
2022-08-31 19:26:52 +05:30
self.assertEqual(int(api_version.decode("utf-8")),
latest_version_metadata["api_version"])
2022-08-31 06:18:24 +05:30
class TestUtilitiesCategoryMetadata(BaseCategoryMetadataTestCases.BaseTest):
def setUp(self):
super().setUp()
self.name = "Utilities"
self.category = os.path.join("plugins", "utilities")
with open(f"{self.category}.json", "rb") as fin:
self.content = json.load(fin)
2023-06-16 00:12:14 +05:30
class TestMapsCategoryMetadata(BaseCategoryMetadataTestCases.BaseTest):
def setUp(self):
super().setUp()
self.name = "Maps"
self.category = os.path.join("plugins", "maps")
with open(f"{self.category}.json", "rb") as fin:
self.content = json.load(fin)
2022-08-31 06:18:24 +05:30
class TestMinigamesCategoryMetadata(BaseCategoryMetadataTestCases.BaseTest):
def setUp(self):
super().setUp()
self.name = "Minigames"
self.category = os.path.join("plugins", "minigames")
with open(f"{self.category}.json", "rb") as fin:
self.content = json.load(fin)