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]