Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit 65a9c09

Browse files
authored
feat: DTOSS-9178 - Add scope to validation errors (#34)
1 parent 2a998d1 commit 65a9c09

File tree

9 files changed

+25
-8
lines changed

9 files changed

+25
-8
lines changed

src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/Validation/MaxLengthValidator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)
2020

2121
yield return new ValidationError
2222
{
23+
Scope = ValidationErrorScope.Record,
2324
RowNumber = fileDataRecord.RowNumber,
2425
Field = fieldName,
2526
Error = error,
@@ -34,6 +35,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)
3435

3536
yield return new ValidationError
3637
{
38+
Scope = ValidationErrorScope.Record,
3739
RowNumber = fileDataRecord.RowNumber,
3840
Field = fieldName,
3941
Error = error,

src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/Validation/NhsNumValidator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ protected override IEnumerable<ValidationError> RunAdditionalChecks(int rowNumbe
1111
{
1212
yield return new ValidationError
1313
{
14+
Scope = ValidationErrorScope.Record,
1415
RowNumber = rowNumber,
1516
Field = FieldName,
1617
Error = "NHS Num has invalid check digit",

src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/Validation/RegexValidator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)
2020
{
2121
yield return new ValidationError
2222
{
23+
Scope = ValidationErrorScope.Record,
2324
RowNumber = fileDataRecord.RowNumber,
2425
Field = FieldName,
2526
Error = $"{FieldName} is missing",
@@ -32,6 +33,7 @@ public IEnumerable<ValidationError> Validate(FileDataRecord fileDataRecord)
3233
{
3334
yield return new ValidationError
3435
{
36+
Scope = ValidationErrorScope.Record,
3537
RowNumber = fileDataRecord.RowNumber,
3638
Field = FieldName,
3739
Error = $"{FieldName} is in an invalid format",

src/ServiceLayer.Mesh/ValidationError.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ public class ValidationError
99
public required string Code { get; set; }
1010

1111
public required string Error { get; set; }
12+
13+
public required ValidationErrorScope Scope { get; set; }
1214
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace ServiceLayer.Mesh;
2+
3+
public enum ValidationErrorScope
4+
{
5+
File,
6+
Record,
7+
Header,
8+
Trailer
9+
}

tests/ServiceLayer.Mesh.Tests/FileTypes/NbssAppointmentEvents/Validation/MaxLengthValidatorTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void Validate_NullValue_ShouldReturnMissingError(bool allowEmpty, string
2727
var errors = validator.Validate(record).ToList();
2828

2929
// Assert
30-
errors.ShouldContainValidationError(FieldName, expectedError, MissingCode, 1);
30+
errors.ShouldContainValidationError(FieldName, expectedError, MissingCode, ValidationErrorScope.Record, 1);
3131
}
3232

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

4848
// Assert
49-
errors.ShouldContainValidationError(FieldName, "TestField is missing or empty", MissingCode, 2);
49+
errors.ShouldContainValidationError(FieldName, "TestField is missing or empty", MissingCode, ValidationErrorScope.Record,2);
5050
}
5151

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

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

9292
[Theory]

tests/ServiceLayer.Mesh.Tests/FileTypes/NbssAppointmentEvents/Validation/RegexValidatorTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void Validate_NullValue_ShouldReturnMissingError()
2727
var errors = validator.Validate(record).ToList();
2828

2929
// Assert
30-
errors.ShouldContainValidationError(FieldName, $"{FieldName} is missing", MissingCode, 1);
30+
errors.ShouldContainValidationError(FieldName, $"{FieldName} is missing", MissingCode, ValidationErrorScope.Record,1);
3131
}
3232

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

5050
// Assert
51-
errors.ShouldContainValidationError(FieldName, $"{FieldName} is in an invalid format", InvalidFormatCode, 2);
51+
errors.ShouldContainValidationError(FieldName, $"{FieldName} is in an invalid format", InvalidFormatCode,ValidationErrorScope.Record, 2);
5252
}
5353

5454
[Theory]

tests/ServiceLayer.Mesh.Tests/FileTypes/NbssAppointmentEvents/Validation/ValidationErrorAssertions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public static void ShouldContainValidationError(
77
string expectedField,
88
string expectedError,
99
string expectedCode,
10+
ValidationErrorScope expectedScope = ValidationErrorScope.Record,
1011
int? expectedRowNumber = null)
1112
{
1213
var error = errors.FirstOrDefault(e =>
@@ -16,7 +17,7 @@ public static void ShouldContainValidationError(
1617
(expectedRowNumber == null || e.RowNumber == expectedRowNumber)
1718
);
1819

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

2122
}
2223
}

tests/ServiceLayer.Mesh.Tests/Functions/FileTransformFunctionTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ public async Task Run_FileHasValidationErrors_ErrorLoggedAndStatusAndValidationE
139139

140140
var validationErrors = new List<ValidationError>
141141
{
142-
new() { Code = "NBSSAPPT001", Error = "error message", Field = "field", RowNumber = 1 },
143-
new() { Code = "NBSSAPPT002", Error = "error message 2", Field = "field 2" }
142+
new() { Scope = ValidationErrorScope.Record, Code = "NBSSAPPT001", Error = "error message", Field = "field", RowNumber = 1 },
143+
new() { Scope = ValidationErrorScope.Header, Code = "NBSSAPPT002", Error = "error message 2", Field = "field 2" }
144144
};
145145

146146
_fileTransformerMock.Setup(c => c.TransformFileAsync(expectedStream, file))

0 commit comments

Comments
 (0)