Skip to content
Snippets Groups Projects
Commit e9504346 authored by Neda Moeini's avatar Neda Moeini
Browse files

Improve the tests by using a helper function for modifying the input file and...

Improve the tests by using a helper function for modifying the input file and removed the redundant code
parent e2033a5c
No related branches found
No related tags found
1 merge request!2Feature/unit test for validations
...@@ -38,7 +38,7 @@ line-length = 120 ...@@ -38,7 +38,7 @@ line-length = 120
ban-relative-imports = "all" ban-relative-imports = "all"
[tool.ruff.lint.per-file-ignores] [tool.ruff.lint.per-file-ignores]
"test/*" = ["S101", "ARG001",] "test/*" = ["ARG001", "D", "S101", "PLR2004", "PLR0917", "PLR0914", "PLC0415", "PLC2701"]
[tool.pytest.ini_options] [tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "test.settings" DJANGO_SETTINGS_MODULE = "test.settings"
......
...@@ -9,7 +9,7 @@ from sage_validation.file_validator.models import MeoCostCentres, MeoValidSuppli ...@@ -9,7 +9,7 @@ from sage_validation.file_validator.models import MeoCostCentres, MeoValidSuppli
@pytest.fixture @pytest.fixture
def sample_input_file(): def sample_input_file() -> SimpleUploadedFile:
"""Create a sample valid CSV file for testing.""" """Create a sample valid CSV file for testing."""
csv_headers_list = [ csv_headers_list = [
"AccountNumber", "AccountNumber",
...@@ -96,7 +96,7 @@ def sample_input_file(): ...@@ -96,7 +96,7 @@ def sample_input_file():
return SimpleUploadedFile("test.csv", f"{csv_headers}\n{csv_content}".encode(), content_type="text/csv") return SimpleUploadedFile("test.csv", f"{csv_headers}\n{csv_content}".encode(), content_type="text/csv")
@pytest.fixture @pytest.fixture
def mock_meo_database(mocker): def mock_meo_database(mocker: MagicMock)-> None:
"""Mock the meo database since it's read-only.""" """Mock the meo database since it's read-only."""
fake = Faker() fake = Faker()
......
"""Tests for the file_validator forms.""" """Tests for the file_validator forms."""
import csv import csv
import io import io
from unittest.mock import MagicMock
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from sage_validation.file_validator.forms import CSVUploadForm from sage_validation.file_validator.forms import CSVUploadForm
def test_valid_csv_upload(sample_input_file, mock_meo_database): def create_modified_csv(sample_file: SimpleUploadedFile, modifications: dict[str, str]) -> SimpleUploadedFile:
"""
Modify specific fields in the first row of a CSV file and return a new SimpleUploadedFile.
Args:
sample_file (SimpleUploadedFile): The original CSV file.
modifications (dict): Dictionary of column names to modified values.
Returns:
SimpleUploadedFile: The modified CSV file.
"""
csv_content = sample_file.read().decode("utf-8").splitlines()
reader = csv.DictReader(csv_content)
rows = list(reader)
for key, value in modifications.items():
rows[0][key] = value
output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=reader.fieldnames or [])
writer.writeheader()
writer.writerows(rows)
return SimpleUploadedFile("test_modified.csv", output.getvalue().encode("utf-8"), content_type="text/csv")
def test_valid_csv_upload(sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock) -> None:
"""Test CSV upload with valid data.""" """Test CSV upload with valid data."""
form = CSVUploadForm(files={"file": sample_input_file}) form = CSVUploadForm(files={"file": sample_input_file})
assert form.is_valid(), f"Form errors: {form.errors}" assert form.is_valid(), f"Form errors: {form.errors}"
def test_invalid_file_extension(): def test_invalid_file_extension() -> None:
"""Test form rejects non-CSV files.""" """Test form rejects non-CSV files."""
bad_file = SimpleUploadedFile("test.txt", b"Some text content", content_type="text/plain") bad_file = SimpleUploadedFile("test.txt", b"Some text content", content_type="text/plain")
form = CSVUploadForm(files={"file": bad_file}) form = CSVUploadForm(files={"file": bad_file})
...@@ -21,7 +48,7 @@ def test_invalid_file_extension(): ...@@ -21,7 +48,7 @@ def test_invalid_file_extension():
assert "File must be in CSV format." in form.errors["file"] assert "File must be in CSV format." in form.errors["file"]
def test_missing_required_columns(): def test_missing_required_columns() -> None:
"""Test form rejects CSV missing required headers.""" """Test form rejects CSV missing required headers."""
invalid_csv = SimpleUploadedFile("test.csv", b"AccountNumber,CBAccountNumber\n12345,54321", content_type="text/csv") invalid_csv = SimpleUploadedFile("test.csv", b"AccountNumber,CBAccountNumber\n12345,54321", content_type="text/csv")
form = CSVUploadForm(files={"file": invalid_csv}) form = CSVUploadForm(files={"file": invalid_csv})
...@@ -29,43 +56,19 @@ def test_missing_required_columns(): ...@@ -29,43 +56,19 @@ def test_missing_required_columns():
assert "Missing required columns" in str(form.errors) assert "Missing required columns" in str(form.errors)
def test_source_and_trader_type_validation(sample_input_file, mock_meo_database): def test_source_and_trader_type_validation(sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock) -> None:
"""Test validation for Source and SYSTraderTranType columns.""" """Test validation for Source and SYSTraderTranType columns."""
csv_content = sample_input_file.read().decode("utf-8").splitlines() modified_file = create_modified_csv(sample_input_file, {"Source": "90", "SYSTraderTranType": "5"})
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}) form = CSVUploadForm(files={"file": modified_file})
assert not form.is_valid() assert not form.is_valid()
assert "Row 1: 'Source' must be 80" in form.errors["file"][0] assert "Row 1: 'Source' must be 80" in form.errors["file"][0]
assert "Row 1: 'SYSTraderTranType' must be 4" in form.errors["file"][1] assert "Row 1: 'SYSTraderTranType' must be 4" in form.errors["file"][1]
def test_validate_nominal_analysis_account(sample_input_file, mock_meo_database): def test_validate_nominal_analysis_account(sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock) -> None:
"""Test validation for nominal analysis account.""" """Test validation for nominal analysis account."""
csv_content = sample_input_file.read().decode("utf-8").splitlines() modified_file = create_modified_csv(sample_input_file,
reader = csv.DictReader(csv_content) {"NominalAnalysisNominalAnalysisNarrative/1": "Invalid Name"})
rows = list(reader)
rows[0]["NominalAnalysisNominalAnalysisNarrative/1"] = "Invalid Name"
# 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}) form = CSVUploadForm(files={"file": modified_file})
assert not form.is_valid() assert not form.is_valid()
assert form.errors["file"][0] == ( assert form.errors["file"][0] == (
...@@ -73,20 +76,16 @@ def test_validate_nominal_analysis_account(sample_input_file, mock_meo_database) ...@@ -73,20 +76,16 @@ def test_validate_nominal_analysis_account(sample_input_file, mock_meo_database)
", but found 'Invalid Name'.") ", but found 'Invalid Name'.")
def test_validate_nc_cc_dep_combination_against_meo_sage_account(sample_input_file, mock_meo_database): def test_validate_nc_cc_dep_combination_against_meo_sage_account(
sample_input_file: SimpleUploadedFile, mock_meo_database: MagicMock
) -> None:
"""Test validation for nominal analysis fields against MEO valid Sage accounts.""" """Test validation for nominal analysis fields against MEO valid Sage accounts."""
csv_content = sample_input_file.read().decode("utf-8").splitlines() modified_file = create_modified_csv(
reader = csv.DictReader(csv_content) sample_input_file,
rows = list(reader) {
"NominalAnalysisNominalCostCentre/1": "Invalid_CC",
rows[0]["NominalAnalysisNominalCostCentre/1"] = "Invalid_CC" "NominalAnalysisNominalAccountNumber/1": "Invalid_Account"
rows[0]["NominalAnalysisNominalAccountNumber/1"] = "Invalid_Account" })
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}) form = CSVUploadForm(files={"file": modified_file})
assert not form.is_valid() assert not form.is_valid()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment