Files
scenar-creator/tests/test_core.py
Daneel 25fd578543
Some checks failed
Build & Push Docker / build (push) Has been cancelled
feat: v3.0 - canvas editor, JSON-only, no Excel, new UI
- Remove all Excel code (import, export, template, pandas, openpyxl)
- New canvas-based schedule editor with drag & drop (interact.js)
- Modern 3-panel UI: sidebar, canvas, documentation tab
- New data model: Block with id/date/start/end, ProgramType with id/name/color
- Clean API: GET /api/health, POST /api/validate, GET /api/sample, POST /api/generate-pdf
- Rewritten PDF generator using ScenarioDocument directly (no DataFrame)
- Professional PDF output: dark header, colored blocks, merged cells, legend, footer
- Sample JSON: "Zimní výjezd oddílu" with 11 blocks, 3 program types
- 30 tests passing (API, core models, PDF generation)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 17:02:51 +01:00

98 lines
2.8 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
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"