From 33ef89b08ffd781a1f8f8b7919282ef855030046 Mon Sep 17 00:00:00 2001 From: Daniel Bell Date: Tue, 10 Oct 2023 10:41:16 +0200 Subject: [PATCH] add CatsResponseToJsonLdSpec, fix in that too --- .../delta/sdk/ce/CatsResponseToJsonLd.scala | 9 +- .../sdk/ce/CatsResponseToJsonLdSpec.scala | 97 +++++++++++++++++++ 2 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLdSpec.scala diff --git a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLd.scala b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLd.scala index fcbbde44b2..de2f33fd3d 100644 --- a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLd.scala +++ b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLd.scala @@ -116,12 +116,9 @@ object CatsResponseToJsonLd extends FileBytesInstances { } onSuccess(flattened.unsafeToFuture()) { - case Left(complete: Complete[E]) => emit(complete) - case Left(reject: Reject[E]) => emit(reject) - case Right(Left(c)) => - implicit val valueEncoder = c.value.encoder - emit(c.value.value) - + case Left(complete: Complete[E]) => emit(complete) + case Left(reject: Reject[E]) => emit(reject) + case Right(Left(c)) => emit(c) case Right(Right((metadata, content))) => headerValueByType(Accept) { accept => if (accept.mediaRanges.exists(_.matches(metadata.contentType.mediaType))) { diff --git a/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLdSpec.scala b/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLdSpec.scala new file mode 100644 index 0000000000..6d2758a72e --- /dev/null +++ b/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/ce/CatsResponseToJsonLdSpec.scala @@ -0,0 +1,97 @@ +package ch.epfl.bluebrain.nexus.delta.sdk.ce + +import akka.http.scaladsl.model.ContentTypes.`text/plain(UTF-8)` +import akka.http.scaladsl.model.MediaRanges.`*/*` +import akka.http.scaladsl.model.headers.Accept +import akka.http.scaladsl.model.{ContentType, StatusCodes} +import akka.http.scaladsl.server.RouteConcatenation +import akka.stream.scaladsl.Source +import akka.util.ByteString +import ch.epfl.bluebrain.nexus.delta.rdf.RdfMediaTypes.`application/ld+json` +import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.contexts +import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.RemoteContextResolution +import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.encoder.JsonLdEncoder +import ch.epfl.bluebrain.nexus.delta.rdf.syntax.JsonSyntax +import ch.epfl.bluebrain.nexus.delta.rdf.utils.JsonKeyOrdering +import ch.epfl.bluebrain.nexus.delta.sdk.ce.DeltaDirectives._ +import ch.epfl.bluebrain.nexus.delta.sdk.directives.FileResponse +import ch.epfl.bluebrain.nexus.delta.sdk.marshalling.HttpResponseFields +import ch.epfl.bluebrain.nexus.delta.sdk.resources.model.ResourceRejection +import ch.epfl.bluebrain.nexus.delta.sdk.resources.model.ResourceRejection.BlankResourceId +import ch.epfl.bluebrain.nexus.delta.sdk.utils.RouteHelpers +import ch.epfl.bluebrain.nexus.delta.sdk.{AkkaSource, SimpleRejection, SimpleResource} +import ch.epfl.bluebrain.nexus.testkit.ShouldMatchers.convertToAnyShouldWrapper +import ch.epfl.bluebrain.nexus.testkit.TestHelpers.jsonContentOf +import monix.bio.IO +import cats.effect.{IO => CatsIO} +import monix.execution.Scheduler + +class CatsResponseToJsonLdSpec extends RouteHelpers with JsonSyntax with RouteConcatenation { + + implicit val s: Scheduler = Scheduler.global + implicit val rcr: RemoteContextResolution = + RemoteContextResolution.fixed( + SimpleResource.contextIri -> SimpleResource.context, + SimpleRejection.contextIri -> SimpleRejection.context, + contexts.error -> jsonContentOf("/contexts/error.json").topContextValueOrEmpty + ) + implicit val jo: JsonKeyOrdering = JsonKeyOrdering.default() + + private def responseWithSourceError[E: JsonLdEncoder: HttpResponseFields](error: E) = { + responseWith( + `text/plain(UTF-8)`, + IO.raiseError(error) + ) + } + + private val expectedBlankIdErrorResponse = jsonContentOf( + "/directives/blank-id.json" + ) + + private val FileContents = "hello" + + private def fileSourceOfString(value: String) = { + IO.pure(Source.single(ByteString(value))) + } + + private def responseWith[E: JsonLdEncoder: HttpResponseFields]( + contentType: ContentType, + contents: IO[E, AkkaSource] + ) = { + CatsIO.pure( + Right( + FileResponse( + "file.name", + contentType, + 1024, + contents + ) + ) + ) + } + + private def request = { + Get() ~> Accept(`*/*`) + } + + "ResponseToJsonLd file handling" should { + + "Return the contents of a file" in { + request ~> emit( + responseWith(`text/plain(UTF-8)`, fileSourceOfString(FileContents)) + ) ~> check { + status shouldEqual StatusCodes.OK + contentType shouldEqual `text/plain(UTF-8)` + response.asString shouldEqual FileContents + } + } + + "Return an error from a file content IO" in { + request ~> emit(responseWithSourceError[ResourceRejection](BlankResourceId)) ~> check { + status shouldEqual StatusCodes.BadRequest // BlankResourceId is supposed to result in BadRequest + contentType.mediaType shouldEqual `application/ld+json` + response.asJson shouldEqual expectedBlankIdErrorResponse + } + } + } +}