Files
FreeCADWasmDev/tools/test_desktop_adapter_scope.py
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

64 lines
3.4 KiB
Python

import json
from pathlib import Path
import tempfile
import unittest
from unittest.mock import patch
import business_acceptance as acceptance
import prepare_module_implementation_packet as packet
class DesktopAdapterScopeTests(unittest.TestCase):
def test_packet_includes_existing_module_adapter_before_shared_call_sites(self):
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
sources = root / "web/src"
sources.mkdir(parents=True)
(sources / "part-desktop-adapter.ts").write_text("export function validatePartDesktopResponse() { return null; }\n")
(sources / "techdraw-desktop-adapter.ts").write_text("export function prepareTechDrawCommand() { return null; }\n")
(sources / "desktop-command-dispatcher.ts").write_text("async execute() { return this.router.request(); }\n")
with patch.object(packet, "ROOT", root):
paths = [region["path"] for region in packet.application_integration_excerpts("Part")]
self.assertEqual(paths[0], "web/src/part-desktop-adapter.ts")
self.assertIn("web/src/desktop-command-dispatcher.ts", paths)
self.assertNotIn("web/src/techdraw-desktop-adapter.ts", paths)
def test_module_adapter_changes_invalidate_owner_and_web_but_not_unrelated_modules(self):
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
sources = root / "web/src"
sources.mkdir(parents=True)
manifest = root / "web/public/modules/manifest.json"
manifest.parent.mkdir(parents=True)
manifest.write_text(json.dumps({"modules": {"Part": {}, "TechDraw": {}, "Web": {}}}))
adapter = sources / "techdraw-desktop-adapter.ts"
adapter.write_text("export const value = 1;\n")
dispatcher = sources / "desktop-command-dispatcher.ts"
dispatcher.write_text('import { value } from "./techdraw-desktop-adapter.js";\n')
with patch.object(acceptance, "ROOT", root):
def inputs():
acceptance.digest.cache_clear()
acceptance.module_inputs.cache_clear()
return {module: acceptance.module_inputs(module) for module in ("Part", "TechDraw", "Web")}
before = inputs()
adapter.write_text("export const value = 2;\n")
after = inputs()
self.assertEqual(before["Part"], after["Part"])
self.assertNotEqual(before["TechDraw"], after["TechDraw"])
self.assertNotEqual(before["Web"], after["Web"])
(sources / "part-desktop-adapter.ts").write_text("export const partSelection = true;\n")
part_changed = inputs()
self.assertNotEqual(after["Part"], part_changed["Part"])
self.assertEqual(after["TechDraw"], part_changed["TechDraw"])
self.assertNotEqual(after["Web"], part_changed["Web"])
dispatcher.write_text("export const changedSharedBehavior = true;\n")
changed_shared = inputs()
for module in after:
self.assertNotEqual(after[module], changed_shared[module])
acceptance.digest.cache_clear()
acceptance.module_inputs.cache_clear()
if __name__ == "__main__":
unittest.main()