You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
7.1 KiB

import sys
from pathlib import Path
sys.path.append(str(Path(__file__).absolute().parent.parent))
# TestClient provided by FastAPI
from fastapi.testclient import TestClient
# PyMongo for the database
import pymongo
# Contains all constants
import app.config as config
# Import the app
from app.main import app
# Database setup
client = pymongo.MongoClient(config.MONGODB_URL, username=config.MONGODB_USERNAME, password=config.MONGODB_PASSWORD)
# Drop test database if exists
if config.MONGODB_DATABASE in client.list_database_names():
try:
client.drop_database(config.MONGODB_DATABASE)
except Exception as e:
print(f"Error with database : {e}")
# Create empty database
db = client[config.MONGODB_DATABASE]
# TestClient with the app imported from main
client = TestClient(app)
def test_register_user():
response = client.post("/register", json={"username": "testuser", "password": "testpassword"})
assert response.status_code == 200
data = response.json()
assert "access_token" in data
assert "token_type" in data
assert "user_id" in data
response = client.post("/register", json={"username": "testuser", "password": "testpassword"})
assert response.status_code == 409 # Conflict - Cannot create two times the same user
def test_login_user():
response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
assert response.status_code == 200
data = response.json()
assert "access_token" in data
assert "token_type" in data
assert "user_id" in data
response = client.post("/login", data={"username": "testuser", "password": "BADpassword"})
assert response.status_code == 401 # Unauthorized, bad pwd
def test_add_pin():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
response = client.post("/pin/add", json={"title": "Test Pin", "description": "Test Description"}, headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 200
data = response.json()
assert "id" in data
def test_list_pins():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
response = client.get("/pins", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 200
data = response.json()
assert isinstance(data, list)
def test_get_pin():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
add_pin_response = client.post("/pin/add", json={"title": "Test Pin", "description": "Test Description"}, headers={"Authorization": f"Bearer {token}"})
pin_id = add_pin_response.json()["id"]
response = client.get(f"/pin/{pin_id}", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 200
data = response.json()
assert data["title"] == "Test Pin"
assert data["description"] == "Test Description"
# Test wrong format
response = client.get(f"/pin/randomIdThatDoesntExists", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 422
# Test inexistant id
response = client.get(f"/pin/123456789987654321abcdef", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 404
def test_update_pin():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
add_pin_response = client.post("/pin/add", json={"title": "Test Pin", "description": "Test Description"}, headers={"Authorization": f"Bearer {token}"})
pin_id = add_pin_response.json()["id"]
update_response = client.patch(f"/pin/{pin_id}", json={"title": "Updated Pin", "description": "Updated Description"}, headers={"Authorization": f"Bearer {token}"})
assert update_response.status_code == 200
get_pin_response = client.get(f"/pin/{pin_id}", headers={"Authorization": f"Bearer {token}"})
data = get_pin_response.json()
assert data["title"] == "Updated Pin"
assert data["description"] == "Updated Description"
# Test wrong format
response = client.get(f"/pin/randomIdThatDoesntExists", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 422
# Test inexistant id
response = client.get(f"/pin/123456789987654321abcdef", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 404
def test_add_friend():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
# Register another user that will be used as a friend
response = client.post("/register", json={"username": "testfriend", "password": "testpassword"})
user_id = response.json()["user_id"]
friend_data = {"friend_user_id": user_id}
response = client.post("/friend/add", json=friend_data, headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 200
data = response.json()
assert "id" in data
friend_data = {"friend_user_id": str(db["users"].find_one({"username": "testuser"})["_id"])}
response = client.post("/friend/add", json=friend_data, headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 409 # Cannot add yourself as a friend
def test_list_friends():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
response = client.get("/friends", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 200
data = response.json()
assert isinstance(data, dict)
def test_get_friend():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
friend_id = str(db["friends"].find_one({})["_id"])
response = client.get(f"/friend/{friend_id}", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 200
data = response.json()
assert "id" in data
assert "user_id" in data
assert "friend_user_id" in data
assert "status" in data
# Test wrong format
response = client.get(f"/friend/randomIdThatDoesntExists", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 422
# Test inexistant id
response = client.get(f"/friend/123456789987654321abcdef", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 404
def test_search_users():
login_response = client.post("/login", data={"username": "testuser", "password": "testpassword"})
token = login_response.json()["access_token"]
response = client.get("/users?name=testuser", headers={"Authorization": f"Bearer {token}"})
assert response.status_code == 200
data = response.json()
assert isinstance(data, list)
assert data[0]["username"] == "testuser"