Files
scenar-creator/tests/test_core.py
Martin Sukany 04fe5590b0
Some checks failed
Build & Push Docker / build (push) Has been cancelled
fix: URL persistence in export + cache-busting v4.8.0
- getDocument() now explicitly lists all block fields including url
- loadDocument() initializes url/series_id for backward compat with older JSONs
- Cache-busting query params (?v=4.8) on all static assets
- PDF generator uses block.url directly (proper model field)
- Added 7 new URL tests (model, API, PDF link annotations)
- Version bumped to 4.8.0
2026-03-14 19:51:05 +01:00

126 lines
3.7 KiB
Python

"""
Core logic tests for Scenar Creator v3.
Tests models, validation, and document structure.
"""
import pytest
from pydantic import ValidationError as PydanticValidationError
from app.models.event import Block, ProgramType, EventInfo, ScenarioDocument
from app.core.validator import ScenarsError, ValidationError
# --- Model tests ---
def test_block_default_id():
b = Block(date="2026-03-01", start="09:00", end="10:00", title="Test", type_id="ws")
assert b.id is not None
assert len(b.id) > 0
def test_block_optional_fields():
b = Block(date="2026-03-01", start="09:00", end="10:00", title="Test", type_id="ws")
assert b.responsible is None
assert b.notes is None
assert b.url is None
assert b.series_id is None
def test_block_series_id():
b = Block(date="2026-03-01", start="09:00", end="10:00", title="Test", type_id="ws",
series_id="s_abc123")
assert b.series_id == "s_abc123"
def test_block_with_url():
b = Block(date="2026-03-01", start="09:00", end="10:00", title="Test", type_id="ws",
url="https://example.com/test")
assert b.url == "https://example.com/test"
def test_block_url_in_serialization():
"""url field must appear in serialized JSON even when None."""
b = Block(id="b1", date="2026-03-01", start="09:00", end="10:00",
title="Test", type_id="ws")
data = b.model_dump(mode="json")
assert "url" in data
assert data["url"] is None
b2 = Block(id="b2", date="2026-03-01", start="09:00", end="10:00",
title="Test", type_id="ws", url="https://example.com")
data2 = b2.model_dump(mode="json")
assert data2["url"] == "https://example.com"
def test_block_with_all_fields():
b = Block(
id="custom-id", date="2026-03-01", start="09:00", end="10:00",
title="Full Block", type_id="ws", responsible="John", notes="A note"
)
assert b.id == "custom-id"
assert b.responsible == "John"
assert b.notes == "A note"
def test_program_type():
pt = ProgramType(id="main", name="Main Program", color="#3B82F6")
assert pt.id == "main"
assert pt.name == "Main Program"
assert pt.color == "#3B82F6"
def test_event_info_minimal():
e = EventInfo(title="Test")
assert e.title == "Test"
assert e.subtitle is None
assert e.date is None
assert e.location is None
def test_event_info_full():
e = EventInfo(title="Event", subtitle="Sub", date="2026-03-01", location="Prague")
assert e.location == "Prague"
def test_scenario_document():
doc = ScenarioDocument(
event=EventInfo(title="Test"),
program_types=[ProgramType(id="ws", name="Workshop", color="#FF0000")],
blocks=[Block(date="2026-03-01", start="09:00", end="10:00", title="B1", type_id="ws")]
)
assert doc.version == "1.0"
assert len(doc.blocks) == 1
assert len(doc.program_types) == 1
def test_scenario_document_serialization():
doc = ScenarioDocument(
event=EventInfo(title="Test"),
program_types=[ProgramType(id="ws", name="Workshop", color="#FF0000")],
blocks=[Block(id="b1", date="2026-03-01", start="09:00", end="10:00", title="B1", type_id="ws")]
)
data = doc.model_dump(mode="json")
assert data["event"]["title"] == "Test"
assert data["blocks"][0]["type_id"] == "ws"
assert data["blocks"][0]["id"] == "b1"
def test_scenario_document_missing_title():
with pytest.raises(PydanticValidationError):
ScenarioDocument(
event=EventInfo(),
program_types=[],
blocks=[]
)
# --- Validator tests ---
def test_scenars_error_hierarchy():
assert issubclass(ValidationError, ScenarsError)
def test_validation_error_message():
err = ValidationError("test error")
assert str(err) == "test error"