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.
365 lines
12 KiB
365 lines
12 KiB
from test_main import *
|
|
from PIL import Image
|
|
import io
|
|
|
|
def create_test_image():
|
|
img = Image.new('RGB', (100, 100), color='red')
|
|
img_byte_arr = io.BytesIO()
|
|
img.save(img_byte_arr, format='JPEG')
|
|
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(
|
|
"/image/pin/null/add",
|
|
files={"image": ("test.jpg", test_image, "image/jpeg")},
|
|
data={"exif_date": "2024-03-20T12:00:00", "caption": "Test caption"},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
return response.json()["id"]
|
|
|
|
def create_test_pin(token, user_id, image_id=None, with_date=False):
|
|
if image_id is None:
|
|
image_id = add_test_image(token)
|
|
|
|
pin_data = {
|
|
"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
|
|
}
|
|
|
|
if with_date:
|
|
pin_data["date"] = "2024-03-20T12:00:00"
|
|
|
|
response = client.post(
|
|
"/pin/add",
|
|
json=pin_data,
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
return response.json()["id"]
|
|
|
|
def test_add_pin(token, user_id):
|
|
# Test sans date
|
|
image_id = add_test_image(token)
|
|
pin_id = create_test_pin(token, user_id, image_id)
|
|
assert pin_id is not None
|
|
|
|
# Test avec date
|
|
pin_id_with_date = create_test_pin(token, user_id, image_id, with_date=True)
|
|
assert pin_id_with_date is not None
|
|
|
|
def test_add_pin_invalid_files_format(token, user_id):
|
|
response = client.post(
|
|
"/pin/add",
|
|
json={
|
|
"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
|
|
},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 422
|
|
assert "Invalid image ID format" in response.json()["detail"][0]["msg"]
|
|
|
|
def test_list_pins(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(token, user_id):
|
|
# Test sans date
|
|
image_id = add_test_image(token)
|
|
pin_id = create_test_pin(token, user_id, image_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"
|
|
assert data["location"] == [0,0]
|
|
assert image_id in data["files"]
|
|
assert data["date"] is None
|
|
|
|
# Test avec date
|
|
pin_id_with_date = create_test_pin(token, user_id, image_id, with_date=True)
|
|
response = client.get(
|
|
f"/pin/{pin_id_with_date}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["date"] == "2024-03-20T12:00:00"
|
|
|
|
def test_get_pin_wrong_format(token):
|
|
response = client.get(f"/pin/randomIdThatDoesntExists", headers={"Authorization": f"Bearer {token}"})
|
|
assert response.status_code == 422
|
|
|
|
def test_get_pin_unknown_id(token):
|
|
response = client.get(f"/pin/123456789987654321abcdef", headers={"Authorization": f"Bearer {token}"})
|
|
assert response.status_code == 404
|
|
|
|
def test_update_pin(token, user_id):
|
|
image_id = add_test_image(token)
|
|
pin_id = create_test_pin(token, user_id, image_id)
|
|
|
|
# Test mise à jour sans date
|
|
response = client.patch(
|
|
f"/pin/{pin_id}",
|
|
json={
|
|
"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
|
|
},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
get_response = client.get(
|
|
f"/pin/{pin_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
data = get_response.json()
|
|
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
|
|
|
|
# Test mise à jour avec date
|
|
response = client.patch(
|
|
f"/pin/{pin_id}",
|
|
json={
|
|
"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"
|
|
},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
get_response = client.get(
|
|
f"/pin/{pin_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
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):
|
|
response = client.get(f"/pin/randomIdThatDoesntExists", headers={"Authorization": f"Bearer {token}"})
|
|
assert response.status_code == 422
|
|
|
|
def test_update_wrong_unknown_id(token):
|
|
response = client.get(f"/pin/123456789987654321abcdef", headers={"Authorization": f"Bearer {token}"})
|
|
assert response.status_code == 404
|
|
|
|
def test_delete_pin(token, user_id):
|
|
image_id = add_test_image(token)
|
|
pin_id = create_test_pin(token, user_id, image_id)
|
|
|
|
response = client.delete(
|
|
f"/pin/{pin_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
get_response = client.get(
|
|
f"/pin/{pin_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
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"] |