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 all 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
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