/
ProjectRouteZSpec.scala
77 lines (67 loc) · 3.27 KB
/
ProjectRouteZSpec.scala
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
package org.knora.webapi.routing.admin
import zhttp.http._
import zio._
import zio.mock.Expectation
import zio.test.ZIOSpecDefault
import zio.test._
import java.net.URLEncoder
import org.knora.webapi.config.AppConfig
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetRequestADM
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponseADM
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM
import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2
import org.knora.webapi.responders.ActorToZioBridge
import org.knora.webapi.responders.ActorToZioBridgeMock
import org.knora.webapi.responders.admin.RestProjectsService
object ProjectRouteZSpec extends ZIOSpecDefault {
private val systemUnderTest: URIO[ProjectsRouteZ, HttpApp[Any, Nothing]] = ZIO.service[ProjectsRouteZ].map(_.route)
// Test data
private val projectIri: ProjectIdentifierADM.IriIdentifier =
ProjectIdentifierADM.IriIdentifier
.fromString("http://rdfh.ch/projects/0001")
.getOrElse(throw new IllegalArgumentException())
private val basePath: Path = !! / "admin" / "projects" / "iri"
private val validIriEncoded: String = URLEncoder.encode(projectIri.value.value, "utf-8")
private val expectedRequestSuccess: ProjectGetRequestADM = ProjectGetRequestADM(projectIri)
private val expectedResponseSuccess: ProjectGetResponseADM = ProjectGetResponseADM(
ProjectADM(
"id",
"shortname",
"shortcode",
None,
List(StringLiteralV2("description")),
List.empty,
None,
List.empty,
status = false,
selfjoin = false
)
)
// Expectations and layers for ActorToZioBridge mock
private val commonLayers: URLayer[ActorToZioBridge, ProjectsRouteZ] =
ZLayer.makeSome[ActorToZioBridge, ProjectsRouteZ](AppConfig.test, ProjectsRouteZ.layer, RestProjectsService.layer)
private val expectMessageToProjectResponderADM: ULayer[ActorToZioBridge] =
ActorToZioBridgeMock.AskAppActor
.of[ProjectGetResponseADM]
.apply(Assertion.equalTo(expectedRequestSuccess), Expectation.value(expectedResponseSuccess))
.toLayer
private val expectNoInteractionWithProjectsResponderADM = ActorToZioBridgeMock.empty
val spec: Spec[Any, Serializable] =
suite("ProjectsRouteZSpec")(
test("given valid project iri should respond with success") {
val urlWithValidIri = URL.empty.setPath(basePath / validIriEncoded)
for {
route <- systemUnderTest
actual <- route.apply(Request(url = urlWithValidIri)).flatMap(_.body.asString)
} yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString())
}.provide(commonLayers, expectMessageToProjectResponderADM),
test("given invalid project iri but no authentication should respond with bad request") {
val urlWithInvalidIri = URL.empty.setPath(basePath / "invalid")
for {
route <- systemUnderTest
actual <- route.apply(Request(url = urlWithInvalidIri)).map(_.status)
} yield assertTrue(actual == Status.BadRequest)
}.provide(commonLayers, expectNoInteractionWithProjectsResponderADM)
)
}