Addon Manager: Add unit tests for Addon class
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.")
|
||||
17
src/Mod/AddonManager/AddonManagerTest/data/DoNothing.FCMacro
Normal file
17
src/Mod/AddonManager/AddonManagerTest/data/DoNothing.FCMacro
Normal 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.")
|
||||
28
src/Mod/AddonManager/AddonManagerTest/data/combination.xml
Normal file
28
src/Mod/AddonManager/AddonManagerTest/data/combination.xml
Normal 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>
|
||||
22
src/Mod/AddonManager/AddonManagerTest/data/macro_only.xml
Normal file
22
src/Mod/AddonManager/AddonManagerTest/data/macro_only.xml
Normal 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>
|
||||
24
src/Mod/AddonManager/AddonManagerTest/data/prefpack_only.xml
Normal file
24
src/Mod/AddonManager/AddonManagerTest/data/prefpack_only.xml
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user