RL-Project / tests /test_api.py
Shubham Sattigeri
This is my RL based project
36131f5
Raw
History Blame Contribute Delete
1.84 kB
import pytest
from fastapi.testclient import TestClient
from artwork_bandit.api.main import app
from artwork_bandit.db import database
import time
client = TestClient(app)
def test_health():
r = client.get('/health')
assert r.status_code == 200
assert r.json().get('status') == 'ok'
def test_recommend_and_feedback_cycle():
# ensure at least one user and content exist
state = app.state
users = state.users
contents = state.contents
if not users or not contents:
pytest.skip('No data')
user = users[0]['user_id']
content = contents[0]['content_id']
start = time.time()
r = client.post('/recommend', json={'user_id': user, 'content_id': content})
elapsed = (time.time() - start) * 1000
assert r.status_code == 200
data = r.json()
assert 'artwork_id' in data
imp_id = data['impression_id']
# feedback
r2 = client.post('/feedback', json={'impression_id': imp_id, 'reward': 1.0})
assert r2.status_code == 200
# stats
r3 = client.get('/stats')
assert r3.status_code == 200
stats = r3.json()
assert 'overall_ctr' in stats
# latency
assert elapsed < 200
def test_recommend_invalid_user():
r = client.post('/recommend', json={'user_id': 'no_such_user', 'content_id': 'content_001'})
assert r.status_code == 404
def test_feedback_invalid_reward():
# create an impression
state = app.state
users = state.users
contents = state.contents
if not users or not contents:
pytest.skip('No data')
user = users[0]['user_id']
content = contents[0]['content_id']
r = client.post('/recommend', json={'user_id': user, 'content_id': content})
imp = r.json()['impression_id']
r2 = client.post('/feedback', json={'impression_id': imp, 'reward': 2.0})
assert r2.status_code == 422