From cdbcc75afbafd4258a7c56ec63559a287c6106bd Mon Sep 17 00:00:00 2001
From: Neda Moeini <neda.moeini@geant.org>
Date: Fri, 28 Feb 2025 13:07:28 +0100
Subject: [PATCH] Add more tests for endpoints

---
 sage_validation/settings.py                   |  2 +-
 test/conftest.py                              |  6 +++
 .../test_file_validator_endpoints.py          | 52 +++++++++++++++++++
 3 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 test/test_file_validator/test_file_validator_endpoints.py

diff --git a/sage_validation/settings.py b/sage_validation/settings.py
index 1a00d60..353594e 100644
--- a/sage_validation/settings.py
+++ b/sage_validation/settings.py
@@ -18,7 +18,7 @@ BASE_DIR = Path(__file__).resolve().parent
 # See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/
 
 # SECURITY WARNING: keep the secret key used in production secret!
-SECRET_KEY = os.getenv("SECRET_KEY")
+SECRET_KEY = os.getenv("SECRET_KEY", "test-secret-key")
 
 # SECURITY WARNING: don't run with debug turned on in production!
 DEBUG = True
diff --git a/test/conftest.py b/test/conftest.py
index f91236c..f32a594 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -4,6 +4,7 @@ from unittest.mock import MagicMock
 import pytest
 from django.core.files.uploadedfile import SimpleUploadedFile
 from faker import Faker
+from rest_framework.test import APIClient
 
 from sage_validation.file_validator.models import MeoCostCentres, MeoValidSuppliers, XxData
 
@@ -139,3 +140,8 @@ def mock_meo_database(mocker: MagicMock)-> None:
     nominal_mock.filter.return_value.exists.return_value = True
     mocker.patch("sage_validation.file_validator.models.MeoNominal.objects.using", return_value=nominal_mock)
 
+
+@pytest.fixture
+def api_client() -> APIClient:
+    """Fixture to return Django API test client."""
+    return APIClient()
diff --git a/test/test_file_validator/test_file_validator_endpoints.py b/test/test_file_validator/test_file_validator_endpoints.py
new file mode 100644
index 0000000..3193a62
--- /dev/null
+++ b/test/test_file_validator/test_file_validator_endpoints.py
@@ -0,0 +1,52 @@
+from unittest.mock import MagicMock
+
+import pytest
+from django.core.files.uploadedfile import SimpleUploadedFile
+from django.urls.base import reverse
+from rest_framework.test import APIClient
+
+UPLOAD_FILE_URL = reverse("upload-file")
+
+
+@pytest.mark.django_db
+def test_csv_upload_valid(
+        api_client: APIClient, sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock
+) -> None:
+    """Test that a valid CSV upload succeeds."""
+    response = api_client.post(UPLOAD_FILE_URL, {"file": sample_input_file}, format="multipart")
+
+    assert response.status_code == 200
+    assert response.json()["status"] == "success"
+    assert "download_url" in response.json()
+
+
+@pytest.mark.django_db
+def test_csv_upload_invalid_extension(api_client: APIClient) -> None:
+    """Test that uploading a non-CSV file fails."""
+    bad_file = SimpleUploadedFile("test.txt", b"Invalid content", content_type="text/plain")
+
+    response = api_client.post(UPLOAD_FILE_URL, {"file": bad_file}, format="multipart")
+
+    assert response.status_code == 400
+    assert response.json()["status"] == "error"
+    assert "errors" in response.json()
+
+
+@pytest.mark.django_db
+def test_csv_export_with_data(api_client: APIClient) -> None:
+    """Test exporting a processed CSV file."""
+    url = reverse("export-file")
+
+    # Simulate session data
+    session = api_client.session
+    session["validated_csv"] = [
+        {"AccountNumber": "12345", "TransactionDate": "01/03/2024", "NominalAnalysisNominalAccountNumber/1": "N100"}
+    ]
+    session.save()
+
+    response = api_client.get(url)
+
+    assert response.status_code == 200
+    assert response["Content-Disposition"] == 'attachment; filename="updated_file.csv"'
+    assert b"AccountNumber,TransactionDate,NominalAnalysisNominalAccountNumber/1" in response.content
+    assert b"12345,01/03/2024,N100" in response.content
-- 
GitLab