File size: 2,984 Bytes
21f81f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
    import os
# Set env vars before importing app modules to ensure they use the test DB
os.environ["DATABASE_URL"] = "sqlite:///./test.db"
os.environ["POSTGRES_USER"] = "user"
os.environ["POSTGRES_PASSWORD"] = "password"
os.environ["POSTGRES_DB"] = "dbname"
os.environ["JWT_SECRET"] = "testsecret"
os.environ["HF_TOKEN"] = "testtoken"

from fastapi.testclient import TestClient
from sqlalchemy import create_engine, StaticPool
from sqlalchemy.orm import sessionmaker
from app.main import app
from app.database import Base, get_db
from app.utils import hf_client
from unittest.mock import MagicMock

# Use SQLite for testing
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, 
    connect_args={"check_same_thread": False},
    poolclass=StaticPool,
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# Patch the app's engine to use our test engine
from app import database
database.engine = engine

Base.metadata.create_all(bind=engine)

def override_get_db():
    try:
        db = TestingSessionLocal()
        yield db
    finally:
        db.close()

app.dependency_overrides[get_db] = override_get_db

client = TestClient(app)

def test_register():
    response = client.post(
        "/register",
        json={"username": "testuser", "password": "testpassword"},
    )
    assert response.status_code == 200
    assert response.json()["username"] == "testuser"

def test_login():
    client.post(
        "/register",
        json={"username": "testuser2", "password": "testpassword"},
    )
    response = client.post(
        "/login",
        json={"username": "testuser2", "password": "testpassword"},
    )
    assert response.status_code == 200
    assert "access_token" in response.cookies

def test_login_wrong_password():
    client.post(
        "/register",
        json={"username": "testuser3", "password": "testpassword"},
    )
    response = client.post(
        "/login",
        json={"username": "testuser3", "password": "wrongpassword"},
    )
    assert response.status_code == 404

def test_translate_no_cookie():
    response = client.post(
        "/translate",
        json={"text": "Hello", "direction": "en-fr"},
    )
    assert response.status_code == 401

def test_translate_success(monkeypatch):
    # Mock HF API
    def mock_translate(*args, **kwargs):
        return "Bonjour"
    
    monkeypatch.setattr(hf_client, "translate_text", mock_translate)

    # Login first
    client.post(
        "/register",
        json={"username": "testuser4", "password": "testpassword"},
    )
    login_response = client.post(
        "/login",
        json={"username": "testuser4", "password": "testpassword"},
    )
    
    response = client.post(
        "/translate",
        json={"text": "Hello", "direction": "en-fr"},
        cookies=login_response.cookies
    )
    assert response.status_code == 200
    assert response.json()["translation"] == "Bonjour"