# chuk-motion/tests/components/test_base.py
"""Tests for base component models."""
from pathlib import Path
import pytest
from pydantic import ValidationError
class TestComponentMetadata:
"""Tests for ComponentMetadata model."""
def test_component_metadata_creation(self):
"""Test creating ComponentMetadata instance."""
from chuk_motion.components.base import ComponentMetadata
metadata = ComponentMetadata(
name="TestComponent",
description="A test component",
category="test"
)
assert metadata.name == "TestComponent"
assert metadata.description == "A test component"
assert metadata.category == "test"
def test_component_metadata_forbids_extra_fields(self):
"""Test that ComponentMetadata rejects extra fields."""
from chuk_motion.components.base import ComponentMetadata
with pytest.raises(ValidationError):
ComponentMetadata(
name="Test",
description="Test",
category="test",
extra_field="not allowed"
)
class TestComponentInfo:
"""Tests for ComponentInfo model."""
def test_component_info_basic(self):
"""Test creating ComponentInfo with minimal fields."""
from chuk_motion.components.base import ComponentInfo, ComponentMetadata
metadata = ComponentMetadata(
name="TestComponent",
description="Test",
category="test"
)
info = ComponentInfo(metadata=metadata)
assert info.metadata == metadata
assert info.template_path is None
assert info.register_tool is None
assert info.add_to_composition is None
assert info.directory_name is None
def test_component_info_all_fields(self):
"""Test creating ComponentInfo with all fields."""
from chuk_motion.components.base import ComponentInfo, ComponentMetadata
metadata = ComponentMetadata(
name="TestComponent",
description="Test",
category="test"
)
def mock_register_tool():
pass
def mock_add_to_composition():
pass
template_path = Path("/tmp/template.tsx.j2")
info = ComponentInfo(
metadata=metadata,
template_path=template_path,
register_tool=mock_register_tool,
add_to_composition=mock_add_to_composition,
directory_name="overlays"
)
assert info.metadata == metadata
assert info.template_path == template_path
assert info.register_tool == mock_register_tool
assert info.add_to_composition == mock_add_to_composition
assert info.directory_name == "overlays"
def test_component_info_name_property(self):
"""Test ComponentInfo.name property."""
from chuk_motion.components.base import ComponentInfo, ComponentMetadata
metadata = ComponentMetadata(
name="MyComponent",
description="Test",
category="test"
)
info = ComponentInfo(metadata=metadata)
# Test the name property (line 37)
assert info.name == "MyComponent"
assert info.name == info.metadata.name
def test_component_info_category_property(self):
"""Test ComponentInfo.category property."""
from chuk_motion.components.base import ComponentInfo, ComponentMetadata
metadata = ComponentMetadata(
name="Test",
description="Test",
category="overlay"
)
info = ComponentInfo(metadata=metadata)
# Test the category property (line 42)
assert info.category == "overlay"
assert info.category == info.metadata.category
def test_component_info_forbids_extra_fields(self):
"""Test that ComponentInfo rejects extra fields."""
from chuk_motion.components.base import ComponentInfo, ComponentMetadata
metadata = ComponentMetadata(
name="Test",
description="Test",
category="test"
)
with pytest.raises(ValidationError):
ComponentInfo(
metadata=metadata,
extra_field="not allowed"
)