119 lines
3.5 KiB
Python
119 lines
3.5 KiB
Python
"""Unit tests for engine.modules."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from engine.modules import (
|
|
FixedValueEntry,
|
|
FixedValueModule,
|
|
ModuleMeta,
|
|
module_from_dict,
|
|
module_to_dict,
|
|
)
|
|
|
|
|
|
class TestFixedValueModuleDefaults:
|
|
def test_minimal_instantiation(self):
|
|
m = FixedValueModule(id="abcd1234")
|
|
assert m.id == "abcd1234"
|
|
assert m.type == "fixed_values"
|
|
assert m.enabled is True
|
|
assert m.entries == []
|
|
assert m.meta == ModuleMeta()
|
|
|
|
def test_with_entries(self):
|
|
m = FixedValueModule(
|
|
id="abcd1234",
|
|
entries=[FixedValueEntry(variable_name="style", value="photo")],
|
|
)
|
|
assert m.entries[0].variable_name == "style"
|
|
assert m.entries[0].value == "photo"
|
|
|
|
|
|
class TestModuleMeta:
|
|
def test_defaults(self):
|
|
meta = ModuleMeta()
|
|
assert meta.name == ""
|
|
assert meta.description == ""
|
|
assert meta.category == ""
|
|
assert meta.tags == []
|
|
|
|
def test_custom(self):
|
|
meta = ModuleMeta(name="style defaults", tags=["character", "style"])
|
|
assert meta.name == "style defaults"
|
|
assert meta.tags == ["character", "style"]
|
|
|
|
|
|
class TestModuleFromDict:
|
|
def test_fixed_values_minimal(self):
|
|
d = {"id": "abcd1234", "type": "fixed_values"}
|
|
m = module_from_dict(d)
|
|
assert isinstance(m, FixedValueModule)
|
|
assert m.id == "abcd1234"
|
|
assert m.enabled is True
|
|
assert m.entries == []
|
|
|
|
def test_fixed_values_full(self):
|
|
d = {
|
|
"id": "abcd1234",
|
|
"type": "fixed_values",
|
|
"enabled": False,
|
|
"meta": {
|
|
"name": "style defaults",
|
|
"description": "portrait baseline",
|
|
"category": "style",
|
|
"tags": ["portrait"],
|
|
},
|
|
"entries": [
|
|
{"variable_name": "style", "value": "photoreal"},
|
|
{"variable_name": "light", "value": "soft"},
|
|
],
|
|
}
|
|
m = module_from_dict(d)
|
|
assert isinstance(m, FixedValueModule)
|
|
assert m.enabled is False
|
|
assert m.meta.name == "style defaults"
|
|
assert m.meta.tags == ["portrait"]
|
|
assert len(m.entries) == 2
|
|
assert m.entries[1].variable_name == "light"
|
|
|
|
def test_unknown_type_raises(self):
|
|
with pytest.raises(ValueError, match="Unknown module type"):
|
|
module_from_dict({"id": "x", "type": "mystery"})
|
|
|
|
def test_missing_type_raises(self):
|
|
with pytest.raises(ValueError, match="missing 'type'"):
|
|
module_from_dict({"id": "x"})
|
|
|
|
def test_missing_id_raises(self):
|
|
with pytest.raises(ValueError, match="missing 'id'"):
|
|
module_from_dict({"type": "fixed_values"})
|
|
|
|
|
|
class TestModuleToDict:
|
|
def test_minimal_round_trip(self):
|
|
m = FixedValueModule(id="abcd1234")
|
|
d = module_to_dict(m)
|
|
assert d["id"] == "abcd1234"
|
|
assert d["type"] == "fixed_values"
|
|
assert d["enabled"] is True
|
|
assert d["entries"] == []
|
|
assert d["meta"] == {
|
|
"name": "",
|
|
"description": "",
|
|
"category": "",
|
|
"tags": [],
|
|
}
|
|
|
|
def test_full_round_trip(self):
|
|
original = FixedValueModule(
|
|
id="abcd1234",
|
|
enabled=False,
|
|
meta=ModuleMeta(name="n", tags=["t1"]),
|
|
entries=[FixedValueEntry(variable_name="v", value="x")],
|
|
)
|
|
d = module_to_dict(original)
|
|
reconstructed = module_from_dict(d)
|
|
assert reconstructed == original
|