Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Replace Spray JSON with ZIO-JSON in some projects endpoints (DEV-3375) #3095

Merged
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 9 additions & 5 deletions integration/src/test/scala/org/knora/sipi/SipiIT.scala
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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("JSON decoding failed"))

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("JSON decoding failed"))

(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("JSON decoding failed"))

assert(
result == PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))),
)
}
}
}
Original file line number Diff line number Diff line change
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("Could not decode response"))
BalduinLandolt marked this conversation as resolved.
Show resolved Hide resolved
.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("Could not decode 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("Could not decode response"))
.settings

settings.size should be(Some("!512,512"))
settings.watermark should be(true)
}
Expand Down
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ import org.knora.webapi.messages.traits.Jsonable
trait KnoraResponseADM extends Jsonable

trait AdminKnoraResponseADM extends KnoraResponseADM

trait AdminResponse