from app.schemas.project import Project, ProjectFile def test_project_model_roundtrips(): p = Project( project_id="abc", name="My Project", created_at=1.0, updated_at=2.0, files=[ProjectFile(filename="a.pdf", file_id="deadbeef")], ) dumped = p.model_dump() restored = Project(**dumped) assert restored.files[0].filename == "a.pdf" assert restored.intention == "learn" # default assert restored.title == "" # default from app.services.project_service import ProjectService def test_create_persists_and_loads(tmp_path): svc = ProjectService(root=str(tmp_path)) p = svc.create("Thesis") assert p.project_id assert p.name == "Thesis" loaded = svc.load(p.project_id) assert loaded is not None assert loaded.name == "Thesis" def test_load_missing_returns_none(tmp_path): svc = ProjectService(root=str(tmp_path)) assert svc.load("nope") is None def test_list_orders_by_updated_desc(tmp_path): svc = ProjectService(root=str(tmp_path)) a = svc.create("A") b = svc.create("B") b.updated_at = a.updated_at + 100 svc.save(b) ids = [p.project_id for p in svc.list()] assert ids[0] == b.project_id def test_derive_document_id_is_order_independent(tmp_path): from app.schemas.project import ProjectFile svc = ProjectService(root=str(tmp_path)) p1 = svc.create("P1") p1.files = [ProjectFile(filename="a", file_id="11"), ProjectFile(filename="b", file_id="22")] p2 = svc.create("P2") p2.files = [ProjectFile(filename="b", file_id="22"), ProjectFile(filename="a", file_id="11")] assert svc.derive_document_id(p1) == svc.derive_document_id(p2) def test_empty_project_has_no_document_id(tmp_path): svc = ProjectService(root=str(tmp_path)) p = svc.create("Empty") assert svc.derive_document_id(p) == "" def test_delete_removes_file(tmp_path): svc = ProjectService(root=str(tmp_path)) p = svc.create("Gone") svc.delete(p.project_id) assert svc.load(p.project_id) is None