File size: 2,837 Bytes
4b6242a
 
 
 
 
 
 
 
 
 
 
 
 
 
10aaf26
4b6242a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10aaf26
4b6242a
 
6697007
 
 
 
 
 
4b6242a
 
 
 
10aaf26
4b6242a
 
 
 
10aaf26
 
 
 
 
4b6242a
 
 
6697007
4b6242a
 
 
 
 
10aaf26
4b6242a
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import json
from pathlib import Path

from fastapi.testclient import TestClient

from backend.api import artifacts as artifacts_api
from backend.api import notebooks as notebooks_api
from backend.app import app
from backend.models.schemas import NotebookCreate
from backend.modules import artifacts as artifacts_module
from backend.services.storage import NotebookStore


client = TestClient(app)
AUTH_U1 = {"X-User-Id": "u1"}


def _seed_source(store: NotebookStore, user_id: str, notebook_id: str, source_id: str = "src_demo") -> None:
    extracted_dir = store.files_extracted_dir(user_id, notebook_id)
    extracted_dir.mkdir(parents=True, exist_ok=True)
    (extracted_dir / f"{source_id}.txt").write_text(
        "Neural networks are trained by minimizing a loss function.",
        encoding="utf-8",
    )
    (extracted_dir / f"{source_id}.meta.json").write_text(
        json.dumps({"source_id": source_id, "source_name": "lesson.txt", "source_type": "txt"}),
        encoding="utf-8",
    )


def test_artifact_endpoints_generate_list_and_download(monkeypatch, tmp_path: Path):
    store = NotebookStore(base_dir=str(tmp_path))
    notebooks_api.store = store
    artifacts_api.store = store

    nb = store.create(NotebookCreate(user_id="u1", name="N1"))
    _seed_source(store, "u1", nb.notebook_id)

    monkeypatch.setattr(artifacts_module.llm_service, "generate", lambda prompt: "Artifact markdown output")
    monkeypatch.setattr(artifacts_module, "_synthesize_podcast_mp3", lambda text: b"ID3api-test")

    report = client.post(
        f"/api/notebooks/{nb.notebook_id}/artifacts/report",
        json={"user_id": "u1", "prompt": "Focus on definitions"},
        headers=AUTH_U1,
    )
    assert report.status_code == 200
    flashcards = client.post(
        f"/api/notebooks/{nb.notebook_id}/artifacts/flashcards",
        json={"user_id": "u1", "num_questions": 6},
        headers=AUTH_U1,
    )
    assert flashcards.status_code == 200

    podcast = client.post(
        f"/api/notebooks/{nb.notebook_id}/artifacts/podcast",
        json={"user_id": "u1"},
        headers=AUTH_U1,
    )
    assert podcast.status_code == 200
    podcast_audio_name = Path(podcast.json()["audio_path"]).name

    listed = client.get(
        f"/api/notebooks/{nb.notebook_id}/artifacts",
        params={"user_id": "u1"},
        headers=AUTH_U1,
    )
    assert listed.status_code == 200
    payload = listed.json()
    assert len(payload["reports"]) == 1
    assert len(payload["flashcards"]) == 1
    assert len(payload["podcasts"]) == 1

    dl = client.get(
        f"/api/notebooks/{nb.notebook_id}/artifacts/download",
        params={"user_id": "u1", "artifact_type": "podcast", "filename": podcast_audio_name},
        headers=AUTH_U1,
    )
    assert dl.status_code == 200
    assert dl.content.startswith(b"ID3")