Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)

yield return new ValidationError
{
Scope = ValidationErrorScope.Record,
RowNumber = fileDataRecord.RowNumber,
Field = fieldName,
Error = error,
Expand All @@ -34,6 +35,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)

yield return new ValidationError
{
Scope = ValidationErrorScope.Record,
RowNumber = fileDataRecord.RowNumber,
Field = fieldName,
Error = error,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ protected override IEnumerable<ValidationError> RunAdditionalChecks(int rowNumbe
{
yield return new ValidationError
{
Scope = ValidationErrorScope.Record,
RowNumber = rowNumber,
Field = FieldName,
Error = "NHS Num has invalid check digit",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)
{
yield return new ValidationError
{
Scope = ValidationErrorScope.Record,
RowNumber = fileDataRecord.RowNumber,
Field = FieldName,
Error = $"{FieldName} is missing",
Expand All @@ -32,6 +33,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)
{
yield return new ValidationError
{
Scope = ValidationErrorScope.Record,
RowNumber = fileDataRecord.RowNumber,
Field = FieldName,
Error = $"{FieldName} is in an invalid format",
Expand Down
2 changes: 2 additions & 0 deletions src/ServiceLayer.Mesh/ValidationError.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ public class ValidationError
public required string Code { get; set; }

public required string Error { get; set; }

public required ValidationErrorScope Scope { get; set; }
}
9 changes: 9 additions & 0 deletions src/ServiceLayer.Mesh/ValidationErrorScope.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace ServiceLayer.Mesh;

public enum ValidationErrorScope
{
File,
Record,
Header,
Trailer
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public void Validate_NullValue_ShouldReturnMissingError(bool allowEmpty, string
var errors = validator.Validate(record).ToList();

// Assert
errors.ShouldContainValidationError(FieldName, expectedError, MissingCode, 1);
errors.ShouldContainValidationError(FieldName, expectedError, MissingCode, ValidationErrorScope.Record, 1);
}

[Fact]
Expand All @@ -46,7 +46,7 @@ public void Validate_EmptyValueDisallowed_ShouldReturnMissingError()
var errors = validator.Validate(record).ToList();

// Assert
errors.ShouldContainValidationError(FieldName, "TestField is missing or empty", MissingCode, 2);
errors.ShouldContainValidationError(FieldName, "TestField is missing or empty", MissingCode, ValidationErrorScope.Record,2);
}

[Fact]
Expand Down Expand Up @@ -86,7 +86,7 @@ public void Validate_ValueExceedingMaxLength_ShouldReturnTooLongError(int maxLen
var errors = validator.Validate(record).ToList();

// Assert
errors.ShouldContainValidationError(FieldName, $"TestField exceeds maximum length of {maxLength}", TooLongCode, 4);
errors.ShouldContainValidationError(FieldName, $"TestField exceeds maximum length of {maxLength}", TooLongCode, ValidationErrorScope.Record,4);
}

[Theory]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public void Validate_NullValue_ShouldReturnMissingError()
var errors = validator.Validate(record).ToList();

// Assert
errors.ShouldContainValidationError(FieldName, $"{FieldName} is missing", MissingCode, 1);
errors.ShouldContainValidationError(FieldName, $"{FieldName} is missing", MissingCode, ValidationErrorScope.Record,1);
}

[Theory]
Expand All @@ -48,7 +48,7 @@ public void Validate_ValueNotMatchingPattern_ShouldReturnInvalidFormatError(stri
var errors = validator.Validate(record).ToList();

// Assert
errors.ShouldContainValidationError(FieldName, $"{FieldName} is in an invalid format", InvalidFormatCode, 2);
errors.ShouldContainValidationError(FieldName, $"{FieldName} is in an invalid format", InvalidFormatCode,ValidationErrorScope.Record, 2);
}

[Theory]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public static void ShouldContainValidationError(
string expectedField,
string expectedError,
string expectedCode,
ValidationErrorScope expectedScope = ValidationErrorScope.Record,
int? expectedRowNumber = null)
{
var error = errors.FirstOrDefault(e =>
Expand All @@ -16,7 +17,7 @@ public static void ShouldContainValidationError(
(expectedRowNumber == null || e.RowNumber == expectedRowNumber)
);

Assert.True(error != null, $"Expected validation error with Field: '{expectedField}', Error: '{expectedError}', Code: '{expectedCode}'{(expectedRowNumber != null ? $", RowNumber: {expectedRowNumber}" : "")}, but none was found.");
Assert.True(error != null, $"Expected validation error with Scope: '{expectedScope}', Field: '{expectedField}', Error: '{expectedError}', Code: '{expectedCode}'{(expectedRowNumber != null ? $", RowNumber: {expectedRowNumber}" : "")}, but none was found.");

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,8 @@ public async Task Run_FileHasValidationErrors_ErrorLoggedAndStatusAndValidationE

var validationErrors = new List<ValidationError>
{
new() { Code = "NBSSAPPT001", Error = "error message", Field = "field", RowNumber = 1 },
new() { Code = "NBSSAPPT002", Error = "error message 2", Field = "field 2" }
new() { Scope = ValidationErrorScope.Record, Code = "NBSSAPPT001", Error = "error message", Field = "field", RowNumber = 1 },
new() { Scope = ValidationErrorScope.Header, Code = "NBSSAPPT002", Error = "error message 2", Field = "field 2" }
};

_fileTransformerMock.Setup(c => c.TransformFileAsync(expectedStream, file))
Expand Down
Loading