From 568c07d172ee0502cdfd4486391b8ee4b310c753 Mon Sep 17 00:00:00 2001
From: Neda Moeini <neda.moeini@geant.org>
Date: Tue, 29 Apr 2025 11:23:38 +0200
Subject: [PATCH] Improve validation error handling for missing nominal
 analysis fields in CSV upload

---
 sage_validation/file_validator/forms.py |  2 ++
 test/test_file_validator/test_forms.py  | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/sage_validation/file_validator/forms.py b/sage_validation/file_validator/forms.py
index 990b83c..040aaf6 100644
--- a/sage_validation/file_validator/forms.py
+++ b/sage_validation/file_validator/forms.py
@@ -245,6 +245,8 @@ class CSVUploadForm(forms.Form):
                 nominal_account_name = row.get(nominal_account_field)
 
                 if not cc or not dep or not nominal_account_name:
+                    errors.append(f"Row {index}: Missing values in '{cc_field}', '{dep_field}', or "
+                                  f"'{nominal_account_field}'.")
                     continue
 
                 cc_type = cost_centre_map.get(cc)
diff --git a/test/test_file_validator/test_forms.py b/test/test_file_validator/test_forms.py
index d329630..0360f71 100644
--- a/test/test_file_validator/test_forms.py
+++ b/test/test_file_validator/test_forms.py
@@ -93,6 +93,24 @@ def test_validate_nc_cc_dep_combination_against_meo_sage_account(
             in str(form.errors["file"][0]))
 
 
+def test_validate_nc_cc_dep_combination_against_meo_sage_account_blank_values(
+        sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock
+) -> None:
+    """Test validation for nominal analysis fields against MEO valid Sage accounts."""
+    modified_file = create_modified_csv(
+        sample_input_file,
+        {
+            "NominalAnalysisNominalCostCentre/1": "",
+        })
+
+    form = CSVUploadForm(files={"file": modified_file})
+    assert not form.is_valid()
+    assert (
+            "Row 1: Missing values in 'NominalAnalysisNominalCostCentre/1', 'NominalAnalysisNominalDepartment/1',"
+            " or 'NominalAnalysisNominalAccountNumber/1'."
+            in str(form.errors["file"][0])
+    )
+
 def test_cheque_fields_must_be_empty(sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock) -> None:
     """Test that cheque fields must be empty."""
     modified_file = create_modified_csv(sample_input_file,
-- 
GitLab