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"