Skip to content

Commit

Permalink
refactor: Replace Spray JSON with ZIO-JSON in some projects endpoints (
Browse files Browse the repository at this point in the history
  • Loading branch information
BalduinLandolt committed Mar 6, 2024
1 parent 2202bd9 commit 70ea9ba
Show file tree
Hide file tree
Showing 22 changed files with 210 additions and 208 deletions.
14 changes: 9 additions & 5 deletions integration/src/test/scala/org/knora/sipi/SipiIT.scala
Expand Up @@ -23,8 +23,7 @@ import scala.util.Try

import org.knora.sipi.MockDspApiServer.verify.*
import org.knora.webapi.config.AppConfig
import org.knora.webapi.messages.admin.responder.KnoraResponseADM
import org.knora.webapi.messages.admin.responder.sipimessages.*
import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings
import org.knora.webapi.messages.util.KnoraSystemInstances.Users.SystemUser
import org.knora.webapi.routing.JwtService
import org.knora.webapi.routing.JwtServiceLive
Expand Down Expand Up @@ -317,7 +316,11 @@ object MockDspApiServer {

def resetAndStubGetResponse(url: String, status: Int): URIO[WireMockServer, WireMockServer] =
resetAndGetWireMockServer.tap(server => ZIO.succeed(stubGetJsonResponse(server, url, status)))
def resetAndStubGetResponse(url: String, status: Int, body: KnoraResponseADM): URIO[WireMockServer, WireMockServer] =
def resetAndStubGetResponse(
url: String,
status: Int,
body: PermissionCodeAndProjectRestrictedViewSettings,
): URIO[WireMockServer, WireMockServer] =
resetAndGetWireMockServer.tap(server => ZIO.succeed(stubGetJsonResponse(server, url, status, Some(body))))

def resetAndAllowWithPermissionCode(
Expand Down Expand Up @@ -349,9 +352,10 @@ object MockDspApiServer {
server: WireMockServer,
url: String,
status: Int,
body: Option[KnoraResponseADM] = None,
body: Option[PermissionCodeAndProjectRestrictedViewSettings] = None,
): Unit = {
val json = body.map(_.toJsValue.compactPrint).orNull
val json =
body.map(it => PermissionCodeAndProjectRestrictedViewSettings.codec.encoder.encodeJson(it).toString).orNull
val jsonResponse = aResponse().withStatus(status).withBody(json).withHeader("Content-Type", "application/json")
val stubBuilder = get(urlEqualTo(url)).willReturn(jsonResponse)
server.stubFor(stubBuilder)
Expand Down
Expand Up @@ -7,14 +7,10 @@ package org.knora.webapi.e2e.admin

import org.apache.pekko.http.scaladsl.model.*
import org.apache.pekko.http.scaladsl.model.headers.BasicHttpCredentials
import org.apache.pekko.http.scaladsl.unmarshalling.Unmarshal

import scala.concurrent.Await
import scala.concurrent.duration.*

import org.knora.webapi.E2ESpec
import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings
import org.knora.webapi.messages.admin.responder.sipimessages.SipiResponderResponseADMJsonProtocol.*
import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM
import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject
import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol
import org.knora.webapi.routing.Authenticator
Expand Down Expand Up @@ -49,14 +45,14 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol {
addCredentials(BasicHttpCredentials(anythingAdminEmail, testPass))
val response: HttpResponse = singleAwaitingRequest(request)

// println(response.toString)

assert(response.status == StatusCodes.OK)

val fr: PermissionCodeAndProjectRestrictedViewSettings =
Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds)
val result: PermissionCodeAndProjectRestrictedViewSettings =
PermissionCodeAndProjectRestrictedViewSettings.codec
.decodeJson(responseToString(response))
.getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}."))

fr.permissionCode shouldEqual 8
assert(result == PermissionCodeAndProjectRestrictedViewSettings(8, None))
}

"return RV (1) permission code" in {
Expand All @@ -66,14 +62,16 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol {
addCredentials(BasicHttpCredentials(normalUserEmail, testPass))
val response: HttpResponse = singleAwaitingRequest(request)

// println(response.toString)

assert(response.status == StatusCodes.OK)

val fr: PermissionCodeAndProjectRestrictedViewSettings =
Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds)
val result: PermissionCodeAndProjectRestrictedViewSettings =
PermissionCodeAndProjectRestrictedViewSettings.codec
.decodeJson(responseToString(response))
.getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}."))

(fr.permissionCode === 1) should be(true)
assert(
result == PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))),
)
}

"return 404 Not Found if a file value is in a deleted resource" in {
Expand All @@ -93,11 +91,14 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol {

assert(response.status == StatusCodes.OK)

val fr: PermissionCodeAndProjectRestrictedViewSettings =
Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds)

(fr.permissionCode === 1) should be(true)
val result: PermissionCodeAndProjectRestrictedViewSettings =
PermissionCodeAndProjectRestrictedViewSettings.codec
.decodeJson(responseToString(response))
.getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}."))

assert(
result == PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))),
)
}
}
}
Expand Up @@ -63,11 +63,8 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol {
"return all projects excluding built-in system projects" in {
val request = Get(baseApiUrl + s"/admin/projects") ~> addCredentials(BasicHttpCredentials(rootEmail, testPass))
val response = singleAwaitingRequest(request)
// log.debug(s"response: {}", response)
assert(response.status === StatusCodes.OK)

// log.debug("projects as objects: {}", AkkaHttpUtils.httpResponseToJson(response).fields("projects").convertTo[Seq[ProjectInfoV1]])

val projects: Seq[ProjectADM] =
AkkaHttpUtils.httpResponseToJson(response).fields("projects").convertTo[Seq[ProjectADM]]
projects.size should be(6)
Expand All @@ -88,7 +85,6 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol {
BasicHttpCredentials(rootEmail, testPass),
)
val response: HttpResponse = singleAwaitingRequest(request)
// log.debug(s"response: {}", response)
assert(response.status === StatusCodes.OK)
clientTestDataCollector.addFile(
TestDataFileContent(
Expand All @@ -107,7 +103,6 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol {
BasicHttpCredentials(rootEmail, testPass),
)
val response: HttpResponse = singleAwaitingRequest(request)
// log.debug(s"response: {}", response)
assert(response.status === StatusCodes.OK)
}

Expand All @@ -116,7 +111,6 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol {
BasicHttpCredentials(rootEmail, testPass),
)
val response: HttpResponse = singleAwaitingRequest(request)
// log.debug(s"response: {}", response)
assert(response.status === StatusCodes.OK)
}

Expand All @@ -125,11 +119,14 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol {
BasicHttpCredentials(rootEmail, testPass),
)
val response: HttpResponse = singleAwaitingRequest(request)
logger.debug(s"response: {}", response)
assert(response.status === StatusCodes.OK)

val settings: ProjectRestrictedViewSettingsADM =
AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM]
val settings =
ProjectRestrictedViewSettingsGetResponseADM.codec
.decodeJson(responseToString(response))
.getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}."))
.settings

settings.size should be(Some("!512,512"))
settings.watermark should be(true)

Expand All @@ -150,11 +147,14 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol {
baseApiUrl + s"/admin/projects/shortname/$projectShortname/RestrictedViewSettings",
) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass))
val response: HttpResponse = singleAwaitingRequest(request)
logger.debug(s"response: {}", response)
assert(response.status === StatusCodes.OK)

val settings: ProjectRestrictedViewSettingsADM =
AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM]
ProjectRestrictedViewSettingsGetResponseADM.codec
.decodeJson(responseToString(response))
.getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}."))
.settings

settings.size should be(Some("!512,512"))
settings.watermark should be(true)
}
Expand All @@ -164,11 +164,14 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol {
baseApiUrl + s"/admin/projects/shortcode/$projectShortcode/RestrictedViewSettings",
) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass))
val response: HttpResponse = singleAwaitingRequest(request)
logger.debug(s"response: {}", response)
assert(response.status === StatusCodes.OK)

val settings: ProjectRestrictedViewSettingsADM =
AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM]
ProjectRestrictedViewSettingsGetResponseADM.codec
.decodeJson(responseToString(response))
.getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}."))
.settings

settings.size should be(Some("!512,512"))
settings.watermark should be(true)
}
Expand Down
Expand Up @@ -8,9 +8,9 @@ package org.knora.webapi.responders.admin
import org.apache.pekko.testkit.*

import org.knora.webapi.*
import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.ShortcodeIdentifier
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM
import org.knora.webapi.messages.admin.responder.sipimessages.*
import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject
import org.knora.webapi.routing.UnsafeZioRun
import org.knora.webapi.sharedtestdata.SharedTestDataADM
Expand Down
Expand Up @@ -55,7 +55,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender {
.fromString(SharedTestDataADM.incunabulaProject.id)
.getOrElseWith(e => throw BadRequestException(e.head.getMessage)),
)
expectMsg(ProjectGetResponseADM(SharedTestDataADM.incunabulaProject))
expectMsg(ProjectGetResponse(SharedTestDataADM.incunabulaProject))

}

Expand All @@ -65,7 +65,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender {
.fromString(SharedTestDataADM.incunabulaProject.shortname)
.getOrElseWith(e => throw BadRequestException(e.head.getMessage)),
)
expectMsg(ProjectGetResponseADM(SharedTestDataADM.incunabulaProject))
expectMsg(ProjectGetResponse(SharedTestDataADM.incunabulaProject))
}

"return 'NotFoundException' when the project IRI is unknown" in {
Expand Down
Expand Up @@ -22,7 +22,7 @@ import org.knora.webapi.messages.SmartIri
import org.knora.webapi.messages.StringFormatter
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.ProjectGetResponse
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM
import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceGetProjectADM
import org.knora.webapi.messages.store.triplestoremessages.*
Expand Down Expand Up @@ -163,7 +163,7 @@ class OntologyResponderV2Spec extends CoreSpec with ImplicitSender {
"invalidate cached project information when adding an ontology to a project" in {
// ernsure that the project is cached
appActor ! ProjectGetRequestADM(ProjectIdentifierADM.IriIdentifier.unsafeFrom(imagesProjectIri.toString))
expectMsgType[ProjectGetResponseADM](timeout)
expectMsgType[ProjectGetResponse](timeout)
appActor ! CacheServiceGetProjectADM(ProjectIdentifierADM.IriIdentifier.unsafeFrom(imagesProjectIri.toString))
val cachedProjectBefore = expectMsgType[Option[ProjectADM]](timeout)
assert(cachedProjectBefore.isDefined)
Expand Down

0 comments on commit 70ea9ba

Please sign in to comment.