first commit
This commit is contained in:
commit
b47f825d54
83 changed files with 10016 additions and 0 deletions
172
backend/tests/test_services.py
Normal file
172
backend/tests/test_services.py
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
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"
|
||||
Loading…
Add table
Add a link
Reference in a new issue