File size: 3,187 Bytes
50231a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2571402
50231a8
 
 
 
 
 
 
 
2571402
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50231a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
83
84
85
86
87
88
89
90
91
92
from io import BytesIO

from fastapi.testclient import TestClient

from app.main import app
from app.pipelines.classification_pipeline import classification_pipeline

client = TestClient(app)


def test_classifier_endpoint_contract(monkeypatch):
    monkeypatch.setattr(classification_pipeline, "classify_text", lambda text: "news")

    response = client.post("/api/classifier", json={"text": "This is a long enough sentence for classification."})

    assert response.status_code == 200
    assert response.json() == "news"


def test_language_endpoint_contract(monkeypatch):
    monkeypatch.setattr(classification_pipeline, "detect_language", lambda text: "en")

    response = client.post("/api/language", json={"text": "This is a language detection sample text."})

    assert response.status_code == 200
    assert response.json() == "en"


def test_labels_config_roundtrip():
    response = client.post("/configlabel", json={"labels": ["tech", "health", "legal"]})
    assert response.status_code == 200
    assert response.json() == ["tech", "health", "legal"]

    get_response = client.get("/labels")
    assert get_response.status_code == 200
    assert get_response.json() == ["tech", "health", "legal"]


def test_labels_config_accepts_labels_list_payload():
    response = client.post("/configlabel", json={"labels": ["tech", "health", "legal"]})
    assert response.status_code == 200
    assert response.json() == ["tech", "health", "legal"]


def test_labels_config_rejects_empty_labels():
    response = client.post("/configlabel", json={"labels": [" ", ""]})
    assert response.status_code == 400
    assert response.json() == {"detail": "At least one label is required"}


def test_labels_config_rejects_missing_labels():
    response = client.post("/configlabel", json={})
    assert response.status_code == 422
    assert "labels" in response.text


def test_labels_config_rejects_text_field():
    response = client.post("/configlabel", json={"text": "tech,health"})
    assert response.status_code == 422
    assert "extra_forbidden" in response.text


def test_labels_config_rejects_texts_field():
    response = client.post("/configlabel", json={"texts": ["tech,health"]})
    assert response.status_code == 422
    assert "extra_forbidden" in response.text


def test_transform_file_contract(monkeypatch):
    monkeypatch.setattr(classification_pipeline, "transform_file", lambda filename, path: "extracted content")

    files = {"file": ("sample.txt", BytesIO(b"hello"), "text/plain")}
    response = client.post("/api/transformer", files=files)

    assert response.status_code == 200
    assert response.json()["filename"] == "sample.txt"
    assert response.json()["content"] == "extracted content"


def test_classify_file_contract(monkeypatch):
    monkeypatch.setattr(
        classification_pipeline,
        "classify_file",
        lambda filename, path: {"label": "finance", "language": "en"},
    )

    files = {"file": ("sample.txt", BytesIO(b"hello"), "text/plain")}
    response = client.post("/classify", files=files)

    assert response.status_code == 200
    assert response.json() == {"label": "finance", "language": "en", "type": None}