From a1b5d99de4b30ac65478e0754f01b2455744a20c Mon Sep 17 00:00:00 2001 From: Alix JEUDI--LEMOINE Date: Wed, 28 May 2025 19:43:22 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Add=20tests=20for=20friends/pins=20?= =?UTF-8?q?&=20fixed=20structure=20for=20images/pins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_friends.py | 112 +++++++++++++++++++++++--- tests/test_images.py | 1 + tests/test_pins.py | 183 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 285 insertions(+), 11 deletions(-) diff --git a/tests/test_friends.py b/tests/test_friends.py index 0996fe7..5ca712a 100644 --- a/tests/test_friends.py +++ b/tests/test_friends.py @@ -1,16 +1,37 @@ from test_main import * +from bson import ObjectId +import pytest -def test_add_friend(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"] +def cleanup_friendship(user_id, user_id_second): + """Supprime l'amitié entre deux utilisateurs.""" + db["friends"].delete_many({ + "$or": [ + {"user_id": user_id, "friend_user_id": user_id_second}, + {"user_id": user_id_second, "friend_user_id": user_id} + ] + }) - friend_data = {"friend_user_id": user_id} - - response = client.post("/friend/add", json=friend_data, headers={"Authorization": f"Bearer {token}"}) +@pytest.fixture(autouse=True) +def cleanup_after_test(user_id, user_id_second): + yield + cleanup_friendship(user_id, user_id_second) + +def test_add_friend(token, token_second, user_id_second): + # Ajouter l'ami + response = client.post("/friend/add", + json={"friend_user_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"}) assert response.status_code == 200 data = response.json() assert "id" in data + friend_id = data["id"] + + # Accepter la demande d'ami + response = client.patch( + f"/friend/{friend_id}/accept", + headers={"Authorization": f"Bearer {token_second}"} + ) + assert response.status_code == 200 def test_add_friend_myself(token): friend_data = {"friend_user_id": str(db["users"].find_one({"username": "testuser"})["_id"])} @@ -23,14 +44,22 @@ def test_list_friends(token): data = response.json() assert isinstance(data, list) -def test_get_friend(token): - friend_id = str(db["friends"].find_one({})["_id"]) +def test_get_friend(token, user_id, user_id_second): + # Créer une amitié directement en base + friend_id = db["friends"].insert_one({ + "user_id": user_id, + "friend_user_id": user_id_second, + "status": "accepted" + }).inserted_id + + # Tester la récupération de l'ami 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 "friend_user_id" in data assert "status" in data + assert data["status"] == "accepted" def test_get_friend_wrong_format(token): response = client.get(f"/friend/randomIdThatDoesntExists", headers={"Authorization": f"Bearer {token}"}) @@ -38,4 +67,67 @@ def test_get_friend_wrong_format(token): def test_get_friend_unknown_id(token): response = client.get(f"/friend/123456789987654321abcdef", headers={"Authorization": f"Bearer {token}"}) - assert response.status_code == 404 \ No newline at end of file + assert response.status_code == 404 + +def test_accept_already_accepted_friend_request(token, token_second, user_id_second): + # Créer une demande d'ami + response = client.post( + "/friend/add", + json={"friend_user_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"} + ) + friend_id = response.json()["id"] + + # Accepter la demande une première fois + client.patch( + f"/friend/{friend_id}/accept", + headers={"Authorization": f"Bearer {token_second}"} + ) + + # Essayer d'accepter à nouveau + response = client.patch( + f"/friend/{friend_id}/accept", + headers={"Authorization": f"Bearer {token_second}"} + ) + assert response.status_code == 422 + assert "Friend request already accepted" in response.json()["detail"] + +def test_deny_friend_request(user_id, token_second, user_id_second): + # Créer une demande d'ami directement en base + friend_id = db["friends"].insert_one({ + "user_id": user_id, + "friend_user_id": user_id_second, + "status": "pending" + }).inserted_id + + # Refuser la demande + response = client.delete( + f"/friend/{friend_id}/deny", + headers={"Authorization": f"Bearer {token_second}"} + ) + assert response.status_code == 200 + assert response.json()["message"] == "Friend request denied" + + # Vérifier que l'amitié a bien été supprimée + friend = db["friends"].find_one({"_id": ObjectId(friend_id)}) + assert friend is None + +def test_delete_friend(token, user_id, user_id_second): + # Créer une amitié directement en base + friend_id = db["friends"].insert_one({ + "user_id": user_id, + "friend_user_id": user_id_second, + "status": "accepted" + }).inserted_id + + # Supprimer l'ami via l'API + response = client.delete( + f"/friend/{friend_id}/delete", + headers={"Authorization": f"Bearer {token}"} + ) + assert response.status_code == 200 + assert response.json()["message"] == "Friend and associated pin shares deleted" + + # Vérifier que l'amitié a bien été supprimée + friend = db["friends"].find_one({"_id": ObjectId(friend_id)}) + assert friend is None \ No newline at end of file diff --git a/tests/test_images.py b/tests/test_images.py index 49f509c..f81c9f8 100644 --- a/tests/test_images.py +++ b/tests/test_images.py @@ -16,6 +16,7 @@ def create_test_pin(token, user_id="682c71ee4b4ac435f3d5af17"): "title": "Test Pin", "description": "Test Description", "location": [0,0], + "complete_address": "Paris, Île-de-France, France métropolitaine, France", "files": [], "user_id": user_id }, diff --git a/tests/test_pins.py b/tests/test_pins.py index 674790b..97e86c2 100644 --- a/tests/test_pins.py +++ b/tests/test_pins.py @@ -9,6 +9,33 @@ def create_test_image(): img_byte_arr.seek(0) return img_byte_arr +def ensure_friendship(user_id, user_id_second): + """Crée une amitié entre deux utilisateurs si elle n'existe pas déjà.""" + friend = db["friends"].find_one({ + "$or": [ + {"user_id": user_id, "friend_user_id": user_id_second}, + {"user_id": user_id_second, "friend_user_id": user_id} + ] + }) + if not friend: + db["friends"].insert_one({ + "user_id": user_id, + "friend_user_id": user_id_second, + "status": "accepted" + }) + +def remove_friendship(user_id, user_id_second): + """Supprime l'amitié entre deux utilisateurs si elle existe.""" + friend = db["friends"].find_one({ + "$or": [ + {"user_id": user_id, "friend_user_id": user_id_second}, + {"user_id": user_id_second, "friend_user_id": user_id} + ] + }) + if friend: + db["friends"].delete_one({"_id": friend["_id"]}) + + def add_test_image(token): test_image = create_test_image() response = client.post( @@ -27,6 +54,7 @@ def create_test_pin(token, user_id, image_id=None, with_date=False): "title": "Test Pin", "description": "Test Description", "location": [0,0], + "complete_address": "Paris, Île-de-France, France métropolitaine, France", "files": [image_id], "user_id": user_id } @@ -58,6 +86,7 @@ def test_add_pin_invalid_files_format(token, user_id): "title": "Test Pin", "description": "Test Description", "location": [0,0], + "complete_address": "Marseille, Bouches-du-Rhône, Provence-Alpes-Côte d'Azur, France métropolitaine, France", "files": ["abc"], "user_id": user_id }, @@ -118,6 +147,7 @@ def test_update_pin(token, user_id): "title": "Updated Pin", "description": "Updated Description", "location": [1,1], + "complete_address": "Mont Saint-Michel, Grande Terrasse de l'Ouest, Le Mont-Saint-Michel, Avranches, Manche, Normandie, France métropolitaine, 50170, France", "files": [image_id], "user_id": user_id }, @@ -133,6 +163,7 @@ def test_update_pin(token, user_id): assert data["title"] == "Updated Pin" assert data["description"] == "Updated Description" assert data["location"] == [1,1] + assert data["complete_address"] == "Mont Saint-Michel, Grande Terrasse de l'Ouest, Le Mont-Saint-Michel, Avranches, Manche, Normandie, France métropolitaine, 50170, France" assert image_id in data["files"] assert data["date"] is None @@ -143,6 +174,7 @@ def test_update_pin(token, user_id): "title": "Updated Pin With Date", "description": "Updated Description", "location": [1,1], + "complete_address": "Bordeaux, Gironde, Nouvelle-Aquitaine, France métropolitaine, France", "files": [image_id], "user_id": user_id, "date": "2024-03-21T12:00:00" @@ -157,6 +189,7 @@ def test_update_pin(token, user_id): ) data = get_response.json() assert data["title"] == "Updated Pin With Date" + assert data["complete_address"] == "Bordeaux, Gironde, Nouvelle-Aquitaine, France métropolitaine, France" assert data["date"] == "2024-03-21T12:00:00" def test_update_wrong_format(token): @@ -181,4 +214,152 @@ def test_delete_pin(token, user_id): f"/pin/{pin_id}", headers={"Authorization": f"Bearer {token}"} ) - assert get_response.status_code == 404 \ No newline at end of file + assert get_response.status_code == 404 + +def test_share_pin(token, user_id, token_second, user_id_second): + # Créer un pin + image_id = add_test_image(token) + pin_id = create_test_pin(token, user_id, image_id) + + # S'assurer que les utilisateurs sont amis + ensure_friendship(user_id, user_id_second) + + # Partager le pin + response = client.post( + f"/pin/{pin_id}/share", + json={"friend_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"} + ) + assert response.status_code == 200 + + # Vérifier que l'autre utilisateur peut voir le pin + response = client.get( + f"/pin/{pin_id}", + headers={"Authorization": f"Bearer {token_second}"} + ) + assert response.status_code == 200 + +def test_share_pin_not_owner(token, user_id, token_second, user_id_second): + # Créer un pin avec le deuxième utilisateur + image_id = add_test_image(token_second) + pin_id = create_test_pin(token_second, user_id_second, image_id) + + # Essayer de partager le pin (ne devrait pas fonctionner car on n'est pas le propriétaire) + response = client.post( + f"/pin/{pin_id}/share", + json={"friend_id": user_id}, + headers={"Authorization": f"Bearer {token}"} + ) + assert response.status_code == 403 + assert "You can only share your own pins" in response.json()["detail"] + +def test_share_pin_already_shared(token, user_id, token_second, user_id_second): + # Créer un pin + image_id = add_test_image(token) + pin_id = create_test_pin(token, user_id, image_id) + + # S'assurer que les utilisateurs sont amis + ensure_friendship(user_id, user_id_second) + + # Partager le pin une première fois + response = client.post( + f"/pin/{pin_id}/share", + json={"friend_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"} + ) + assert response.status_code == 200 + + # Essayer de partager à nouveau (ne devrait pas fonctionner) + response = client.post( + f"/pin/{pin_id}/share", + json={"friend_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"} + ) + assert response.status_code == 409 + assert "Pin is already shared with this user" in response.json()["detail"] + +def test_update_shared_pin(token, user_id, token_second, user_id_second): + # Créer un pin + image_id = add_test_image(token) + pin_id = create_test_pin(token, user_id, image_id) + + # S'assurer que les utilisateurs sont amis + ensure_friendship(user_id, user_id_second) + + # Partager le pin + client.post( + f"/pin/{pin_id}/share", + json={"friend_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"} + ) + + # L'autre utilisateur essaie de modifier le pin + response = client.patch( + f"/pin/{pin_id}", + json={ + "title": "Updated by friend", + "description": "Updated Description", + "location": [1,1], + "complete_address": "Marseille, Bouches-du-Rhône, Provence-Alpes-Côte d'Azur, France métropolitaine, France", + "files": [image_id], + "user_id": user_id_second + }, + headers={"Authorization": f"Bearer {token_second}"} + ) + assert response.status_code == 200 + + # Vérifier que les modifications ont été appliquées + response = client.get( + f"/pin/{pin_id}", + headers={"Authorization": f"Bearer {token_second}"} + ) + data = response.json() + assert data["title"] == "Updated by friend" + assert data["complete_address"] == "Marseille, Bouches-du-Rhône, Provence-Alpes-Côte d'Azur, France métropolitaine, France" + +def test_delete_shared_pin_access(token, user_id, token_second, user_id_second): + # Créer un pin + image_id = add_test_image(token) + pin_id = create_test_pin(token, user_id, image_id) + + # S'assurer que les utilisateurs sont amis + ensure_friendship(user_id, user_id_second) + + # Partager le pin + client.post( + f"/pin/{pin_id}/share", + json={"friend_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"} + ) + + # L'autre utilisateur supprime son accès au pin + response = client.delete( + f"/pin/{pin_id}", + headers={"Authorization": f"Bearer {token_second}"} + ) + assert response.status_code == 200 + assert "Pin access removed" in response.json()["message"] + + # Vérifier que l'autre utilisateur n'a plus accès au pin + response = client.get( + f"/pin/{pin_id}", + headers={"Authorization": f"Bearer {token_second}"} + ) + assert response.status_code == 403 + +def test_share_pin_not_friend(token, user_id, token_second, user_id_second): + # Créer un pin + image_id = add_test_image(token) + pin_id = create_test_pin(token, user_id, image_id) + + # S'assurer que les utilisateurs ne sont pas amis + remove_friendship(user_id, user_id_second) + + # Essayer de partager avec quelqu'un qui n'est pas ami + response = client.post( + f"/pin/{pin_id}/share", + json={"friend_id": user_id_second}, + headers={"Authorization": f"Bearer {token}"} + ) + assert response.status_code == 403 + assert "You can only share pins with your friends" in response.json()["detail"] \ No newline at end of file