Skip to content

Commit 123708a

Browse files
committed
added unit tests
1 parent da1af5d commit 123708a

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

tests/conftest.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import pytest
2+
from fastapi.testclient import TestClient
3+
from sqlalchemy import create_engine
4+
from sqlalchemy.orm import sessionmaker
5+
from sqlalchemy.pool import StaticPool
6+
7+
from main import app
8+
from db.database import Base, get_db
9+
10+
# Use an in-memory SQLite database for testing
11+
SQLALCHEMY_DATABASE_URL = "sqlite:///:memory:"
12+
13+
engine = create_engine(
14+
SQLALCHEMY_DATABASE_URL,
15+
connect_args={"check_same_thread": False},
16+
poolclass=StaticPool,
17+
)
18+
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
19+
20+
@pytest.fixture(scope="function")
21+
def db_session():
22+
"""Creates a fresh in-memory database for each test."""
23+
Base.metadata.create_all(bind=engine)
24+
db = TestingSessionLocal()
25+
try:
26+
yield db
27+
finally:
28+
db.close()
29+
Base.metadata.drop_all(bind=engine)
30+
31+
@pytest.fixture(scope="function")
32+
def client(db_session):
33+
"""Returns a FastAPI TestClient that uses the mocked database."""
34+
app.dependency_overrides[get_db] = lambda: db_session
35+
with TestClient(app) as c:
36+
yield c
37+
app.dependency_overrides.clear()

tests/test_main.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
def test_root(client):
2+
"""Test the health check endpoint"""
3+
response = client.get("/")
4+
assert response.status_code == 200
5+
assert response.json() == {"message": "FastAPI Image Upload Server"}
6+
7+
def test_register_user(client):
8+
"""Test successful user registration"""
9+
response = client.post(
10+
"/register",
11+
json={"username": "testuser", "password": "securepassword"}
12+
)
13+
assert response.status_code == 201
14+
assert response.json() == {"message": "User created successfully"}
15+
16+
def test_register_duplicate_user(client):
17+
"""Test that duplicate usernames are rejected"""
18+
client.post("/register", json={"username": "testuser", "password": "securepassword"})
19+
20+
response = client.post("/register", json={"username": "testuser", "password": "newpassword"})
21+
assert response.status_code == 400
22+
assert response.json() == {"detail": "Username already registered"}
23+
24+
def test_login_success(client):
25+
"""Test login and JWT token generation"""
26+
client.post("/register", json={"username": "testuser", "password": "securepassword"})
27+
28+
# Note: OAuth2PasswordRequestForm expects form data (data=...), not JSON
29+
response = client.post(
30+
"/token",
31+
data={"username": "testuser", "password": "securepassword"}
32+
)
33+
assert response.status_code == 200
34+
data = response.json()
35+
assert "access_token" in data
36+
assert data["token_type"] == "bearer"

0 commit comments

Comments
 (0)