Addon Manager: Add unit tests for Addon class

This commit is contained in:
Chris Hennes
2022-03-05 10:17:35 -06:00
parent e8a96f72fd
commit f4dbd6b2b2
9 changed files with 236 additions and 7 deletions

View File

@@ -80,9 +80,9 @@ class Addon:
class Dependencies:
def __init__(self):
self.required_external_addons = dict()
self.blockers = dict()
self.replaces = dict()
self.required_external_addons = [] # A list of Addons
self.blockers = [] # A list of Addons
self.replaces = [] # A list of Addons
self.unrecognized_addons: Set[str] = set()
self.python_required: Set[str] = set()
self.python_optional: Set[str] = set()
@@ -363,13 +363,17 @@ class Addon:
return self.cached_icon_filename
def walk_dependency_tree(self, all_repos, deps):
"""Compute the total dependency tree for this repo (recursive)"""
"""Compute the total dependency tree for this repo (recursive)
- all_repos is a dictionary of repos, keyed on the name of the repo
- deps is an Addon.Dependency object encapsulating all the types of dependency
information that may be needed.
"""
deps.python_required |= self.python_requires
deps.python_optional |= self.python_optional
for dep in self.requires:
if dep in all_repos:
if not dep in deps.required:
if not dep in deps.required_external_addons:
deps.required_external_addons.append(all_repos[dep])
all_repos[dep].walk_dependency_tree(all_repos, deps)
else:

View File

@@ -934,7 +934,7 @@ class CommandAddonManager:
FreeCAD.Console.PrintLog("The following addons are required:\n")
for addon in deps.required_external_addons:
FreeCAD.Console.PrintLog(addon + "\n")
FreeCAD.Console.PrintLog(addon.name + "\n")
FreeCAD.Console.PrintLog("The following Python modules are required:\n")
for pyreq in deps.python_required:

View File

@@ -27,6 +27,7 @@ import os
import FreeCAD
from Addon import Addon
from addonmanager_macro import Macro
class TestAddon(unittest.TestCase):
@@ -99,4 +100,105 @@ class TestAddon(unittest.TestCase):
expected_tags.add("TagA")
expected_tags.add("TagB")
expected_tags.add("TagC")
self.assertEqual(tags, expected_tags)
self.assertEqual(tags, expected_tags)
def test_contains_functions(self):
# Test package.xml combinations:
# Workbenches
addon_with_workbench = Addon("FreeCAD","https://github.com/FreeCAD/FreeCAD", Addon.Status.NOT_INSTALLED, "master")
addon_with_workbench.load_metadata_file(os.path.join(self.test_dir, "workbench_only.xml"))
self.assertTrue(addon_with_workbench.contains_workbench())
self.assertFalse(addon_with_workbench.contains_macro())
self.assertFalse(addon_with_workbench.contains_preference_pack())
# Macros
addon_with_macro = Addon("FreeCAD","https://github.com/FreeCAD/FreeCAD", Addon.Status.NOT_INSTALLED, "master")
addon_with_macro.load_metadata_file(os.path.join(self.test_dir, "macro_only.xml"))
self.assertFalse(addon_with_macro.contains_workbench())
self.assertTrue(addon_with_macro.contains_macro())
self.assertFalse(addon_with_macro.contains_preference_pack())
# Preference Packs
addon_with_prefpack = Addon("FreeCAD","https://github.com/FreeCAD/FreeCAD", Addon.Status.NOT_INSTALLED, "master")
addon_with_prefpack.load_metadata_file(os.path.join(self.test_dir, "prefpack_only.xml"))
self.assertFalse(addon_with_prefpack.contains_workbench())
self.assertFalse(addon_with_prefpack.contains_macro())
self.assertTrue(addon_with_prefpack.contains_preference_pack())
# Combination
addon_with_all = Addon("FreeCAD","https://github.com/FreeCAD/FreeCAD", Addon.Status.NOT_INSTALLED, "master")
addon_with_all.load_metadata_file(os.path.join(self.test_dir, "combination.xml"))
self.assertTrue(addon_with_all.contains_workbench())
self.assertTrue(addon_with_all.contains_macro())
self.assertTrue(addon_with_all.contains_preference_pack())
# Now do the simple, explicitly-set cases
addon_wb = Addon("FreeCAD","https://github.com/FreeCAD/FreeCAD", Addon.Status.NOT_INSTALLED, "master")
addon_wb.repo_type = Addon.Kind.WORKBENCH
self.assertTrue(addon_wb.contains_workbench())
self.assertFalse(addon_wb.contains_macro())
self.assertFalse(addon_wb.contains_preference_pack())
addon_m = Addon("FreeCAD","https://github.com/FreeCAD/FreeCAD", Addon.Status.NOT_INSTALLED, "master")
addon_m.repo_type = Addon.Kind.MACRO
self.assertFalse(addon_m.contains_workbench())
self.assertTrue(addon_m.contains_macro())
self.assertFalse(addon_m.contains_preference_pack())
# There is no equivalent for preference packs, they are always accompanied by a
# metadata file
def test_create_from_macro(self):
macro_file = os.path.join(self.test_dir, "DoNothing.FCMacro")
macro = Macro("DoNothing")
macro.fill_details_from_file(macro_file)
addon = Addon.from_macro(macro)
self.assertEqual(addon.repo_type, Addon.Kind.MACRO)
self.assertEqual(addon.name,"DoNothing")
self.assertEqual(addon.macro.comment,"Do absolutely nothing. For Addon Manager unit tests.")
self.assertEqual(addon.url,"https://github.com/FreeCAD/FreeCAD")
self.assertEqual(addon.macro.version,"1.0")
self.assertEqual(len(addon.macro.other_files),3)
self.assertEqual(addon.macro.author,"Chris Hennes")
self.assertEqual(addon.macro.date,"2022-02-28")
self.assertEqual(addon.macro.icon,"not_real.png")
self.assertEqual(addon.macro.xpm,"")
def test_cache(self):
addon = Addon("FreeCAD","https://github.com/FreeCAD/FreeCAD", Addon.Status.NOT_INSTALLED, "master")
cache_data = addon.to_cache()
second_addon = Addon.from_cache(cache_data)
self.assertTrue(addon.__dict__, second_addon.__dict__)
def test_dependency_resolution(self):
addonA = Addon("AddonA","https://github.com/FreeCAD/FakeAddonA", Addon.Status.NOT_INSTALLED, "master")
addonB = Addon("AddonB","https://github.com/FreeCAD/FakeAddonB", Addon.Status.NOT_INSTALLED, "master")
addonC = Addon("AddonC","https://github.com/FreeCAD/FakeAddonC", Addon.Status.NOT_INSTALLED, "master")
addonD = Addon("AddonD","https://github.com/FreeCAD/FakeAddonD", Addon.Status.NOT_INSTALLED, "master")
addonA.requires.add("AddonB")
addonB.requires.add("AddonC")
addonB.requires.add("AddonD")
addonD.requires.add("Path")
all_addons = {
addonA.name: addonA,
addonB.name: addonB,
addonC.name: addonC,
addonD.name: addonD,
}
deps = Addon.Dependencies()
addonA.walk_dependency_tree(all_addons, deps)
self.assertEqual(len(deps.required_external_addons),3)
addon_strings = [addon.name for addon in deps.required_external_addons]
self.assertTrue("AddonB" in addon_strings, "AddonB not in required dependencies, and it should be.")
self.assertTrue("AddonC" in addon_strings, "AddonC not in required dependencies, and it should be.")
self.assertTrue("AddonD" in addon_strings, "AddonD not in required dependencies, and it should be.")
self.assertTrue("Path" in deps.unrecognized_addons, "Path not in unrecognized dependencies, and it should be.")

View File

@@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
__Title__ = 'Do Nothing'
__Author__ = 'Chris Hennes'
__Version__ = '1.0'
__Date__ = '2022-02-28'
__Comment__ = 'Do absolutely nothing. For Addon Manager unit tests.'
__Web__ = 'https://github.com/FreeCAD/FreeCAD'
__Wiki__ = ''
__Icon__ = 'not_real.png'
__Help__ = 'Not much to help with'
__Status__ = 'Very Stable'
__Requires__ = ''
__Communication__ = 'Shout into the void'
__Files__ = 'file1.py, file2.py, file3.py'
print("Well, not quite *nothing*... it does print this line out.")

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<package format="1" xmlns="https://wiki.freecad.org/Package_Metadata">
<name>Combination Test</name>
<description>A package.xml file for unit testing.</description>
<version>1.0.1</version>
<date>2022-01-07</date>
<maintainer email="developer@freecad.org">FreeCAD Developer</maintainer>
<license file="LICENSE">LGPLv2.1</license>
<url type="repository" branch="main">https://github.com/chennes/FreeCAD-Package</url>
<url type="readme">https://github.com/chennes/FreeCAD-Package/blob/main/README.md</url>
<icon>Resources/icons/PackageIcon.svg</icon>
<tag>Tag0</tag>
<tag>Tag1</tag>
<content>
<workbench>
<classname>MyFirstWorkbench</classname>
<icon>Resources/icons/PackageIcon.svg</icon>
</workbench>
<macro>
<file>MyMacro.FCStd</file>
</macro>
<preferencepack>
<name>MyFirstPack</name>
</preferencepack>
</content>
</package>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<package format="1" xmlns="https://wiki.freecad.org/Package_Metadata">
<name>Test Macros</name>
<description>A package.xml file for unit testing.</description>
<version>1.0.1</version>
<date>2022-01-07</date>
<maintainer email="developer@freecad.org">FreeCAD Developer</maintainer>
<license file="LICENSE">LGPLv2.1</license>
<url type="repository" branch="main">https://github.com/chennes/FreeCAD-Package</url>
<url type="readme">https://github.com/chennes/FreeCAD-Package/blob/main/README.md</url>
<icon>Resources/icons/PackageIcon.svg</icon>
<content>
<macro>
<file>MyMacro.FCStd</file>
</macro>
<macro>
<file>MyOtherMacro.FCStd</file>
</macro>
</content>
</package>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<package format="1" xmlns="https://wiki.freecad.org/Package_Metadata">
<name>Test Preference Packs</name>
<description>A package.xml file for unit testing.</description>
<version>1.0.1</version>
<date>2022-01-07</date>
<maintainer email="developer@freecad.org">FreeCAD Developer</maintainer>
<license file="LICENSE">LGPLv2.1</license>
<url type="repository" branch="main">https://github.com/chennes/FreeCAD-Package</url>
<url type="readme">https://github.com/chennes/FreeCAD-Package/blob/main/README.md</url>
<content>
<preferencepack>
<name>MyFirstPack</name>
</preferencepack>
<preferencepack>
<name>MySecondPack</name>
</preferencepack>
<preferencepack>
<name>MyThirdPack</name>
</preferencepack>
</content>
</package>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<package format="1" xmlns="https://wiki.freecad.org/Package_Metadata">
<name>Test Workbenches</name>
<description>A package.xml file for unit testing.</description>
<version>1.0.1</version>
<date>2022-01-07</date>
<maintainer email="developer@freecad.org">FreeCAD Developer</maintainer>
<license file="LICENSE">LGPLv2.1</license>
<url type="repository" branch="main">https://github.com/chennes/FreeCAD-Package</url>
<url type="readme">https://github.com/chennes/FreeCAD-Package/blob/main/README.md</url>
<content>
<workbench>
<classname>MyFirstWorkbench</classname>
<icon>Resources/icons/PackageIcon.svg</icon>
</workbench>
<workbench>
<classname>MySecondWorkbench</classname>
<icon>Resources/icons/PackageIcon.svg</icon>
</workbench>
<workbench>
<classname>MyThirdWorkbench</classname>
<icon>Resources/icons/PackageIcon.svg</icon>
</workbench>
</content>
</package>

View File

@@ -56,6 +56,11 @@ SET(AddonManagerTestsFiles_SRCS
AddonManagerTest/data/good_macro_metadata.FCStd
AddonManagerTest/data/missing_macro_metadata.FCStd
AddonManagerTest/data/good_package.xml
AddonManagerTest/data/macro_only.xml
AddonManagerTest/data/workbench_only.xml
AddonManagerTest/data/prefpack_only.xml
AddonManagerTest/data/combination.xml
AddonManagerTest/data/DoNothing.FCMacro
)
SET(AddonManagerTests_ALL