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.
242 lines
7.6 KiB
242 lines
7.6 KiB
from test_main import *
|
|
from PIL import Image
|
|
import io
|
|
import os
|
|
from bson import ObjectId
|
|
from app.config import UPLOAD_DIR
|
|
|
|
def create_test_image(size=(100, 100)):
|
|
img = Image.new('RGB', size, color='red')
|
|
img_byte_arr = io.BytesIO()
|
|
img.save(img_byte_arr, format='JPEG')
|
|
img_byte_arr.seek(0)
|
|
return img_byte_arr
|
|
|
|
def create_test_pin(token, user_id="682c71ee4b4ac435f3d5af17"):
|
|
pin_response = client.post(
|
|
"/pin/add",
|
|
json={
|
|
"title": "Test Pin",
|
|
"description": "Test Description",
|
|
"location": [0,0],
|
|
"complete_address": "Paris, Île-de-France, France métropolitaine, France",
|
|
"files": [],
|
|
"user_id": user_id
|
|
},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
return pin_response.json()["id"]
|
|
|
|
def add_test_image(token, pin_id="null", caption="Test caption"):
|
|
test_image = create_test_image()
|
|
response = client.post(
|
|
f"/image/pin/{pin_id}/add",
|
|
files={"image": ("test.jpg", test_image, "image/jpeg")},
|
|
data={"exif_date": "2024-03-20T12:00:00", "caption": caption},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
return response.json()["id"]
|
|
|
|
def test_add_image_without_pin(token):
|
|
image_id = add_test_image(token)
|
|
assert image_id is not None
|
|
|
|
def test_add_image_with_pin(token, user_id):
|
|
pin_id = create_test_pin(token, user_id)
|
|
image_id = add_test_image(token, pin_id)
|
|
assert image_id is not None
|
|
|
|
def test_get_image(token):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id)
|
|
|
|
response = client.get(
|
|
f"/image/{image_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
assert response.headers["content-type"] == "image/jpeg"
|
|
|
|
def test_get_image_without_permission(token):
|
|
image_id = add_test_image(token)
|
|
|
|
response = client.get(
|
|
f"/image/{image_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 403
|
|
|
|
def test_get_image_with_wrong_pin_id(token):
|
|
image_id = add_test_image(token)
|
|
|
|
response = client.get(
|
|
f"/image/{image_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 403
|
|
|
|
def test_get_image_wrong_format(token):
|
|
response = client.get(
|
|
"/image/randomIdThatDoesntExists",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 422
|
|
|
|
def test_get_image_unknown_id(token):
|
|
response = client.get(
|
|
"/image/123456789987654321abcdef",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 404
|
|
|
|
def test_delete_image(token):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id)
|
|
|
|
response = client.delete(
|
|
f"/image/{image_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
get_response = client.get(
|
|
f"/image/{image_id}",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert get_response.status_code == 404
|
|
|
|
def test_update_caption(token):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id, "Original caption")
|
|
|
|
response = client.patch(
|
|
f"/image/{image_id}/caption",
|
|
json={"caption": "Updated caption"},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
def test_get_caption_unauthorized(token, token_second):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id)
|
|
|
|
response = client.get(
|
|
f"/image/{image_id}/caption",
|
|
headers={"Authorization": f"Bearer {token_second}"}
|
|
)
|
|
assert response.status_code == 403
|
|
|
|
def test_get_metadata(token):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id)
|
|
|
|
response = client.get(
|
|
f"/image/{image_id}/metadata",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert "metadata" in data
|
|
assert "pin_id" in data
|
|
assert data["pin_id"] == pin_id
|
|
assert data["metadata"]["original_filename"] == "test.jpg"
|
|
assert data["metadata"]["mime_type"] == "image/jpeg"
|
|
|
|
def test_get_metadata_unauthorized(token, token_second):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id)
|
|
|
|
response = client.get(
|
|
f"/image/{image_id}/metadata",
|
|
headers={"Authorization": f"Bearer {token_second}"}
|
|
)
|
|
assert response.status_code == 403
|
|
|
|
def test_image_permissions(token, token_second):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id)
|
|
|
|
response = client.get(
|
|
f"/image/{image_id}",
|
|
headers={"Authorization": f"Bearer {token_second}"}
|
|
)
|
|
assert response.status_code == 403
|
|
|
|
def test_invalid_image_type(token):
|
|
text_file = io.BytesIO(b"Not an image")
|
|
text_file.name = "test.txt"
|
|
|
|
response = client.post(
|
|
"/image/pin/null/add",
|
|
files={"image": ("test.txt", text_file, "text/plain")},
|
|
data={"exif_date": "2024-03-20T12:00:00", "caption": "Test caption"},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 415
|
|
|
|
def test_image_without_exif_date(token):
|
|
# Créer d'abord un pin pour l'image
|
|
pin_id = create_test_pin(token)
|
|
|
|
test_image = create_test_image()
|
|
response = client.post(
|
|
f"/image/pin/{pin_id}/add",
|
|
files={"image": ("test.jpg", test_image, "image/jpeg")},
|
|
data={"caption": "Test caption"},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert response.status_code == 200
|
|
image_id = response.json()["id"]
|
|
|
|
# Vérifier que la date a été générée automatiquement
|
|
metadata_response = client.get(
|
|
f"/image/{image_id}/metadata",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
assert metadata_response.status_code == 200
|
|
data = metadata_response.json()
|
|
assert "created_at" in data["metadata"]
|
|
assert data["metadata"]["created_at"] is not None
|
|
|
|
def test_image_with_invalid_pin_id(token):
|
|
test_image = create_test_image()
|
|
response = client.post(
|
|
"/image/pin/123456789987654321abcdef/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}"}
|
|
)
|
|
assert response.status_code == 404 # Le pin n'existe pas
|
|
|
|
def test_image_too_large(token):
|
|
with open("tests/image-too-large.jpg", "rb") as f:
|
|
buf = io.BytesIO(f.read())
|
|
buf.name = "large.jpg"
|
|
|
|
response = client.post(
|
|
"/image/pin/null/add",
|
|
files={"image": ("large.jpg", buf, "image/jpeg")},
|
|
data={"exif_date": "2024-03-20T12:00:00", "caption": "Test caption"},
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
|
|
assert response.status_code == 413
|
|
|
|
def test_get_image_file_not_found(token):
|
|
pin_id = create_test_pin(token)
|
|
image_id = add_test_image(token, pin_id)
|
|
|
|
image_doc = db["images"].find_one({"_id": ObjectId(image_id)})
|
|
image_hash = image_doc["image_hash"]
|
|
image_path = os.path.join(UPLOAD_DIR, f"{image_hash}.jpg")
|
|
|
|
# On supprime le fichier image physiquement
|
|
if os.path.exists(image_path):
|
|
os.remove(image_path)
|
|
|
|
# On tente de récupérer l'image
|
|
response = client.get(f"/image/{image_id}", headers={"Authorization": f"Bearer {token}"})
|
|
assert response.status_code == 404
|
|
assert response.json()["detail"] == "Image file not found"
|
|
|