aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/xyz/driver/pdsuidomain/formats/json/ExtractedDataFormatSuite.scala
blob: d1d8d444d7afadd57f37906a89fd7f340550d3be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package xyz.driver.pdsuidomain.formats.json

import spray.json._
import org.scalatest.{FlatSpec, Matchers}
import xyz.driver.entities.labels.LabelValue
import xyz.driver.pdsuicommon.domain.{LongId, TextJson}
import xyz.driver.pdsuidomain.entities.ExtractedData.Meta
import xyz.driver.pdsuidomain.entities.{ExtractedData, ExtractedDataLabel}
import xyz.driver.pdsuidomain.services.ExtractedDataService.RichExtractedData

class ExtractedDataFormatSuite extends FlatSpec with Matchers {
  import xyz.driver.pdsuidomain.formats.json.extracteddata._

  "Json format for ExtractedData" should "read and write correct JSON" in {
    val extractedData = ExtractedData(
      id = LongId(1),
      documentId = LongId(101),
      keywordId = Some(LongId(201)),
      evidenceText = Some("evidence text"),
      meta = Option(TextJson(Meta(
        evidence = None,
        keyword =
          Some(Meta.Keyword(
            page = 1,
            pageRatio = Some(1.6161616161616161d),
            index = 0,
            sortIndex = "1080000"
          ))
      )
    )))

    val extractedDataLabels = List(
      ExtractedDataLabel(
        id = LongId(1),
        dataId = extractedData.id,
        labelId = None,
        categoryId = None,
        value = Some(LabelValue.Yes)
      ),
      ExtractedDataLabel(
        id = LongId(2),
        dataId = extractedData.id,
        labelId = Some(LongId(12)),
        categoryId = Some(LongId(1)),
        value = Some(LabelValue.No)
      )
    )
    val origRichExtractedData = RichExtractedData(
      extractedData = extractedData,
      labels = extractedDataLabels
    )
    val writtenJson = extractedDataFormat.write(origRichExtractedData)

    writtenJson should be(
      """{"id":1,"documentId":101,"keywordId":201,"evidence":"evidence text","meta":null,
        "labels":[{"id":null,"categoryId":null,"value":"Yes"},{"id":12,"categoryId":1,"value":"No"}],
        "meta":{"keyword":{"index":0,"page":1,"pageRatio":1.6161616161616161,"sortIndex":"1080000"}}}""".parseJson)

    val createExtractedDataJson =
      """{"documentId":101,"keywordId":201,"evidence":"evidence text",
        "labels":[{"value":"Yes"},{"id":12,"categoryId":1,"value":"No"}],
        "meta":{"keyword":{"index":0,"page":1,"pageRatio":1.6161616161616161,"sortIndex":"1080000"}}}""".parseJson
    val expectedCreatedExtractedData = origRichExtractedData.copy(
      extractedData = extractedData.copy(id = LongId(0)),
      labels = extractedDataLabels.map(_.copy(id = LongId(0), dataId = LongId(0)))
    )
    val parsedCreatedExtractedData = extractedDataFormat.read(createExtractedDataJson)
    parsedCreatedExtractedData should be(expectedCreatedExtractedData)

    val updateExtractedDataJson =
      """{"evidence":"new evidence text","meta":{"keyword":{"page":1,"index":2,"sortIndex":"ASC"},
         "evidence":{"pageRatio":1.0,"start":{"page":1,"index":3,"offset":2},"end":{"page":2,"index":3,"offset":10}}},
        "labels":[{"id":20,"categoryId":1,"value":"Yes"},{"id":12,"categoryId":1,"value":"No"}]}""".parseJson
    val updatedExtractedDataLabels = List(
      ExtractedDataLabel(
        id = LongId(0),
        dataId = extractedData.id,
        labelId = Some(LongId(20)),
        categoryId = Some(LongId(1)),
        value = Some(LabelValue.Yes)
      ),
      ExtractedDataLabel(
        id = LongId(0),
        dataId = extractedData.id,
        labelId = Some(LongId(12)),
        categoryId = Some(LongId(1)),
        value = Some(LabelValue.No)
      )
    )
    val expectedUpdatedExtractedData = origRichExtractedData.copy(
      extractedData = extractedData.copy(
        evidenceText = Some("new evidence text"),
        meta = Some(
          TextJson(Meta(
            keyword = Some(Meta.Keyword(page = 1, pageRatio = None, index = 2, sortIndex = "ASC")),
            evidence = Some(Meta.Evidence(
              pageRatio = 1.0,
              start = Meta.TextLayerPosition(page = 1, index = 3, offset = 2),
              end = Meta.TextLayerPosition(page = 2, index = 3, offset = 10)
            ))
          )))
      ),
      labels = updatedExtractedDataLabels
    )
    val parsedUpdatedExtractedData = applyUpdateToExtractedData(updateExtractedDataJson, origRichExtractedData)
    parsedUpdatedExtractedData should be(expectedUpdatedExtractedData)
  }

}