54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
"""Tests for template entity validation."""
|
|
|
|
import pytest
|
|
from dataclasses import dataclass
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Stub domain object -- replace with real import later
|
|
# ---------------------------------------------------------------------------
|
|
@dataclass
|
|
class Template:
|
|
name: str
|
|
description: str = ""
|
|
chart_spec_ids: list[str] | None = None
|
|
|
|
def validate(self) -> list[str]:
|
|
"""Return a list of validation error messages (empty == valid)."""
|
|
errors: list[str] = []
|
|
if not self.name or not self.name.strip():
|
|
errors.append("Template name must not be empty.")
|
|
if len(self.name) > 200:
|
|
errors.append("Template name must not exceed 200 characters.")
|
|
return errors
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Tests
|
|
# ---------------------------------------------------------------------------
|
|
class TestTemplateValidation:
|
|
"""Ensure template entity enforces basic invariants."""
|
|
|
|
def test_empty_name_fails_validation(self):
|
|
t = Template(name="")
|
|
errors = t.validate()
|
|
assert any("empty" in e.lower() for e in errors)
|
|
|
|
def test_whitespace_only_name_fails_validation(self):
|
|
t = Template(name=" ")
|
|
errors = t.validate()
|
|
assert any("empty" in e.lower() for e in errors)
|
|
|
|
def test_valid_name_passes(self):
|
|
t = Template(name="Q1 Sales Report")
|
|
assert t.validate() == []
|
|
|
|
def test_excessively_long_name_fails(self):
|
|
t = Template(name="x" * 201)
|
|
errors = t.validate()
|
|
assert any("200" in e for e in errors)
|
|
|
|
def test_name_at_boundary_passes(self):
|
|
t = Template(name="x" * 200)
|
|
assert t.validate() == []
|