From a58c1ffc6e27d4d0411c3edfaaaa755e72000c95 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Tue, 3 Jan 2023 17:48:57 +0100 Subject: [PATCH 1/8] add get project by shortcode and shortname routes --- .../admin/RestProjectsService.scala | 8 ++--- .../org/knora/webapi/routing/RouteUtilZ.scala | 4 +-- .../webapi/routing/admin/ProjectsRouteZ.scala | 32 +++++++++++++++---- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala index 073e636b1b..1783d10a65 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala @@ -12,18 +12,18 @@ import org.knora.webapi.responders.ActorToZioBridge final case class RestProjectsService(bridge: ActorToZioBridge) { /** - * Finds the project by an [[IRI]] and returns the information as a [[ProjectGetResponseADM]]. + * Finds the project by a [[IRI]] and returns the information as a [[ProjectGetResponseADM]]. * * @param projectIri an [[IRI]] identifying the project * @return * '''success''': information about the project as a [[ProjectGetResponseADM]] * - * '''error''': [[dsp.errors.NotFoundException]] when no project for the given IRI can be found + * '''failure''': [[dsp.errors.NotFoundException]] when no project for the given IRI can be found * [[dsp.errors.ValidationException]] if the given `projectIri` is invalid */ - def getSingleProjectADMRequest(projectIri: IRI): Task[ProjectGetResponseADM] = + def getSingleProjectADMRequest(projectIdentifierAsString: IRI): Task[ProjectGetResponseADM] = ProjectIdentifierADM.IriIdentifier - .fromString(projectIri) + .fromString(projectIdentifierAsString) .toZIO .flatMap(getSingleProjectADMRequest(_)) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilZ.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilZ.scala index 1fae3dd846..415cea03cb 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilZ.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilZ.scala @@ -16,9 +16,9 @@ object RouteUtilZ { * * @param value The value in utf-8 to be url decoded * @param errorMsg Custom error message for the error type - * @return ```success``` the decoded string + * @return '''success''' the decoded string * - * ```failure``` A [[BadRequestException]] with the `errorMsg` + * '''failure''' A [[BadRequestException]] with the `errorMsg` */ def urlDecode(value: String, errorMsg: String = ""): Task[String] = ZIO diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala index 41a3661f99..90446ea976 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala @@ -10,6 +10,10 @@ import org.knora.webapi.config.AppConfig import org.knora.webapi.http.handler.ExceptionHandlerZ import org.knora.webapi.responders.admin.RestProjectsService import org.knora.webapi.routing.RouteUtilZ +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM._ +import zio.Task +import dsp.errors.BadRequestException +import dsp.errors.ValidationException final case class ProjectsRouteZ( appConfig: AppConfig, @@ -18,21 +22,35 @@ final case class ProjectsRouteZ( val route: HttpApp[Any, Nothing] = Http - .collectZIO[Request] { case Method.GET -> !! / "admin" / "projects" / "iri" / iriUrlEncoded => - getProjectByIriEncoded(iriUrlEncoded) + .collectZIO[Request] { + case Method.GET -> !! / "admin" / "projects" / "iri" / iriUrlEncoded => getProjectByIriEncoded(iriUrlEncoded) + case Method.GET -> !! / "admin" / "projects" / "shortname" / shortname => getProjectByShortname(shortname) + case Method.GET -> !! / "admin" / "projects" / "shortcode" / shortcode => getProjectByShortcode(shortcode) + + // case req @ (Method.POST -> !! / "admin" / "users") => ??? } .catchAll { - case RequestRejectedException(e) => - ExceptionHandlerZ.exceptionToJsonHttpResponseZ(e, appConfig) - case InternalServerException(e) => - ExceptionHandlerZ.exceptionToJsonHttpResponseZ(e, appConfig) + case RequestRejectedException(e) => ExceptionHandlerZ.exceptionToJsonHttpResponseZ(e, appConfig) + case InternalServerException(e) => ExceptionHandlerZ.exceptionToJsonHttpResponseZ(e, appConfig) } - private def getProjectByIriEncoded(iriUrlEncoded: String) = + private def getProjectByIriEncoded(iriUrlEncoded: String): Task[Response] = RouteUtilZ .urlDecode(iriUrlEncoded, "Failed to url decode IRI parameter.") .flatMap(projectsService.getSingleProjectADMRequest(_).map(_.toJsValue.toString())) .map(Response.json(_)) + + private def getProjectByShortname(shortname: String): Task[Response] = + for { + shortnameIdentifier <- ShortnameIdentifier.fromString(shortname).toZIO.mapError(e => BadRequestException(e.msg)) + projectGetResponse <- projectsService.getSingleProjectADMRequest(identifier = shortnameIdentifier) + } yield Response.json(projectGetResponse.toJsValue.toString()) + + private def getProjectByShortcode(shortcode: String): Task[Response] = + for { + shortcodeIdentifier <- ShortcodeIdentifier.fromString(shortcode).toZIO.mapError(e => BadRequestException(e.msg)) + projectGetResponse <- projectsService.getSingleProjectADMRequest(identifier = shortcodeIdentifier) + } yield Response.json(projectGetResponse.toJsValue.toString()) } object ProjectsRouteZ { From 56e1d25f12b58bc95eea7c76cf493c2d85b34d8f Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Tue, 3 Jan 2023 17:59:21 +0100 Subject: [PATCH 2/8] fmt --- .../org/knora/webapi/routing/admin/ProjectsRouteZ.scala | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala index 90446ea976..822d260a76 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala @@ -1,19 +1,18 @@ package org.knora.webapi.routing.admin import zhttp.http._ +import zio.Task import zio.URLayer import zio.ZLayer +import dsp.errors.BadRequestException import dsp.errors.InternalServerException import dsp.errors.RequestRejectedException import org.knora.webapi.config.AppConfig import org.knora.webapi.http.handler.ExceptionHandlerZ +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM._ import org.knora.webapi.responders.admin.RestProjectsService import org.knora.webapi.routing.RouteUtilZ -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM._ -import zio.Task -import dsp.errors.BadRequestException -import dsp.errors.ValidationException final case class ProjectsRouteZ( appConfig: AppConfig, @@ -26,8 +25,6 @@ final case class ProjectsRouteZ( case Method.GET -> !! / "admin" / "projects" / "iri" / iriUrlEncoded => getProjectByIriEncoded(iriUrlEncoded) case Method.GET -> !! / "admin" / "projects" / "shortname" / shortname => getProjectByShortname(shortname) case Method.GET -> !! / "admin" / "projects" / "shortcode" / shortcode => getProjectByShortcode(shortcode) - - // case req @ (Method.POST -> !! / "admin" / "users") => ??? } .catchAll { case RequestRejectedException(e) => ExceptionHandlerZ.exceptionToJsonHttpResponseZ(e, appConfig) From 24ba2c4c73691d04c52b19b9e420e1c8540e5e0f Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 4 Jan 2023 08:31:26 +0100 Subject: [PATCH 3/8] Update RestProjectsService.scala --- .../knora/webapi/responders/admin/RestProjectsService.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala index 1783d10a65..69b153dd1e 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala @@ -12,7 +12,7 @@ import org.knora.webapi.responders.ActorToZioBridge final case class RestProjectsService(bridge: ActorToZioBridge) { /** - * Finds the project by a [[IRI]] and returns the information as a [[ProjectGetResponseADM]]. + * Finds the project by an [[IRI]] and returns the information as a [[ProjectGetResponseADM]]. * * @param projectIri an [[IRI]] identifying the project * @return @@ -21,9 +21,9 @@ final case class RestProjectsService(bridge: ActorToZioBridge) { * '''failure''': [[dsp.errors.NotFoundException]] when no project for the given IRI can be found * [[dsp.errors.ValidationException]] if the given `projectIri` is invalid */ - def getSingleProjectADMRequest(projectIdentifierAsString: IRI): Task[ProjectGetResponseADM] = + def getSingleProjectADMRequest(projectIri: IRI): Task[ProjectGetResponseADM] = ProjectIdentifierADM.IriIdentifier - .fromString(projectIdentifierAsString) + .fromString(projectIri) .toZIO .flatMap(getSingleProjectADMRequest(_)) From b76b05d57c5624da68d12d4f6a1cc99a495b75f5 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 4 Jan 2023 08:33:42 +0100 Subject: [PATCH 4/8] Update ProjectsRouteZ.scala --- .../scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala index 822d260a76..55344d8319 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala @@ -33,7 +33,7 @@ final case class ProjectsRouteZ( private def getProjectByIriEncoded(iriUrlEncoded: String): Task[Response] = RouteUtilZ - .urlDecode(iriUrlEncoded, "Failed to url decode IRI parameter.") + .urlDecode(iriUrlEncoded, s"Failed to URL decode IRI parameter $iriUrlEncoded.") .flatMap(projectsService.getSingleProjectADMRequest(_).map(_.toJsValue.toString())) .map(Response.json(_)) From 47a6ac29ed0020ecb47e9246f9b8a2b06fe541cd Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 4 Jan 2023 10:07:43 +0100 Subject: [PATCH 5/8] refactor and cleanup code --- .../admin/RestProjectsService.scala | 2 +- .../webapi/routing/admin/ProjectsRouteZ.scala | 9 ++- .../routing/admin/ProjectRouteZSpec.scala | 77 ------------------- 3 files changed, 6 insertions(+), 82 deletions(-) delete mode 100644 webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectRouteZSpec.scala diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala index 69b153dd1e..d4d2f80805 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala @@ -19,7 +19,7 @@ final case class RestProjectsService(bridge: ActorToZioBridge) { * '''success''': information about the project as a [[ProjectGetResponseADM]] * * '''failure''': [[dsp.errors.NotFoundException]] when no project for the given IRI can be found - * [[dsp.errors.ValidationException]] if the given `projectIri` is invalid + * [[dsp.errors.ValidationException]] if the given `projectIri` is invalid */ def getSingleProjectADMRequest(projectIri: IRI): Task[ProjectGetResponseADM] = ProjectIdentifierADM.IriIdentifier diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala index 55344d8319..00b6cb77aa 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteZ.scala @@ -32,10 +32,11 @@ final case class ProjectsRouteZ( } private def getProjectByIriEncoded(iriUrlEncoded: String): Task[Response] = - RouteUtilZ - .urlDecode(iriUrlEncoded, s"Failed to URL decode IRI parameter $iriUrlEncoded.") - .flatMap(projectsService.getSingleProjectADMRequest(_).map(_.toJsValue.toString())) - .map(Response.json(_)) + for { + iriDecoded <- RouteUtilZ.urlDecode(iriUrlEncoded, s"Failed to URL decode IRI parameter $iriUrlEncoded.") + iri <- IriIdentifier.fromString(iriDecoded).toZIO + projectGetResponse <- projectsService.getSingleProjectADMRequest(identifier = iri) + } yield Response.json(projectGetResponse.toJsValue.toString()) private def getProjectByShortname(shortname: String): Task[Response] = for { diff --git a/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectRouteZSpec.scala b/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectRouteZSpec.scala deleted file mode 100644 index b92508324f..0000000000 --- a/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectRouteZSpec.scala +++ /dev/null @@ -1,77 +0,0 @@ -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) - ) -} From 4c808c57f5fdca49009e512862592593900b59d9 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 4 Jan 2023 10:07:50 +0100 Subject: [PATCH 6/8] add tests for new routes --- .../routing/admin/ProjectsRouteZSpec.scala | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala diff --git a/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala b/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala new file mode 100644 index 0000000000..3267355148 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala @@ -0,0 +1,135 @@ +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 projectShortname: ProjectIdentifierADM.ShortnameIdentifier = + ProjectIdentifierADM.ShortnameIdentifier + .fromString("shortname") + .getOrElse(throw new IllegalArgumentException()) + + private val projectShortcode: ProjectIdentifierADM.ShortcodeIdentifier = + ProjectIdentifierADM.ShortcodeIdentifier + .fromString("AB12") + .getOrElse(throw new IllegalArgumentException()) + + private val basePathIri: Path = !! / "admin" / "projects" / "iri" + private val basePathShortname: Path = !! / "admin" / "projects" / "shortname" + private val basePathShortcode: Path = !! / "admin" / "projects" / "shortcode" + private val validIriUrlEncoded: String = URLEncoder.encode(projectIri.value.value, "utf-8") + private val validShortname: String = "shortname" + private val validShortcode: String = "AB12" + private val expectedRequestSuccessIri: ProjectGetRequestADM = ProjectGetRequestADM(projectIri) + private val expectedRequestSuccessShortname: ProjectGetRequestADM = ProjectGetRequestADM(projectShortname) + private val expectedRequestSuccessShortcode: ProjectGetRequestADM = ProjectGetRequestADM(projectShortcode) + private val expectedResponseSuccess: ProjectGetResponseADM = + ProjectGetResponseADM( + ProjectADM( + id = "id", + shortname = "shortname", + shortcode = "AB12", + longname = None, + description = List(StringLiteralV2("description")), + keywords = List.empty, + logo = None, + ontologies = 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 expectMessageToProjectResponderIri: ULayer[ActorToZioBridge] = + ActorToZioBridgeMock.AskAppActor + .of[ProjectGetResponseADM] + .apply(Assertion.equalTo(expectedRequestSuccessIri), Expectation.value(expectedResponseSuccess)) + .toLayer + + private val expectMessageToProjectResponderShortname: ULayer[ActorToZioBridge] = + ActorToZioBridgeMock.AskAppActor + .of[ProjectGetResponseADM] + .apply(Assertion.equalTo(expectedRequestSuccessShortname), Expectation.value(expectedResponseSuccess)) + .toLayer + + private val expectMessageToProjectResponderShortcode: ULayer[ActorToZioBridge] = + ActorToZioBridgeMock.AskAppActor + .of[ProjectGetResponseADM] + .apply(Assertion.equalTo(expectedRequestSuccessShortcode), 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(basePathIri / validIriUrlEncoded) + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithValidIri)).flatMap(_.body.asString) + } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) + }.provide(commonLayers, expectMessageToProjectResponderIri), + test("given valid project shortname should respond with success") { + val urlWithValidShortname = URL.empty.setPath(basePathShortname / validShortname) + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithValidShortname)).flatMap(_.body.asString) + } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) + }.provide(commonLayers, expectMessageToProjectResponderShortname), + test("given valid project shortcode should respond with success") { + val urlWithValidShortcode = URL.empty.setPath(basePathShortcode / validShortcode) + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithValidShortcode)).flatMap(_.body.asString) + } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) + }.provide(commonLayers, expectMessageToProjectResponderShortcode), + test("given invalid project iri should respond with bad request") { + val urlWithInvalidIri = URL.empty.setPath(basePathIri / "invalid") + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithInvalidIri)).map(_.status) + } yield assertTrue(actual == Status.BadRequest) + }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM), + test("given invalid project shortname should respond with bad request") { + val urlWithInvalidShortname = URL.empty.setPath(basePathShortname / "123") + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithInvalidShortname)).map(_.status) + } yield assertTrue(actual == Status.BadRequest) + }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM), + test("given invalid project shortcode should respond with bad request") { + val urlWithInvalidShortcode = URL.empty.setPath(basePathShortcode / "invalid") + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithInvalidShortcode)).map(_.status) + } yield assertTrue(actual == Status.BadRequest) + }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM) + ) +} From ec226925a7a577f03cd43fd01a8adbd90ac42857 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 4 Jan 2023 11:20:20 +0100 Subject: [PATCH 7/8] remove unused method --- .../responders/admin/RestProjectsService.scala | 17 ----------------- .../admin/RestProjectsServiceSpec.scala | 10 +--------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala index d4d2f80805..9d06918125 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/RestProjectsService.scala @@ -3,7 +3,6 @@ import zio.Task import zio.URLayer import zio.ZLayer -import org.knora.webapi.IRI 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 @@ -11,22 +10,6 @@ import org.knora.webapi.responders.ActorToZioBridge final case class RestProjectsService(bridge: ActorToZioBridge) { - /** - * Finds the project by an [[IRI]] and returns the information as a [[ProjectGetResponseADM]]. - * - * @param projectIri an [[IRI]] identifying the project - * @return - * '''success''': information about the project as a [[ProjectGetResponseADM]] - * - * '''failure''': [[dsp.errors.NotFoundException]] when no project for the given IRI can be found - * [[dsp.errors.ValidationException]] if the given `projectIri` is invalid - */ - def getSingleProjectADMRequest(projectIri: IRI): Task[ProjectGetResponseADM] = - ProjectIdentifierADM.IriIdentifier - .fromString(projectIri) - .toZIO - .flatMap(getSingleProjectADMRequest(_)) - /** * Finds the project by its [[ProjectIdentifierADM]] and returns the information as a [[ProjectGetResponseADM]]. * diff --git a/webapi/src/test/scala/org/knora/webapi/responders/admin/RestProjectsServiceSpec.scala b/webapi/src/test/scala/org/knora/webapi/responders/admin/RestProjectsServiceSpec.scala index 214f46d624..af3a97dcbc 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/admin/RestProjectsServiceSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/admin/RestProjectsServiceSpec.scala @@ -3,13 +3,11 @@ import zio.Scope import zio.ZIO import zio.mock._ import zio.test.Assertion -import zio.test.SmartAssertionOps import zio.test.Spec import zio.test.TestEnvironment import zio.test.ZIOSpecDefault import zio.test.assertTrue -import dsp.errors.ValidationException import dsp.valueobjects.Project.ShortCode import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetRequestADM @@ -53,12 +51,6 @@ object RestProjectsServiceSpec extends ZIOSpecDefault { actual <- sut.getSingleProjectADMRequest(id) } yield assertTrue(actual == expectedResponse) } - .provide(RestProjectsService.layer, expectSuccess), - test("given an invalid iri should return with a failure") { - for { - sut <- systemUnderTest - result <- sut.getSingleProjectADMRequest("invalid").exit - } yield assertTrue(result.is(_.failure) == ValidationException("Project IRI is invalid.")) - }.provide(RestProjectsService.layer, expectNoInteraction) + .provide(RestProjectsService.layer, expectSuccess) ) } From 422a9602486b638eb11e7f35022f349279c3aa98 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Wed, 4 Jan 2023 11:21:37 +0100 Subject: [PATCH 8/8] restructure tests --- .../routing/admin/ProjectsRouteZSpec.scala | 90 ++++++++++--------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala b/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala index 3267355148..3eff481517 100644 --- a/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/routing/admin/ProjectsRouteZSpec.scala @@ -89,47 +89,53 @@ object ProjectRouteZSpec extends ZIOSpecDefault { val spec: Spec[Any, Serializable] = suite("ProjectsRouteZSpec")( - test("given valid project iri should respond with success") { - val urlWithValidIri = URL.empty.setPath(basePathIri / validIriUrlEncoded) - for { - route <- systemUnderTest - actual <- route.apply(Request(url = urlWithValidIri)).flatMap(_.body.asString) - } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) - }.provide(commonLayers, expectMessageToProjectResponderIri), - test("given valid project shortname should respond with success") { - val urlWithValidShortname = URL.empty.setPath(basePathShortname / validShortname) - for { - route <- systemUnderTest - actual <- route.apply(Request(url = urlWithValidShortname)).flatMap(_.body.asString) - } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) - }.provide(commonLayers, expectMessageToProjectResponderShortname), - test("given valid project shortcode should respond with success") { - val urlWithValidShortcode = URL.empty.setPath(basePathShortcode / validShortcode) - for { - route <- systemUnderTest - actual <- route.apply(Request(url = urlWithValidShortcode)).flatMap(_.body.asString) - } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) - }.provide(commonLayers, expectMessageToProjectResponderShortcode), - test("given invalid project iri should respond with bad request") { - val urlWithInvalidIri = URL.empty.setPath(basePathIri / "invalid") - for { - route <- systemUnderTest - actual <- route.apply(Request(url = urlWithInvalidIri)).map(_.status) - } yield assertTrue(actual == Status.BadRequest) - }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM), - test("given invalid project shortname should respond with bad request") { - val urlWithInvalidShortname = URL.empty.setPath(basePathShortname / "123") - for { - route <- systemUnderTest - actual <- route.apply(Request(url = urlWithInvalidShortname)).map(_.status) - } yield assertTrue(actual == Status.BadRequest) - }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM), - test("given invalid project shortcode should respond with bad request") { - val urlWithInvalidShortcode = URL.empty.setPath(basePathShortcode / "invalid") - for { - route <- systemUnderTest - actual <- route.apply(Request(url = urlWithInvalidShortcode)).map(_.status) - } yield assertTrue(actual == Status.BadRequest) - }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM) + suite("get project by IRI")( + test("given valid project iri should respond with success") { + val urlWithValidIri = URL.empty.setPath(basePathIri / validIriUrlEncoded) + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithValidIri)).flatMap(_.body.asString) + } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) + }.provide(commonLayers, expectMessageToProjectResponderIri), + test("given invalid project iri should respond with bad request") { + val urlWithInvalidIri = URL.empty.setPath(basePathIri / "invalid") + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithInvalidIri)).map(_.status) + } yield assertTrue(actual == Status.BadRequest) + }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM) + ), + suite("get project by shortname")( + test("given valid project shortname should respond with success") { + val urlWithValidShortname = URL.empty.setPath(basePathShortname / validShortname) + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithValidShortname)).flatMap(_.body.asString) + } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) + }.provide(commonLayers, expectMessageToProjectResponderShortname), + test("given invalid project shortname should respond with bad request") { + val urlWithInvalidShortname = URL.empty.setPath(basePathShortname / "123") + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithInvalidShortname)).map(_.status) + } yield assertTrue(actual == Status.BadRequest) + }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM) + ), + suite("get project by shortcode")( + test("given valid project shortcode should respond with success") { + val urlWithValidShortcode = URL.empty.setPath(basePathShortcode / validShortcode) + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithValidShortcode)).flatMap(_.body.asString) + } yield assertTrue(actual == expectedResponseSuccess.toJsValue.toString()) + }.provide(commonLayers, expectMessageToProjectResponderShortcode), + test("given invalid project shortcode should respond with bad request") { + val urlWithInvalidShortcode = URL.empty.setPath(basePathShortcode / "invalid") + for { + route <- systemUnderTest + actual <- route.apply(Request(url = urlWithInvalidShortcode)).map(_.status) + } yield assertTrue(actual == Status.BadRequest) + }.provide(commonLayers, expectNoInteractionWithProjectsResponderADM) + ) ) }