172 lines
4.4 KiB
Python
172 lines
4.4 KiB
Python
import time
|
|
from pathlib import Path
|
|
from uuid import uuid4
|
|
|
|
import pytest
|
|
|
|
from app.models import SegmentCreateRequest, SegmentType, SegmentUpdateRequest
|
|
from app.services.segment_service import (
|
|
create_segment,
|
|
delete_segment,
|
|
get_segment,
|
|
list_segments,
|
|
reorder_segments,
|
|
update_segment,
|
|
)
|
|
from app.services.site_service import get_site_title, update_site_title
|
|
|
|
# --- Segment Service Tests ---
|
|
|
|
|
|
def test_create_segment(db: Path) -> None:
|
|
request = SegmentCreateRequest(
|
|
type=SegmentType.MARKDOWN,
|
|
title="Intro",
|
|
content="Hello world",
|
|
)
|
|
segment = create_segment(db, request)
|
|
|
|
assert segment.id is not None
|
|
assert segment.sort_order == 0
|
|
assert segment.title == "Intro"
|
|
assert segment.type == SegmentType.MARKDOWN
|
|
assert segment.content == "Hello world"
|
|
assert segment.created_at == segment.updated_at
|
|
|
|
|
|
def test_create_segment_auto_increments_sort_order(db: Path) -> None:
|
|
for i in range(3):
|
|
request = SegmentCreateRequest(
|
|
type=SegmentType.MARKDOWN,
|
|
title=f"Segment {i}",
|
|
)
|
|
segment = create_segment(db, request)
|
|
assert segment.sort_order == i
|
|
|
|
|
|
def test_list_segments_empty(db: Path) -> None:
|
|
segments = list_segments(db)
|
|
assert segments == []
|
|
|
|
|
|
def test_list_segments_ordered(db: Path) -> None:
|
|
titles = ["First", "Second", "Third"]
|
|
for title in titles:
|
|
create_segment(
|
|
db,
|
|
SegmentCreateRequest(type=SegmentType.MARKDOWN, title=title),
|
|
)
|
|
|
|
segments = list_segments(db)
|
|
assert [s.title for s in segments] == titles
|
|
assert [s.sort_order for s in segments] == [0, 1, 2]
|
|
|
|
|
|
def test_get_segment_found(db: Path) -> None:
|
|
created = create_segment(
|
|
db,
|
|
SegmentCreateRequest(type=SegmentType.PDF, title="Slides"),
|
|
)
|
|
fetched = get_segment(db, created.id)
|
|
|
|
assert fetched is not None
|
|
assert fetched.id == created.id
|
|
assert fetched.title == "Slides"
|
|
assert fetched.type == SegmentType.PDF
|
|
|
|
|
|
def test_get_segment_not_found(db: Path) -> None:
|
|
result = get_segment(db, uuid4())
|
|
assert result is None
|
|
|
|
|
|
def test_update_segment_title(db: Path) -> None:
|
|
created = create_segment(
|
|
db,
|
|
SegmentCreateRequest(
|
|
type=SegmentType.MARKDOWN,
|
|
title="Old Title",
|
|
content="Keep me",
|
|
),
|
|
)
|
|
time.sleep(0.01)
|
|
updated = update_segment(
|
|
db,
|
|
created.id,
|
|
SegmentUpdateRequest(title="New Title"),
|
|
)
|
|
|
|
assert updated is not None
|
|
assert updated.title == "New Title"
|
|
assert updated.content == "Keep me"
|
|
assert updated.updated_at > updated.created_at
|
|
|
|
|
|
def test_update_segment_not_found(db: Path) -> None:
|
|
result = update_segment(
|
|
db,
|
|
uuid4(),
|
|
SegmentUpdateRequest(title="Nope"),
|
|
)
|
|
assert result is None
|
|
|
|
|
|
def test_delete_segment(db: Path) -> None:
|
|
created = create_segment(
|
|
db,
|
|
SegmentCreateRequest(type=SegmentType.MARKDOWN, title="Bye"),
|
|
)
|
|
assert delete_segment(db, created.id) is True
|
|
assert get_segment(db, created.id) is None
|
|
|
|
|
|
def test_delete_segment_not_found(db: Path) -> None:
|
|
assert delete_segment(db, uuid4()) is False
|
|
|
|
|
|
def test_reorder_segments(db: Path) -> None:
|
|
a = create_segment(
|
|
db,
|
|
SegmentCreateRequest(type=SegmentType.MARKDOWN, title="A"),
|
|
)
|
|
b = create_segment(
|
|
db,
|
|
SegmentCreateRequest(type=SegmentType.MARKDOWN, title="B"),
|
|
)
|
|
c = create_segment(
|
|
db,
|
|
SegmentCreateRequest(type=SegmentType.MARKDOWN, title="C"),
|
|
)
|
|
|
|
reorder_segments(db, [c.id, a.id, b.id])
|
|
segments = list_segments(db)
|
|
|
|
assert [s.title for s in segments] == ["C", "A", "B"]
|
|
assert [s.sort_order for s in segments] == [0, 1, 2]
|
|
|
|
|
|
def test_reorder_segments_invalid_ids(db: Path) -> None:
|
|
create_segment(
|
|
db,
|
|
SegmentCreateRequest(type=SegmentType.MARKDOWN, title="Only"),
|
|
)
|
|
with pytest.raises(ValueError):
|
|
reorder_segments(db, [uuid4()])
|
|
|
|
|
|
# --- Site Service Tests ---
|
|
|
|
|
|
def test_get_site_title_default(db: Path) -> None:
|
|
assert get_site_title(db) == "Untitled Site"
|
|
|
|
|
|
def test_update_and_get_site_title(db: Path) -> None:
|
|
update_site_title(db, "My Course")
|
|
assert get_site_title(db) == "My Course"
|
|
|
|
|
|
def test_update_site_title_overwrites(db: Path) -> None:
|
|
update_site_title(db, "First")
|
|
update_site_title(db, "Second")
|
|
assert get_site_title(db) == "Second"
|