diff --git a/backend/Dockerfile b/backend/Dockerfile index 21b9213ed671a9716738a41adb717dccc49e3846..af4eb8b554f5338e1b7f7fca7fc6a9a7598ea9c1 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -10,11 +10,14 @@ RUN apt-get update && apt-get install -y docker.io # Copier les fichiers nécessaires COPY requirements.txt . -# Installer les dépendances +# Installer les dépendances et ajouter pytest RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir pytest -# Copier le reste du code -COPY . . +# Copier le reste du code (y compris les tests) +COPY . /app + +RUN ls -l /app # Exposer le port sur lequel Flask écoute EXPOSE 5000 diff --git a/backend/test_app.py b/backend/test_app.py new file mode 100644 index 0000000000000000000000000000000000000000..a5ba063eb3e393609183c3e1018e9fcf7616c569 --- /dev/null +++ b/backend/test_app.py @@ -0,0 +1,78 @@ +import pytest +import json +from unittest.mock import patch, MagicMock +from app import app + +@pytest.fixture +def client(): + app.config["TESTING"] = True + with app.test_client() as client: + yield client + +def test_health(client): + response = client.get("/health") + assert response.status_code == 200 + assert response.json == {"status": "ok"} + +@patch("app.redis_client.get") +def test_get_request_count(mock_redis_get, client): + mock_redis_get.return_value = "5" + response = client.get("/request_count") + assert response.status_code == 200 + assert response.json == {"status": "success", "data": {"request_received_count": 5}, "errors": None} + +@patch("app.redis_client.exists") +@patch("app.redis_client.get") +def test_bruteforce_cached(mock_redis_get, mock_redis_exists, client): + mock_redis_exists.return_value = True + mock_redis_get.return_value = "password123" + data = json.dumps({"hash": "5f4dcc3b5aa765d61d8327deb882cf99"}) + response = client.post("/bruteforce", data=data, content_type="application/json") + + assert response.status_code == 200 + assert response.json == { + "status": "success", + "data": {"hash": "5f4dcc3b5aa765d61d8327deb882cf99", "original": "password123"}, + "errors": None + } + +@patch("app.redis_client.keys") +@patch("app.redis_client.get") +def test_get_resolved_hashes(mock_redis_get, mock_redis_keys, client): + mock_redis_keys.return_value = ["hash1", "hash2"] + mock_redis_get.side_effect = lambda key: f"original_{key}" + + response = client.get("/resolved") + + assert response.status_code == 200 + assert response.json == { + "status": "success", + "data": {"hash1": "original_hash1", "hash2": "original_hash2"}, + "errors": None + } + +@patch("app.redis_client.exists") +@patch("app.redis_client.get") +def test_get_resolved_hash(mock_redis_get, mock_redis_exists, client): + mock_redis_exists.return_value = True + mock_redis_get.return_value = "password123" + response = client.get("/resolved/5f4dcc3b5aa765d61d8327deb882cf99") + + assert response.status_code == 200 + assert response.json == { + "status": "success", + "data": {"hash": "5f4dcc3b5aa765d61d8327deb882cf99", "original": "password123"}, + "errors": None + } + +@patch("app.redis_client.exists") +def test_get_resolved_hash_not_found(mock_redis_exists, client): + mock_redis_exists.return_value = False + response = client.get("/resolved/nonexistent_hash") + + assert response.status_code == 404 + assert response.json == { + "status": "fail", + "data": None, + "errors": {"message": "No resolved entry found for hash: nonexistent_hash"} + }