From 7d1837c4092f9d15522b09acda65b40000b2c1ac Mon Sep 17 00:00:00 2001
From: Arvid Ihrig <ihrig@fhi-berlin.mpg.de>
Date: Mon, 2 Jul 2018 10:51:18 +0200
Subject: [PATCH] Integrated Pipeline: further rework of the
 CalculationParsingEngine tests to make them more flexible

---
 .../messages/FileParsingSignals.scala         |  2 ++
 .../CalculationParsingEngineSpec.scala        | 31 +++++++------------
 .../MessageMatchers.scala                     | 25 +++++++++++++++
 3 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala b/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala
index 91962327..15aef0f1 100644
--- a/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala
+++ b/integrated-pipeline/src/main/scala/eu/nomad_lab/integrated_pipeline/messages/FileParsingSignals.scala
@@ -55,6 +55,8 @@ case class FileParsingSignalEndTree(
 sealed trait FileParsingResult extends FileParsingResultSignal {
   val result: ParseResult
   val task: FileParsingTask
+  val start: Option[StartedParsingSession]
+  val end: Option[FinishedParsingSession]
 
   val treeTask: FileTreeScanTask = task.treeTask
 }
diff --git a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala
index bd2a2d4e..cdde43e4 100644
--- a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala
+++ b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/CalculationParsingEngineSpec.scala
@@ -12,10 +12,10 @@ import org.mockito.ArgumentMatchers.{ eq => raw, _ }
 import org.mockito.Mockito._
 import org.mockito.invocation.InvocationOnMock
 import org.mockito.stubbing.Answer
-import org.scalatest.WordSpec
+import org.scalatest.{ Matchers, WordSpec }
 import org.scalatest.mockito.MockitoSugar
 
-class CalculationParsingEngineSpec extends WordSpec with MockitoSugar with TestDataBuilders with MessageMatchers {
+class CalculationParsingEngineSpec extends WordSpec with MockitoSugar with TestDataBuilders with Matchers with FileParsingResultMatchers {
 
   val parserInfo: JObject = JObject(
     "name" -> JString("dummyParser")
@@ -80,42 +80,33 @@ class CalculationParsingEngineSpec extends WordSpec with MockitoSugar with TestD
         val f = new Fixture
         f.prepareParserStandardInvocation()
         val result = f.worker.processRequest(sampleParseRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        assert(inMemory.start.nonEmpty, "expected a start event to be emitted")
-        assert(inMemory.end.nonEmpty, "expected a finish event to be emitted")
+        assert(result.start.nonEmpty, "expected a start event to be emitted")
+        assert(result.end.nonEmpty, "expected a finish event to be emitted")
       }
 
       "record all emitted events in the correct order" in {
         val f = new Fixture
         f.prepareParserStandardInvocation()
         val result = f.worker.processRequest(sampleParseRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        inMemory.events.zip(sampleEvents).foreach(x => assert(x._1 == x._2))
-        assert(inMemory.events === sampleEvents, "emitted and recorded events do not match")
+        result should have(events(sampleEvents))
       }
 
       "handle parsing failures and return an appropriate result" in {
         val f = new Fixture
         f.prepareParserFailureInvocation()
         val result = f.worker.processRequest(sampleParseRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        assert(inMemory.result == ParseResult.ParseFailure)
-        assert(inMemory.end.nonEmpty, "should have a termination event")
-        assert(inMemory.end.get.parserErrors.children.nonEmpty, "should have error messages")
+        result should have(status(ParseResult.ParseFailure))
+        assert(result.end.nonEmpty, "should have a termination event")
+        assert(result.end.get.parserErrors.children.nonEmpty, "should have error messages")
       }
 
       "gracefully fail parsing requests with unknown parsers" in {
         val f = new Fixture
         val anotherRequest = sampleParseRequest.withParserName("nonSenseParser")
         val result = f.worker.processRequest(anotherRequest, unusedPath)
-        assert(result.isInstanceOf[InMemoryResult], "results should have been kept in memory")
-        val inMemory = result.asInstanceOf[InMemoryResult]
-        assert(inMemory.result == ParseResult.ParseFailure, "should have a failed status")
-        assert(inMemory.end.nonEmpty, "should have a termination event")
-        assert(inMemory.end.get.parserErrors.children.nonEmpty, "should have error messages")
+        result should have(status(ParseResult.ParseFailure))
+        assert(result.end.nonEmpty, "should have a termination event")
+        assert(result.end.get.parserErrors.children.nonEmpty, "should have error messages")
       }
 
       "specify the correct main file to the parser" in {
diff --git a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala
index fce73202..a3519ade 100644
--- a/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala
+++ b/integrated-pipeline/src/test/scala/eu/nomad_lab/integrated_pipeline_tests/MessageMatchers.scala
@@ -4,6 +4,7 @@ import java.nio.file.{ Path, Paths }
 
 import eu.nomad_lab.integrated_pipeline.messages._
 import eu.nomad_lab.parsers.ParseResult.ParseResult
+import eu.nomad_lab.parsers.{ FinishedParsingSession, ParseEvent, StartedParsingSession }
 import org.scalatest.matchers.{ HavePropertyMatchResult, HavePropertyMatcher }
 
 trait MessageMatchers
@@ -104,4 +105,28 @@ trait FileParsingResultMatchers {
       expected = expectedValue,
       test = (x: FileParsingSignalEndTree) => x.numParsingTasks
     )
+
+  def startSignal(expectedValue: Option[StartedParsingSession]): HavePropertyMatcher[FileParsingResult, Option[StartedParsingSession]] =
+    Helpers.propertyMatcher(
+      propertyName = "session start signal",
+      expected = expectedValue,
+      test = (x: FileParsingResult) => x.start
+    )
+
+  def endSignal(expectedValue: Option[FinishedParsingSession]): HavePropertyMatcher[FileParsingResult, Option[FinishedParsingSession]] =
+    Helpers.propertyMatcher(
+      propertyName = "session end signal",
+      expected = expectedValue,
+      test = (x: FileParsingResult) => x.end
+    )
+
+  def events(expectedValue: Seq[ParseEvent]): HavePropertyMatcher[FileParsingResult, Seq[ParseEvent]] =
+    Helpers.propertyMatcher(
+      propertyName = "emitted parsing events",
+      expected = expectedValue,
+      test = (x: FileParsingResult) => x match {
+      case x: InMemoryResult => x.events
+    }
+    )
+
 }
\ No newline at end of file
-- 
GitLab