File size: 2,889 Bytes
cf4ac41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from fastapi.testclient import TestClient
import json
import pytest

from main import app

client = TestClient(app)

@pytest.fixture
def sample_whatsapp_text():
    return """
01/01/2026, 12:00 - Alice: Hey!
01/01/2026, 12:01 - Bob: Hi there. How's it going?
01/01/2026, 12:02 - Alice: Great, just working on this new AI app.
01/01/2026, 12:03 - Bob: Nice. k.
"""

def test_health_endpoint():
    response = client.get("/health")
    assert response.status_code == 200
    assert response.json()["status"] == "online"

def test_analyze_text_full_flow(client: TestClient, sample_whatsapp_text: str):
    """Test full analysis flow from text upload to scoring."""
    response = client.post("/api/v1/analyze/text", json={"text": sample_whatsapp_text})
    
    assert response.status_code == 200
    data = response.json()
    
    # Assert top-level structure
    assert data["status"] == "success"
    result_data = data["data"]
    assert "overall_summary" in result_data
    assert "participants" in result_data
    assert "segments" in result_data
    assert "global_metrics" in result_data
    
    # Assert participant highlights
    participants = [p["name"] for p in result_data["participants"]]
    assert "Alice" in participants
    assert "Bob" in participants
    
    # Check for "The Driver" or typical badges (probabilistic, but likely for Alice)
    pass 

def test_analyze_file_flow(client: TestClient, sample_whatsapp_text: str):
    """Test file upload flow using realistic-format bytes."""
    files = {"file": ("chat.txt", sample_whatsapp_text.encode("utf-8"), "text/plain")}
    response = client.post("/api/v1/analyze/file", files=files)
    
    assert response.status_code == 200
    assert "data" in response.json()
    assert "overall_summary" in response.json()["data"]

def test_analyze_invalid_format(client: TestClient):
    """Verify that unparseable garbage text doesn't crash the API."""
    garbage = "Random strings of junk that are not chat formats"
    response = client.post("/api/v1/analyze/text", json={"text": garbage})
    
    # Even garbage should return a 200 with minimal empty stats if it's not a server error
    # Or a 400 if strictly enforced
    assert response.status_code in [200, 400]
    data = response.json()
    assert data["status"] == "success"
    assert "data" in data

def test_analyze_text_invalid_payload():
    # Too short text should fail per min_length=10
    payload = {"text": "abc"}
    response = client.post("/api/v1/analyze/text", json=payload)
    assert response.status_code == 422 # Pydantic validation error

def test_analyze_file_invalid_extension():
    files = {
        'file': ('image.jpg', b'fake image data', 'image/jpeg')
    }
    response = client.post("/api/v1/analyze/file", files=files)
    assert response.status_code == 400
    assert "Only .txt files are supported" in response.json()["detail"]