mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-02 20:14:36 +00:00
192 lines
5.5 KiB
Python
192 lines
5.5 KiB
Python
"""
|
|
Unit tests for discover engine utilities.
|
|
|
|
Tests I18nString, Metadata, and Component utilities.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
from langbot.pkg.discover.engine import I18nString, Metadata, Component
|
|
|
|
|
|
class TestI18nString:
|
|
"""Tests for I18nString Pydantic model."""
|
|
|
|
def test_create_with_english_only(self):
|
|
"""Create I18nString with only English."""
|
|
i18n = I18nString(en_US="Hello")
|
|
|
|
assert i18n.en_US == "Hello"
|
|
assert i18n.zh_Hans is None
|
|
|
|
def test_create_with_multiple_languages(self):
|
|
"""Create I18nString with multiple languages."""
|
|
i18n = I18nString(
|
|
en_US="Hello",
|
|
zh_Hans="你好",
|
|
zh_Hant="你好",
|
|
ja_JP="こんにちは",
|
|
)
|
|
|
|
assert i18n.en_US == "Hello"
|
|
assert i18n.zh_Hans == "你好"
|
|
assert i18n.zh_Hant == "你好"
|
|
assert i18n.ja_JP == "こんにちは"
|
|
|
|
def test_to_dict_with_english_only(self):
|
|
"""to_dict returns only non-None fields."""
|
|
i18n = I18nString(en_US="Hello")
|
|
|
|
result = i18n.to_dict()
|
|
|
|
assert result == {"en_US": "Hello"}
|
|
|
|
def test_to_dict_with_multiple_languages(self):
|
|
"""to_dict returns all non-None fields."""
|
|
i18n = I18nString(
|
|
en_US="Hello",
|
|
zh_Hans="你好",
|
|
)
|
|
|
|
result = i18n.to_dict()
|
|
|
|
assert result == {"en_US": "Hello", "zh_Hans": "你好"}
|
|
|
|
def test_to_dict_excludes_none(self):
|
|
"""to_dict excludes None values."""
|
|
i18n = I18nString(
|
|
en_US="Hello",
|
|
zh_Hans=None,
|
|
ja_JP="こんにちは",
|
|
)
|
|
|
|
result = i18n.to_dict()
|
|
|
|
assert "zh_Hans" not in result
|
|
assert "en_US" in result
|
|
assert "ja_JP" in result
|
|
|
|
def test_to_dict_all_languages(self):
|
|
"""to_dict with all supported languages."""
|
|
i18n = I18nString(
|
|
en_US="Hello",
|
|
zh_Hans="你好",
|
|
zh_Hant="你好",
|
|
ja_JP="こんにちは",
|
|
th_TH="สวัสดี",
|
|
vi_VN="Xin chào",
|
|
es_ES="Hola",
|
|
)
|
|
|
|
result = i18n.to_dict()
|
|
|
|
assert len(result) == 7
|
|
|
|
|
|
class TestMetadata:
|
|
"""Tests for Metadata Pydantic model."""
|
|
|
|
def test_create_minimal(self):
|
|
"""Create Metadata with required fields only."""
|
|
from langbot.pkg.discover.engine import I18nString
|
|
|
|
metadata = Metadata(
|
|
name="test-component",
|
|
label=I18nString(en_US="Test Component"),
|
|
)
|
|
|
|
assert metadata.name == "test-component"
|
|
assert metadata.label.en_US == "Test Component"
|
|
|
|
def test_create_with_all_fields(self):
|
|
"""Create Metadata with all optional fields."""
|
|
from langbot.pkg.discover.engine import I18nString
|
|
|
|
metadata = Metadata(
|
|
name="test-component",
|
|
label=I18nString(en_US="Test"),
|
|
description=I18nString(en_US="A test component"),
|
|
version="1.0.0",
|
|
icon="test-icon",
|
|
author="Test Author",
|
|
repository="https://github.com/test/repo",
|
|
)
|
|
|
|
assert metadata.version == "1.0.0"
|
|
assert metadata.icon == "test-icon"
|
|
assert metadata.author == "Test Author"
|
|
|
|
|
|
class TestComponentManifest:
|
|
"""Tests for Component manifest detection."""
|
|
|
|
def test_is_component_manifest_valid(self):
|
|
"""is_component_manifest returns True for valid manifest."""
|
|
manifest = {
|
|
'apiVersion': 'v1',
|
|
'kind': 'Component',
|
|
'metadata': {'name': 'test'},
|
|
'spec': {},
|
|
}
|
|
|
|
assert Component.is_component_manifest(manifest) is True
|
|
|
|
def test_is_component_manifest_missing_apiversion(self):
|
|
"""is_component_manifest returns False without apiVersion."""
|
|
manifest = {
|
|
'kind': 'Component',
|
|
'metadata': {'name': 'test'},
|
|
'spec': {},
|
|
}
|
|
|
|
assert Component.is_component_manifest(manifest) is False
|
|
|
|
def test_is_component_manifest_missing_kind(self):
|
|
"""is_component_manifest returns False without kind."""
|
|
manifest = {
|
|
'apiVersion': 'v1',
|
|
'metadata': {'name': 'test'},
|
|
'spec': {},
|
|
}
|
|
|
|
assert Component.is_component_manifest(manifest) is False
|
|
|
|
def test_is_component_manifest_missing_metadata(self):
|
|
"""is_component_manifest returns False without metadata."""
|
|
manifest = {
|
|
'apiVersion': 'v1',
|
|
'kind': 'Component',
|
|
'spec': {},
|
|
}
|
|
|
|
assert Component.is_component_manifest(manifest) is False
|
|
|
|
def test_is_component_manifest_missing_spec(self):
|
|
"""is_component_manifest returns False without spec."""
|
|
manifest = {
|
|
'apiVersion': 'v1',
|
|
'kind': 'Component',
|
|
'metadata': {'name': 'test'},
|
|
}
|
|
|
|
assert Component.is_component_manifest(manifest) is False
|
|
|
|
def test_is_component_manifest_empty(self):
|
|
"""is_component_manifest returns False for empty dict."""
|
|
manifest = {}
|
|
|
|
assert Component.is_component_manifest(manifest) is False
|
|
|
|
def test_is_component_manifest_extra_fields_ok(self):
|
|
"""is_component_manifest accepts extra fields."""
|
|
manifest = {
|
|
'apiVersion': 'v1',
|
|
'kind': 'Component',
|
|
'metadata': {'name': 'test'},
|
|
'spec': {},
|
|
'extraField': 'ignored',
|
|
}
|
|
|
|
assert Component.is_component_manifest(manifest) is True
|