Skip to content

Instantly share code, notes, and snippets.

@andyczerwonka
Created June 13, 2020 14:25
Show Gist options
  • Save andyczerwonka/206043f615ffb5cd35e7f80cbca2fe54 to your computer and use it in GitHub Desktop.
Save andyczerwonka/206043f615ffb5cd35e7f80cbca2fe54 to your computer and use it in GitHub Desktop.
Discussion around an API that could collect failures and success
package io.citrine.orion.core.domain
import io.citrine.testing.BaseUnitTest
import scala.collection.mutable.ListBuffer
class BusinessRuleTest extends BaseUnitTest {
trait StatusInfo {
def write(msg: String)
def msgs(): Seq[String]
}
class StatusInfoWriter extends StatusInfo {
private val buffer = ListBuffer[String]()
override def write(msg: String): Unit = buffer += msg
override def msgs(): List[String] = buffer.toList
}
implicit val statusInfo = new StatusInfoWriter
case class Row(contents: String)
def rule(desc: String)(predicate: => Boolean)(implicit statusInfo: StatusInfo): Boolean = {
val ex = predicate
val prefix = if (ex) "Passed:" else "Failed:"
statusInfo.write(s"$prefix $desc")
ex
}
test("allow less than 100 rows") {
val rows = List(Row("1"))
rule("Limit rows to 100") {
rows.length < 100
} shouldBe true
statusInfo.msgs contains ("Passed: Limit rows to 100")
}
test("fail when rows > 100") {
val rows = for (i <- 0 to 101) yield Row(s"$i")
rule("Limit rows to 100") {
rows.length < 100
} shouldBe false
statusInfo.msgs contains ("Failed: Limit rows to 100")
}
}
@andyczerwonka
Copy link
Author

If we're wanting to continue to add status info messages for both failure and success messages, maybe we could introduce an API that does that for us. The above API is an example of how to do that. If I were to introduce this, I'd beef it up a bit, probably add a way for us to collect the rules and associated failures and successes. Thoughts?

@bfolie
Copy link

bfolie commented Jun 15, 2020

What's the primary motivator of this structure? Is it to collect all results in one place? Is it to make it easier to write validation rules? Something else?

@andyczerwonka
Copy link
Author

Just pondering ideas attempting to separate the traceability use case (recording the fact a test passed vs failed) from writing rules, and ways of integrating it into other validation frameworks like Octopus or Accord, which don't support it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment