Skip to content

Commit 19ff609

Browse files
committed
Add batch ULI validation
1 parent 7f00aed commit 19ff609

File tree

2 files changed

+41
-6
lines changed
  • validation/src

2 files changed

+41
-6
lines changed

validation/src/main/scala/hmda/validation/engine/lar/ULI.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package hmda.validation.engine.lar
22

3+
import akka.NotUsed
4+
import akka.stream.scaladsl.Source
5+
36
//See https://www.consumerfinance.gov/eregulations/1003-C/2015-26607_20180101#1003-C-1
47

58
object ULI {
@@ -62,4 +65,9 @@ object ULI {
6265
calculateMod(BigInt(convert(uli))) == 1
6366
}
6467

68+
def validateULISource(uliSource: Source[String, NotUsed]): Source[(String, Boolean), NotUsed] = {
69+
uliSource
70+
.map(uli => (uli, validateULI(uli)))
71+
}
72+
6573
}
Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,47 @@
11
package hmda.validation.engine.lar
22

3-
import org.scalatest.{ MustMatchers, WordSpec }
3+
import akka.actor.ActorSystem
4+
import akka.stream.ActorMaterializer
5+
import akka.stream.scaladsl.{ Sink, Source }
6+
import org.scalatest.{ AsyncWordSpec, BeforeAndAfterAll, MustMatchers }
47

5-
class ULISpec extends WordSpec with MustMatchers {
8+
class ULISpec extends AsyncWordSpec with MustMatchers with BeforeAndAfterAll {
69

7-
val validULI = "10Bx939c5543TqA1144M999143X"
10+
implicit val system = ActorSystem()
11+
implicit val materializer = ActorMaterializer()
12+
implicit val ec = system.dispatcher
13+
14+
val loan1 = "10Bx939c5543TqA1144M999143X"
15+
val loan2 = "10Cx939c5543TqA1144M999143X"
16+
val validULI1 = "10Bx939c5543TqA1144M999143X38"
17+
val validULI2 = "10Cx939c5543TqA1144M999143X10"
818
val invalidULI = "10Bx939c5543TqA1144M999133X38"
919

20+
override def afterAll(): Unit = {
21+
super.afterAll()
22+
system.terminate()
23+
}
24+
1025
"A ULI Validation" must {
1126
"Produce valid check digit" in {
12-
ULI.checkDigit(validULI) mustBe 38
13-
ULI.generateULI(validULI) mustBe "10Bx939c5543TqA1144M999143X38"
27+
ULI.checkDigit(loan1) mustBe 38
28+
ULI.checkDigit(loan2) mustBe 10
29+
ULI.generateULI(loan1) mustBe validULI1
30+
ULI.generateULI(loan2) mustBe validULI2
1431
}
1532
"Validate ULI" in {
16-
ULI.validateULI(validULI + "38") mustBe true
33+
ULI.validateULI(validULI1) mustBe true
34+
ULI.validateULI(validULI2) mustBe true
1735
ULI.validateULI(invalidULI) mustBe false
1836
}
37+
"Validate a list of ULIs" in {
38+
val uliIt = List(validULI1, invalidULI).toIterator
39+
val uliSource = Source.fromIterator(() => uliIt)
40+
val validatedF = ULI.validateULISource(uliSource).runWith(Sink.seq)
41+
validatedF.map { validated =>
42+
validated.head._2 mustBe true
43+
validated.tail.head._2 mustBe false
44+
}
45+
}
1946
}
2047
}

0 commit comments

Comments
 (0)