diff --git a/test/conftest.py b/test/conftest.py index 1d75fae72ef188e045214a71f681f02d917eac19..dc7f3aa4a423806a25ae95eeada29c21c318d9c8 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -99,7 +99,7 @@ def mock_meo_database(mocker): supplier_mock = MagicMock() supplier_mock.all.return_value = [ MeoValidSuppliers(supplier_account_number=str(fake.random_int(min=10000, max=99999)), supplier_account_name=fake.company()), - MeoValidSuppliers(supplier_account_number="12345", supplier_account_name=fake.company()) + MeoValidSuppliers(supplier_account_number="12345", supplier_account_name="Sample Narrative") ] mocker.patch("sage_validation.file_validator.models.MeoValidSuppliers.objects.using", return_value=supplier_mock) diff --git a/test/test_file_validator/__init__.py b/test/test_file_validator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/test_file_validator/test_forms.py b/test/test_file_validator/test_forms.py new file mode 100644 index 0000000000000000000000000000000000000000..db0a25a338ea8030bd3876a82174da47569446aa --- /dev/null +++ b/test/test_file_validator/test_forms.py @@ -0,0 +1,52 @@ +import csv +import io + +from django.core.files.uploadedfile import SimpleUploadedFile + +from sage_validation.file_validator.forms import CSVUploadForm + + +def test_valid_csv_upload(sample_input_file, mock_meo_database): + """Test CSV upload with valid data.""" + form = CSVUploadForm(files={"file": sample_input_file}) + assert form.is_valid(), f"Form errors: {form.errors}" + + +def test_invalid_file_extension(): + """Test form rejects non-CSV files.""" + bad_file = SimpleUploadedFile("test.txt", b"Some text content", content_type="text/plain") + form = CSVUploadForm(files={"file": bad_file}) + assert not form.is_valid() + assert "File must be in CSV format." in form.errors["file"] + + +def test_missing_required_columns(): + """Test form rejects CSV missing required headers.""" + invalid_csv = SimpleUploadedFile("test.csv", b"AccountNumber,CBAccountNumber\n12345,54321", content_type="text/csv") + form = CSVUploadForm(files={"file": invalid_csv}) + assert not form.is_valid() + assert "Missing required columns" in str(form.errors) + + +def test_source_and_trader_type_validation(sample_input_file, mock_meo_database): + """Test validation for Source and SYSTraderTranType columns.""" + + csv_content = sample_input_file.read().decode("utf-8").splitlines() + reader = csv.DictReader(csv_content) + rows = list(reader) + + # Modify the first row's "Source" and "SYSTraderTranType" values + rows[0]["Source"] = "90" # Change Source from 80 to 90 + rows[0]["SYSTraderTranType"] = "5" # Change SYSTraderTranType from 4 to 5 + + # Rebuild the CSV with modified values + output = io.StringIO() + writer = csv.DictWriter(output, fieldnames=reader.fieldnames) + writer.writeheader() + writer.writerows(rows) + modified_file = SimpleUploadedFile("test_modified.csv", output.getvalue().encode("utf-8"), content_type="text/csv") + + form = CSVUploadForm(files={"file": modified_file}) + assert not form.is_valid(), "Form should be invalid due to incorrect Source and SYSTraderTranType values" + assert "Row 1: 'Source' must be 80" in form.errors["file"][0] + assert "Row 1: 'SYSTraderTranType' must be 4" in form.errors["file"][1]