Skip to content
Open
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
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ To configure the verification a JSON file is used with the following format:
"1": {
"name": "ID",
"isRequired": true,
"unique": true
"unique": true,
"trim": true
},
"2": {
"name": "DOB",
Expand All @@ -54,6 +55,8 @@ The columns __require__ the number, which is the ordinal of the column in the in

```
{
// trim value before checking
"trim": true|false,
// validates the column has content
"isRequired": true|false,
// validates the content is unique in this column across the full file
Expand Down
2 changes: 2 additions & 0 deletions src/Validate.Lib/ColumnValidatorConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@ public class ColumnValidatorConfiguration
public bool IsNumeric { get; set; }

public bool IsRequired { get; set; }

public bool Trim { get; set; }
}
}
1 change: 1 addition & 0 deletions src/Validate.Lib/ConfigurationConvertor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ private void ConvertColumns()
if (!string.IsNullOrWhiteSpace(columnConfig.Value.Pattern)) group.Add(new TextFormatValidator(columnConfig.Value.Pattern));
if (columnConfig.Value.IsNumeric) group.Add(new NumberValidator());
if (columnConfig.Value.IsRequired) group.Add(new NotNullableValidator());
if (columnConfig.Value.Trim) _converted.TrimBeforeCheck.Add(columnConfig.Key);

_converted.Columns.Add(columnConfig.Key, group);
}
Expand Down
3 changes: 3 additions & 0 deletions src/Validate.Lib/ConvertedValidators.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ internal class ConvertedValidators
public ConvertedValidators()
{
Columns = new Dictionary<int, List<IValidator>>();
TrimBeforeCheck = new List<int>();
}

public Dictionary<int, List<IValidator>> Columns { get; private set; }

public List<int> TrimBeforeCheck { get; private set; }

public string RowSeperator { get; set; }

public string ColumnSeperator { get; set; }
Expand Down
6 changes: 5 additions & 1 deletion src/Validate.Lib/Validator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,11 @@ private void TransferConvertedColumns(ConvertedValidators converted)
{
foreach (IValidator columnValidator in column.Value)
{
_rowValidator.AddColumnValidator(column.Key, columnValidator);
_rowValidator.AddColumnValidator(
column.Key,
columnValidator,
converted.TrimBeforeCheck.Contains(column.Key)
);
}
}
}
Expand Down
20 changes: 16 additions & 4 deletions src/Validate.Lib/Validators/RowValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ namespace FormatValidator.Validators
internal class RowValidator
{
private ValidatorGroup[] _columns;
private List<int> _trimBeforeCheck;
private RowValidationError _errorInformation;
private string _columnSeperator;

public RowValidator()
{
_errorInformation = new RowValidationError();
_columns = new ValidatorGroup[0];
_trimBeforeCheck = new List<int>();
}

public RowValidator(string columnSeperator) : this()
Expand All @@ -42,7 +44,13 @@ public bool IsValid(string toCheck)
{
if (currentColumn < _columns.Length)
{
bool result = _columns[currentColumn].IsValid(parts[currentColumn]);
string value = parts[currentColumn];
if (_trimBeforeCheck.Contains(currentColumn))
{
value = value.Trim();
}

bool result = _columns[currentColumn].IsValid(value);

IList<ValidationError> newErrors = _columns[currentColumn].GetErrors();
_errorInformation.Errors.AddRange(newErrors);
Expand Down Expand Up @@ -78,11 +86,15 @@ public void ClearErrors()
}
}

public void AddColumnValidator(int toColumn, IValidator validator)
public void AddColumnValidator(int toColumn, IValidator validator, bool trim = false)
{
CheckAndResizeColumnList(toColumn);

_columns[toColumn - 1].Add(validator);
int index = toColumn - 1;
_columns[index].Add(validator);
if (trim)
{
_trimBeforeCheck.Add(index);
}
}

public List<ValidatorGroup> GetColumnValidators()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,17 @@
},
"2": {
"name": "NAME",
"maxLength": 10
"maxLength": 10,
"trim": true
},
"3": {
"name": "DOB",
"pattern": "^\\d\\d\\d\\d-\\d\\d-\\d\\d$"
},
"4": {
"name": "USERNAME",
"isRequired": true
"isRequired": true,
"trim": true
}
}
}
4 changes: 2 additions & 2 deletions test/ValidateTests/Data/headers-testfile-1.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
ID,NAME,DOB,USERNAME,NOTES
1,Job Bloggs,1999-04-23,job-bloggs,
2,Terrance Bloggs,17/02/94,,
1,Job Bloggs ,1999-04-23,job-bloggs,
2,Terrance Bloggs,17/02/94, ,
2,Terrance Bloggs,1994-02-17,terrance-bloggs,notes
3,Henry Bloggs,,henry-bloggs,
24 changes: 15 additions & 9 deletions test/ValidateTests/Unit/RowValidatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,32 +183,36 @@ public void RowValidator_WhenValidatingMultipleRowsAndUnique_ErrorsDontStackUp()
[TestMethod]
public void RowValidator_WhenDataIsInvalid_PositionOfErrorIsProvided()
{
const string ROW = @"nine,12/09/1999,,far too long";
const string ROW = @"nine,12/09/1999,,far too long, ";
const int ERROR_ONE = 1;
const int ERROR_TWO = 6;
const int ERROR_THREE = 17;
const int ERROR_FOUR = 18;
const int ERROR_FOUR = 18;
const int ERROR_FIVE = 31;

RowValidationError error = null;
RowValidationError error = null;

_validator.AddColumnValidator(1, new NumberValidator());
_validator.AddColumnValidator(2, new TextFormatValidator(@"^\d\d\d\d-\d\d-\d\d$"));
_validator.AddColumnValidator(3, new NotNullableValidator());
_validator.AddColumnValidator(4, new StringLengthValidator(6));
_validator.AddColumnValidator(5, new NotNullableValidator(), trim: true);

_validator.IsValid(ROW);
_validator.IsValid(ROW);
error = _validator.GetError();

Assert.AreEqual(ERROR_ONE, error.Errors[0].AtCharacter);
Assert.AreEqual(ERROR_TWO, error.Errors[1].AtCharacter);
Assert.AreEqual(ERROR_THREE, error.Errors[2].AtCharacter);
Assert.AreEqual(ERROR_FOUR, error.Errors[3].AtCharacter);
}
Assert.AreEqual(ERROR_FOUR, error.Errors[3].AtCharacter);
Assert.AreEqual(ERROR_FIVE, error.Errors[4].AtCharacter);
}

[TestMethod]
public void RowValidator_WhenDataIsInvalid_ColumnNumbersAreProvided()
{
const string ROW = @"nine,12/09/1999,,far too long";
const string ROW = @"nine,12/09/1999,,far too long, short enough ";
const int ERROR_COUNT = 4;
const int ERROR_ONE = 1;
const int ERROR_TWO = 2;
const int ERROR_THREE = 3;
Expand All @@ -219,11 +223,13 @@ public void RowValidator_WhenDataIsInvalid_ColumnNumbersAreProvided()
_validator.AddColumnValidator(1, new NumberValidator());
_validator.AddColumnValidator(2, new TextFormatValidator(@"^\d\d\d\d-\d\d-\d\d$"));
_validator.AddColumnValidator(3, new NotNullableValidator());
_validator.AddColumnValidator(4, new StringLengthValidator(6));
_validator.AddColumnValidator(4, new StringLengthValidator(6));
_validator.AddColumnValidator(5, new StringLengthValidator(12), trim: true);

_validator.IsValid(ROW);
_validator.IsValid(ROW);
error = _validator.GetError();

Assert.AreEqual(ERROR_COUNT, error.Errors.Count);
Assert.AreEqual(ERROR_ONE, error.Errors[0].Column);
Assert.AreEqual(ERROR_TWO, error.Errors[1].Column);
Assert.AreEqual(ERROR_THREE, error.Errors[2].Column);
Expand Down