Skip to content

Commit 9dace59

Browse files
committed
Refactored and added a new test case
1 parent 1394e5a commit 9dace59

File tree

5 files changed

+49
-68
lines changed

5 files changed

+49
-68
lines changed

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/AllErrorsMetaDataValidator.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ trait AllErrorsMetaDataValidator extends MetaDataValidator {
5555
def isOptionDirective: Boolean = columnDefinition.directives.contains(Optional())
5656

5757
if(row.cells(columnIndex).value.trim.isEmpty && isOptionDirective) true.successNel
58-
else columnDefinition.rules.map(_.evaluate(columnIndex, row, schema, mayBeLast)).map{ ruleResult:Rule#RuleValidation[Any] => {
58+
else columnDefinition.rules.map{rule =>
59+
rule.evaluate(columnIndex, row, schema, mayBeLast)
60+
}.map{ ruleResult:Rule#RuleValidation[Any] => {
5961
if(isWarningDirective) toWarnings(ruleResult, row.lineNumber, columnIndex) else toErrors(ruleResult, row.lineNumber, columnIndex)
6062
}}.sequence[MetaDataValidation, Any]
6163
}

csv-validator-core/src/main/scala/uk/gov/nationalarchives/csv/validator/schema/v1_0/SchemaValidator.scala

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -219,19 +219,16 @@ class SchemaValidator {
219219

220220
protected def explicitColumnValid(columnDefinitions: List[ColumnDefinition]): Option[String] = {
221221

222-
def invalidColumnNames(rule: Rule) = explicitColumnCheck(rule) match {
223-
case Some(x) => x
224-
case None => List.empty[ColumnIdentifier]
225-
}
226-
227-
def checkAlternativeOption(rules: Option[List[Rule]]): Option[List[ColumnIdentifier]] = rules match {
228-
case Some(rulesList) => Some(rulesList.foldLeft(List.empty[ColumnIdentifier]) {
229-
case (list, rule: Rule) => list ++ invalidColumnNames(rule)
230-
})
222+
def invalidColumnNames(rule: Rule) = explicitColumnCheck(rule).getOrElse(List.empty[ColumnIdentifier])
231223

232-
case None => None
224+
def checkAlternativeOption(rules: Option[List[Rule]]): Option[List[ColumnIdentifier]] = {
225+
rules.map{ _.foldLeft(List.empty[ColumnIdentifier]) {
226+
case (list, rule: Rule) => list ++ invalidColumnNames(rule)
227+
}
228+
}
233229
}
234230

231+
235232
def explicitColumnCheck(rule: Rule): Option[List[ColumnIdentifier]] = rule match {
236233
case IfRule(c, t, f) =>
237234
val cond = explicitColumnCheck(c)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
c1,c2,c3,c4
2+
aaa,cell1-2,bbb,cell1-4
3+
cell2-1,,bbb,cell2-4
4+
cell3-1,,cell3-3,
5+
aaa,cell4-2,cell4-3,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
version 1.0
2+
@totalColumns 4
3+
c1: if($c2/notEmpty, is("aaa"))
4+
c2:
5+
c3: if($c4/notEmpty, is("bbb"))
6+
c4:

csv-validator-core/src/test/scala/uk/gov/nationalarchives/csv/validator/MetaDataValidatorAcceptanceSpec.scala

Lines changed: 28 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -48,50 +48,36 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
4848

4949
"@separator global directive" should {
5050
"succeed for '$' separator" in {
51-
validate(TextFile(Path.fromString(base) / "separated1.dsv"), parse(base + "/separated1.csvs"), None) must beLike {
52-
case Success(_) => ok
53-
}
51+
validate(TextFile(Path.fromString(base) / "separated1.dsv"), parse(base + "/separated1.csvs"), None).isSuccess mustEqual true
5452
}
5553

5654
"succeed for TAB separator" in {
57-
validate(TextFile(Path.fromString(base) / "separated2.tsv"), parse(base + "/separated2.csvs"), None) must beLike {
58-
case Success(_) => ok
59-
}
55+
validate(TextFile(Path.fromString(base) / "separated2.tsv"), parse(base + "/separated2.csvs"), None).isSuccess mustEqual true
6056
}
6157

6258
"succeed for '\t' separator" in {
63-
validate(TextFile(Path.fromString(base) / "separated2.tsv"), parse(base + "/separated2-1.csvs"), None) must beLike {
64-
case Success(_) => ok
65-
}
59+
validate(TextFile(Path.fromString(base) / "separated2.tsv"), parse(base + "/separated2-1.csvs"), None).isSuccess mustEqual true
6660
}
6761

6862
"with @quoted global directive" should {
6963
"succeed for '$' separator" in {
70-
validate(TextFile(Path.fromString(base) / "separated3.dsv"), parse(base + "/separated3.csvs"), None) must beLike {
71-
case Success(_) => ok
72-
}
64+
validate(TextFile(Path.fromString(base) / "separated3.dsv"), parse(base + "/separated3.csvs"), None).isSuccess mustEqual true
7365
}
7466

7567
"succeed for TAB separator" in {
76-
validate(TextFile(Path.fromString(base) / "separated4.tsv"), parse(base + "/separated4.csvs"), None) must beLike {
77-
case Success(_) => ok
78-
}
68+
validate(TextFile(Path.fromString(base) / "separated4.tsv"), parse(base + "/separated4.csvs"), None).isSuccess mustEqual true
7969
}
8070

8171
"succeed for '\t' separator" in {
82-
validate(TextFile(Path.fromString(base) / "separated4.tsv"), parse(base + "/separated4-1.csvs"), None) must beLike {
83-
case Success(_) => ok
84-
}
72+
validate(TextFile(Path.fromString(base) / "separated4.tsv"), parse(base + "/separated4-1.csvs"), None).isSuccess mustEqual true
8573
}
8674
}
8775
}
8876

8977
"Regex rule" should {
9078

9179
"succeed for metadata file with column that passes regex rule" in {
92-
validate(TextFile(Path.fromString(base) / "regexRulePassMetaData.csv"), parse(base + "/regexRuleSchema.csvs"), None) must beLike {
93-
case Success(_) => ok
94-
}
80+
validate(TextFile(Path.fromString(base) / "regexRulePassMetaData.csv"), parse(base + "/regexRuleSchema.csvs"), None).isSuccess mustEqual true
9581
}
9682

9783
"fail when @noHeader not set" in {
@@ -103,6 +89,16 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
10389
}
10490
}
10591

92+
93+
"Not empty rule" should {
94+
"succeed for metadata file with column that passes regex rule" in {
95+
val result = validate(TextFile(Path.fromString(base) / "notempty.csv"), parse(base + "/notempty.csvs"), None)
96+
println("End result " + result)
97+
result.isSuccess mustEqual true
98+
99+
}
100+
}
101+
106102
"Multiple errors " should {
107103
"all be reported" in {
108104
validate(TextFile(Path.fromString(base) / "multipleErrorsMetaData.csv"), parse(base + "/regexRuleSchemaWithNoHeaderSet.csvs"), None) must beLike {
@@ -115,9 +111,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
115111

116112
"Combining two rules" should {
117113
"succeed when metadata valid" in {
118-
validate(TextFile(Path.fromString(base) / "twoRulesPassMetaData.csv"), parse(base + "/twoRuleSchema.csvs"), None) must beLike {
119-
case Success(_) => ok
120-
}
114+
validate(TextFile(Path.fromString(base) / "twoRulesPassMetaData.csv"), parse(base + "/twoRuleSchema.csvs"), None).isSuccess mustEqual true
121115
}
122116

123117
"fail when rules fail for all permutations" in {
@@ -188,9 +182,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
188182

189183
"An in rule" should {
190184
"succeed if the column value is in the rule's literal string" in {
191-
validate(TextFile(Path.fromString(base) / "inRulePassMetaData.csv"), parse(base + "/inRuleSchema.csvs"), None) must beLike {
192-
case Success(_) => ok
193-
}
185+
validate(TextFile(Path.fromString(base) / "inRulePassMetaData.csv"), parse(base + "/inRuleSchema.csvs"), None).isSuccess mustEqual true
194186
}
195187

196188
"fail if the column value is not in the rule's literal string" in {
@@ -202,9 +194,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
202194
}
203195

204196
"succeed if the column value is in the rule's cross referenced column" in {
205-
validate(TextFile(Path.fromString(base) / "inRuleCrossReferencePassMetaData.csv"), parse(base + "/inRuleCrossReferenceSchema.csvs"), None) must beLike {
206-
case Success(_) => ok
207-
}
197+
validate(TextFile(Path.fromString(base) / "inRuleCrossReferencePassMetaData.csv"), parse(base + "/inRuleCrossReferenceSchema.csvs"), None).isSuccess mustEqual true
208198
}
209199

210200
"fail if the column value is not in the rule's cross referenced column" in {
@@ -289,9 +279,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
289279

290280
"An @optional column directive" should {
291281
"allow a column to have an empty value and ignore other rules" in {
292-
validate(TextFile(Path.fromString(base) / "optionalPassMetaData.csv"), parse(base + "/optionalSchema.csvs"), None) must beLike {
293-
case Success(_) => ok
294-
}
282+
validate(TextFile(Path.fromString(base) / "optionalPassMetaData.csv"), parse(base + "/optionalSchema.csvs"), None).isSuccess mustEqual true
295283
}
296284

297285
"fail if a non empty value fails a rule" in {
@@ -303,9 +291,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
303291

304292
"An @ignoreCase column directive" should {
305293
"pass a rule ignoring case" in {
306-
validate(TextFile(Path.fromString(base) / "ignoreCasePassMetaData.csv"), parse(base + "/ignoreCaseSchema.csvs"), None) must beLike {
307-
case Success(_) => ok
308-
}
294+
validate(TextFile(Path.fromString(base) / "ignoreCasePassMetaData.csv"), parse(base + "/ignoreCaseSchema.csvs"), None).isSuccess mustEqual true
309295
}
310296
}
311297

@@ -316,9 +302,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
316302
val schema = schemaTemplate.replace("$$acceptancePath$$", base)
317303

318304
"ensure the file exists on the file system" in {
319-
validate(TextFile(Path.fromString(base) / "fileExistsPassMetaData.csv"), parse(new StringReader(schema)), None) must beLike {
320-
case Success(_) => ok
321-
}
305+
validate(TextFile(Path.fromString(base) / "fileExistsPassMetaData.csv"), parse(new StringReader(schema)), None).isSuccess mustEqual true
322306
}
323307

324308
"ensure the file exists on the file system" in {
@@ -327,9 +311,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
327311
val csvTemplate = csvPath.lines(includeTerminator = true).mkString
328312
val csv = csvTemplate.replace("$$acceptancePath$$", base)
329313

330-
validateR(new StringReader(csv), parse(base + "/fileExistsCrossRefSchema.csvs")) must beLike {
331-
case Success(_) => ok
332-
}
314+
validateR(new StringReader(csv), parse(base + "/fileExistsCrossRefSchema.csvs")).isSuccess mustEqual true
333315
}
334316

335317
"fail if the file does not exist on the file system" in {
@@ -438,9 +420,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
438420
}
439421

440422
"succeed for multiple rules with valid metadata" in {
441-
app.validate(TextFile(Path.fromString(base) / "twoRulesPassMetaData.csv"), parse(base + "/twoRuleSchema.csvs"), None) must beLike {
442-
case Success(_) => ok
443-
}
423+
app.validate(TextFile(Path.fromString(base) / "twoRulesPassMetaData.csv"), parse(base + "/twoRuleSchema.csvs"), None).isSuccess mustEqual true
444424
}
445425

446426

@@ -474,9 +454,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
474454
}
475455

476456
"fail with unique column ids" in {
477-
validate(TextFile(Path.fromString(base) / "duplicateColumnIdsMetaData.csv"), parse(base + "/duplicateColumnIdsPassSchema.csvs"), None) must beLike {
478-
case Failure(_) => ok
479-
}
457+
validate(TextFile(Path.fromString(base) / "duplicateColumnIdsMetaData.csv"), parse(base + "/duplicateColumnIdsPassSchema.csvs"), None).isFailure mustEqual true
480458
}
481459
}
482460

@@ -495,9 +473,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
495473
}
496474

497475
"succeed for 2 'or' rules with an 'and' rule" in {
498-
validate(TextFile(Path.fromString(base) / "orWithFourRulesPassMetaData.csv"), parse(base + "/orWithFourRulesSchema.csvs"), None) must beLike {
499-
case Success(_) => ok
500-
}
476+
validate(TextFile(Path.fromString(base) / "orWithFourRulesPassMetaData.csv"), parse(base + "/orWithFourRulesSchema.csvs"), None).isSuccess mustEqual true
501477
}
502478

503479
"fail if 'or' rules pass and 'and' rule fails" in {
@@ -509,9 +485,7 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
509485

510486
"No arg standard rules" should {
511487
"succeed if all the rules are valid" in {
512-
validate(TextFile(Path.fromString(base) / "standardRulesPassMetaData.csv"), parse(base + "/standardRulesSchema.csvs"), None) must beLike {
513-
case Success(_) => ok
514-
}
488+
validate(TextFile(Path.fromString(base) / "standardRulesPassMetaData.csv"), parse(base + "/standardRulesSchema.csvs"), None).isSuccess mustEqual true
515489
}
516490

517491
"fail if all the rules are not" in {
@@ -567,7 +541,6 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
567541
}
568542
}
569543

570-
571544
"Redacted schema" should {
572545
"should remove filename extension" in {
573546
validate(TextFile(Path.fromString(base) / "redactedPass.csv"), parse(base + "/redacted.csvs"), None).isSuccess mustEqual true
@@ -580,6 +553,4 @@ class MetaDataValidatorAcceptanceSpec extends Specification with TestResources {
580553
}
581554
}
582555

583-
584-
585556
}

0 commit comments

Comments
 (0)