diff --git a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala index ce497ed5e1..cb44236903 100644 --- a/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/it/v2/KnoraSipiIntegrationV2ITSpec.scala @@ -442,12 +442,13 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = UploadFileRequest .make( - fileType = FileType.StillImageFile, - internalFilename = uploadedFile.internalFilename, + fileType = FileType.StillImageFile(), + internalFilename = uploadedFile.internalFilename + ) + .toJsonLd( className = Some("ThingPicture"), ontologyName = "anything" ) - .toJsonLd val request = Post( s"$baseApiUrl/v2/resources", @@ -511,10 +512,10 @@ class KnoraSipiIntegrationV2ITSpec val uploadedFile: SipiUploadResponseEntry = sipiUploadResponse.uploadedFiles.head uploadedFile.originalFilename should ===(trp88OriginalFilename) - // JSON describing the new image to Knora. + // JSON describing the new image to the API. val jsonLdEntity = ChangeFileRequest .make( - fileType = FileType.StillImageFile, + fileType = FileType.StillImageFile(), internalFilename = uploadedFile.internalFilename, resourceIri = stillImageResourceIri.get, valueIri = stillImageFileValueIri.get, @@ -567,7 +568,7 @@ class KnoraSipiIntegrationV2ITSpec // JSON describing the new image to Knora. val jsonLdEntity = ChangeFileRequest .make( - fileType = FileType.StillImageFile, + fileType = FileType.StillImageFile(), internalFilename = internalFilename, resourceIri = stillImageResourceIri.get, valueIri = stillImageFileValueIri.get, @@ -605,12 +606,13 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = UploadFileRequest .make( - fileType = FileType.DocumentFile, + fileType = FileType.DocumentFile(), + internalFilename = uploadedFile.internalFilename + ) + .toJsonLd( className = Some("ThingDocument"), - internalFilename = uploadedFile.internalFilename, ontologyName = "anything" ) - .toJsonLd val request = Post( s"$baseApiUrl/v2/resources", @@ -668,7 +670,7 @@ class KnoraSipiIntegrationV2ITSpec // Update the value. val jsonLdEntity = ChangeFileRequest .make( - fileType = FileType.DocumentFile, + fileType = FileType.DocumentFile(), internalFilename = uploadedFile.internalFilename, resourceIri = pdfResourceIri.get, valueIri = pdfValueIri.get, @@ -721,12 +723,13 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = UploadFileRequest .make( - fileType = FileType.DocumentFile, + fileType = FileType.DocumentFile(), + internalFilename = uploadedFile.internalFilename + ) + .toJsonLd( className = Some("ThingDocument"), - internalFilename = uploadedFile.internalFilename, ontologyName = "anything" ) - .toJsonLd val request = Post( s"$baseApiUrl/v2/resources", @@ -754,7 +757,7 @@ class KnoraSipiIntegrationV2ITSpec fileType = FileType.TextFile, internalFilename = uploadedFile.internalFilename ) - .toJsonLd + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -858,8 +861,8 @@ class KnoraSipiIntegrationV2ITSpec // Create the resource in the API. val jsonLdEntity = UploadFileRequest - .make(fileType = FileType.StillImageFile, internalFilename = uploadedFile.internalFilename) - .toJsonLd + .make(fileType = FileType.StillImageFile(), internalFilename = uploadedFile.internalFilename) + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -884,7 +887,7 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = UploadFileRequest .make(fileType = FileType.TextFile, internalFilename = uploadedFile.internalFilename) - .toJsonLd + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -989,7 +992,7 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = UploadFileRequest .make(fileType = FileType.TextFile, internalFilename = uploadedFile.internalFilename) - .toJsonLd + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -1013,7 +1016,7 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = UploadFileRequest .make(fileType = FileType.ArchiveFile, internalFilename = uploadedFile.internalFilename) - .toJsonLd + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -1121,7 +1124,7 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = UploadFileRequest .make(fileType = FileType.ArchiveFile, internalFilename = uploadedFile.internalFilename) - .toJsonLd + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -1180,7 +1183,7 @@ class KnoraSipiIntegrationV2ITSpec // Create the resource in the API. val jsonLdEntity = UploadFileRequest .make(fileType = FileType.AudioFile, internalFilename = uploadedFile.internalFilename) - .toJsonLd + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -1285,8 +1288,8 @@ class KnoraSipiIntegrationV2ITSpec // Create the resource in the API. val jsonLdEntity = UploadFileRequest - .make(fileType = FileType.MovingImageFile, internalFilename = uploadedFile.internalFilename) - .toJsonLd + .make(fileType = FileType.MovingImageFile(), internalFilename = uploadedFile.internalFilename) + .toJsonLd() val request = Post( s"$baseApiUrl/v2/resources", @@ -1344,7 +1347,7 @@ class KnoraSipiIntegrationV2ITSpec val jsonLdEntity = ChangeFileRequest .make( - fileType = FileType.MovingImageFile, + fileType = FileType.MovingImageFile(), resourceIri = videoResourceIri.get, internalFilename = uploadedFile.internalFilename, valueIri = videoValueIri.get diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala index 4ceec7944a..0a27da8d7d 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelUtil.scala @@ -5,62 +5,179 @@ package org.knora.webapi.models.filemodels +import org.knora.webapi.ApiV2Complex import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.v2.responder.valuemessages.{ + ArchiveFileValueContentV2, + AudioFileValueContentV2, + DocumentFileValueContentV2, + FileValueContentV2, + FileValueV2, + MovingImageFileValueContentV2, + StillImageFileValueContentV2, + TextFileValueContentV2 +} object FileModelUtil { private implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance def getFileRepresentationClassIri(fileType: FileType): SmartIri = fileType match { - case FileType.DocumentFile => OntologyConstants.KnoraApiV2Complex.DocumentRepresentation.toSmartIri - case FileType.StillImageFile => OntologyConstants.KnoraApiV2Complex.StillImageRepresentation.toSmartIri - case FileType.MovingImageFile => OntologyConstants.KnoraApiV2Complex.MovingImageRepresentation.toSmartIri - case FileType.TextFile => OntologyConstants.KnoraApiV2Complex.TextRepresentation.toSmartIri - case FileType.AudioFile => OntologyConstants.KnoraApiV2Complex.AudioRepresentation.toSmartIri - case FileType.ArchiveFile => OntologyConstants.KnoraApiV2Complex.ArchiveRepresentation.toSmartIri + case FileType.DocumentFile(_, _, _) => OntologyConstants.KnoraApiV2Complex.DocumentRepresentation.toSmartIri + case FileType.StillImageFile(_, _) => OntologyConstants.KnoraApiV2Complex.StillImageRepresentation.toSmartIri + case FileType.MovingImageFile(_, _) => OntologyConstants.KnoraApiV2Complex.MovingImageRepresentation.toSmartIri + case FileType.TextFile => OntologyConstants.KnoraApiV2Complex.TextRepresentation.toSmartIri + case FileType.AudioFile => OntologyConstants.KnoraApiV2Complex.AudioRepresentation.toSmartIri + case FileType.ArchiveFile => OntologyConstants.KnoraApiV2Complex.ArchiveRepresentation.toSmartIri } def getFileRepresentationPropertyIri(fileType: FileType): SmartIri = fileType match { - case FileType.DocumentFile => OntologyConstants.KnoraApiV2Complex.HasDocumentFileValue.toSmartIri - case FileType.StillImageFile => OntologyConstants.KnoraApiV2Complex.HasStillImageFileValue.toSmartIri - case FileType.MovingImageFile => OntologyConstants.KnoraApiV2Complex.HasMovingImageFileValue.toSmartIri - case FileType.TextFile => OntologyConstants.KnoraApiV2Complex.HasTextFileValue.toSmartIri - case FileType.AudioFile => OntologyConstants.KnoraApiV2Complex.HasAudioFileValue.toSmartIri - case FileType.ArchiveFile => OntologyConstants.KnoraApiV2Complex.HasArchiveFileValue.toSmartIri + case FileType.DocumentFile(_, _, _) => OntologyConstants.KnoraApiV2Complex.HasDocumentFileValue.toSmartIri + case FileType.StillImageFile(_, _) => OntologyConstants.KnoraApiV2Complex.HasStillImageFileValue.toSmartIri + case FileType.MovingImageFile(_, _) => OntologyConstants.KnoraApiV2Complex.HasMovingImageFileValue.toSmartIri + case FileType.TextFile => OntologyConstants.KnoraApiV2Complex.HasTextFileValue.toSmartIri + case FileType.AudioFile => OntologyConstants.KnoraApiV2Complex.HasAudioFileValue.toSmartIri + case FileType.ArchiveFile => OntologyConstants.KnoraApiV2Complex.HasArchiveFileValue.toSmartIri } def getFileValuePropertyName(fileType: FileType): String = fileType match { - case FileType.DocumentFile => "knora-api:hasDocumentFileValue" - case FileType.StillImageFile => "knora-api:hasStillImageFileValue" - case FileType.MovingImageFile => "knora-api:hasMovingImageFileValue" - case FileType.TextFile => "knora-api:hasTextFileValue" - case FileType.AudioFile => "knora-api:hasAudioFileValue" - case FileType.ArchiveFile => "knora-api:hasArchiveFileValue" + case FileType.DocumentFile(_, _, _) => "knora-api:hasDocumentFileValue" + case FileType.StillImageFile(_, _) => "knora-api:hasStillImageFileValue" + case FileType.MovingImageFile(_, _) => "knora-api:hasMovingImageFileValue" + case FileType.TextFile => "knora-api:hasTextFileValue" + case FileType.AudioFile => "knora-api:hasAudioFileValue" + case FileType.ArchiveFile => "knora-api:hasArchiveFileValue" } def getDefaultClassName(fileType: FileType): String = fileType match { - case FileType.DocumentFile => "DocumentRepresentation" - case FileType.StillImageFile => "StillImageRepresentation" - case FileType.MovingImageFile => "MovingImageRepresentation" - case FileType.TextFile => "TextRepresentation" - case FileType.AudioFile => "AudioRepresentation" - case FileType.ArchiveFile => "ArchiveRepresentation" + case FileType.DocumentFile(_, _, _) => "DocumentRepresentation" + case FileType.StillImageFile(_, _) => "StillImageRepresentation" + case FileType.MovingImageFile(_, _) => "MovingImageRepresentation" + case FileType.TextFile => "TextRepresentation" + case FileType.AudioFile => "AudioRepresentation" + case FileType.ArchiveFile => "ArchiveRepresentation" } def getFileValueType(fileType: FileType): String = fileType match { - case FileType.DocumentFile => "knora-api:DocumentFileValue" - case FileType.StillImageFile => "knora-api:StillImageFileValue" - case FileType.MovingImageFile => "knora-api:MovingImageFileValue" - case FileType.TextFile => "knora-api:TextFileValue" - case FileType.AudioFile => "knora-api:AudioFileValue" - case FileType.ArchiveFile => "knora-api:ArchiveFileValue" + case FileType.DocumentFile(_, _, _) => "knora-api:DocumentFileValue" + case FileType.StillImageFile(_, _) => "knora-api:StillImageFileValue" + case FileType.MovingImageFile(_, _) => "knora-api:MovingImageFileValue" + case FileType.TextFile => "knora-api:TextFileValue" + case FileType.AudioFile => "knora-api:AudioFileValue" + case FileType.ArchiveFile => "knora-api:ArchiveFileValue" + } + + def getFileValueTypeIRI(fileType: FileType): SmartIri = fileType match { + case FileType.DocumentFile(_, _, _) => OntologyConstants.KnoraApiV2Complex.DocumentFileValue.toSmartIri + case FileType.StillImageFile(_, _) => OntologyConstants.KnoraApiV2Complex.StillImageFileValue.toSmartIri + case FileType.MovingImageFile(_, _) => OntologyConstants.KnoraApiV2Complex.MovingImageFileValue.toSmartIri + case FileType.TextFile => OntologyConstants.KnoraApiV2Complex.TextFileValue.toSmartIri + case FileType.AudioFile => OntologyConstants.KnoraApiV2Complex.AudioFileValue.toSmartIri + case FileType.ArchiveFile => OntologyConstants.KnoraApiV2Complex.AudioFileValue.toSmartIri } - def getJsonLdContext(ontology: String): String = { + def getFileValueContent( + fileType: FileType, + internalFilename: String, + internalMimeType: Option[String], + originalFilename: Option[String], + originalMimeType: Option[String], + comment: Option[String] + ): FileValueContentV2 = + fileType match { + case FileType.DocumentFile(pageCount, dimX, dimY) => + DocumentFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = internalFilename, + internalMimeType = internalMimeType match { + case Some(v) => v + case None => "application/pdf" + }, + originalFilename = originalFilename, + originalMimeType = originalMimeType match { + case Some(_) => originalMimeType + case None => Some("application/pdf") + } + ), + pageCount = pageCount, + dimX = dimX, + dimY = dimY, + comment = comment + ) + case FileType.StillImageFile(dimX, dimY) => + StillImageFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = internalFilename, + internalMimeType = internalMimeType match { + case Some(v) => v + case None => "image/jp2" + }, + originalFilename = originalFilename, + originalMimeType = originalMimeType + ), + dimX = dimX, + dimY = dimY, + comment = comment + ) + case FileType.MovingImageFile(dimX, dimY) => + MovingImageFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = internalFilename, + internalMimeType = internalMimeType.get, + originalFilename = originalFilename, + originalMimeType = internalMimeType + ), + dimX = dimX, + dimY = dimY + ) + case FileType.TextFile => + TextFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = internalFilename, + internalMimeType = internalMimeType.get, + originalFilename = originalFilename, + originalMimeType = internalMimeType + ) + ) + case FileType.AudioFile => + AudioFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = internalFilename, + internalMimeType = internalMimeType.get, + originalFilename = originalFilename, + originalMimeType = internalMimeType + ) + ) + case FileType.ArchiveFile => + ArchiveFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = internalFilename, + internalMimeType = internalMimeType match { + case Some(v) => v + case None => "application/zip" + }, + originalFilename = originalFilename, + originalMimeType = internalMimeType + ), + comment = comment + ) + } + + def getJsonLdContext(ontology: String, ontologyIRI: Option[String] = None): String = { val ontologies = ontology match { case "anything" => FileModelConstants.defaultJsonLdContextMap + ("anything" -> "http://0.0.0.0:3333/ontology/0001/anything/v2#") - case _ => FileModelConstants.defaultJsonLdContextMap + case prefix => + ontologyIRI match { + case Some(iri) => FileModelConstants.defaultJsonLdContextMap + (prefix -> iri) + case None => FileModelConstants.defaultJsonLdContextMap + } } val lines = ontologies.toList .map(x => s""" "${x._1}": "${x._2}\"""") @@ -94,9 +211,13 @@ object FileModelConstants { sealed trait FileType object FileType { - case object DocumentFile extends FileType - case object StillImageFile extends FileType - case object MovingImageFile extends FileType + case class DocumentFile( + pageCount: Option[Int] = Some(1), + dimX: Option[Int] = Some(100), + dimY: Option[Int] = Some(100) + ) extends FileType + case class StillImageFile(dimX: Int = 100, dimY: Int = 100) extends FileType + case class MovingImageFile(dimX: Int = 100, dimY: Int = 100) extends FileType case object TextFile extends FileType case object AudioFile extends FileType case object ArchiveFile extends FileType diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala index 5fb3dabd73..07921b8062 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModels.scala @@ -5,19 +5,12 @@ package org.knora.webapi.models.filemodels -import org.knora.webapi.ApiV2Complex +import org.knora.webapi.feature.FeatureFactoryConfig import org.knora.webapi.messages.IriConversions._ import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM +import org.knora.webapi.messages.admin.responder.usersmessages.UserADM import org.knora.webapi.messages.v2.responder.resourcemessages.{CreateResourceV2, CreateValueInNewResourceV2} -import org.knora.webapi.messages.v2.responder.valuemessages.{ - ArchiveFileValueContentV2, - AudioFileValueContentV2, - DocumentFileValueContentV2, - FileValueV2, - MovingImageFileValueContentV2, - StillImageFileValueContentV2, - TextFileValueContentV2 -} +import org.knora.webapi.messages.v2.responder.valuemessages.{UpdateValueContentV2, UpdateValueRequestV2} import org.knora.webapi.messages.{SmartIri, StringFormatter} import org.knora.webapi.sharedtestdata.SharedTestDataADM @@ -27,38 +20,34 @@ import java.util.UUID sealed abstract case class UploadFileRequest private ( fileType: FileType, internalFilename: String, - className: String, - ontologyName: String, - shortcode: String, - resourceIri: String, - dimX: Option[Int], - dimY: Option[Int], - pageCount: Option[Int], - comment: Option[String], - internalMimeType: Option[String], - originalFilename: Option[String], - originalMimeType: Option[String], - customValueIri: Option[SmartIri], - customValueUUID: Option[UUID], - customValueCreationDate: Option[Instant], - valuePermissions: Option[String], - label: String, - resourcePermissions: Option[String], - project: ProjectADM + label: String ) { /** * Create a JSON-LD serialization of the request. This can be used for e2e and integration tests. * + * @param className the class name of the resource. Optional. + * @param ontologyName the name of the ontology to be prefixed to the class name. Defaults to `"knora-api"` + * @param shortcode the shortcode of the project to which the resource should be added. Defaults to `"0001"` + * @param ontologyIRI IRI of the ontology, to which the prefix should resolve. Optional. * @return JSON-LD serialization of the request. */ - def toJsonLd: String = { + def toJsonLd( + shortcode: String = "0001", + ontologyName: String = "knora-api", + className: Option[String] = None, + ontologyIRI: Option[String] = None + ): String = { val fileValuePropertyName = FileModelUtil.getFileValuePropertyName(fileType) val fileValueType = FileModelUtil.getFileValueType(fileType) - val context = FileModelUtil.getJsonLdContext(ontologyName) + val context = FileModelUtil.getJsonLdContext(ontologyName, ontologyIRI) + val classNameWithDefaults = className match { + case Some(v) => v + case None => FileModelUtil.getDefaultClassName(fileType) + } s"""{ - | "@type" : "$ontologyName:$className", + | "@type" : "$ontologyName:$classNameWithDefaults", | "$fileValuePropertyName" : { | "@type" : "$fileValueType", | "knora-api:fileValueHasFilename" : "$internalFilename" @@ -66,93 +55,78 @@ sealed abstract case class UploadFileRequest private ( | "knora-api:attachedToProject" : { | "@id" : "http://rdfh.ch/projects/$shortcode" | }, - | "rdfs:label" : "test label", + | "rdfs:label" : "$label", | $context}""".stripMargin } - def toMessage: CreateResourceV2 = { + /** + * Represents the present [[UploadFileRequest]] as a [[CreateResourceV2]]. + * + * Various custom values can be supplied. If not, reasonable default values for testing purposes will be used. + * + * @param resourceIri the custom IRI of the resource. Optional. Defaults to None. If None, a random IRI is generated + * @param comment comment. Optional. + * @param internalMimeType internal mime type as determined by SIPI. Optional. + * @param originalMimeType original mime type previous to uploading to SIPI. Optional. + * @param originalFilename original filename previous to uploading to SIPI. Optional. + * @param customValueIri custom IRI for the value. Optional. Defaults to None. + * If None, an IRI will be generated. + * @param customValueUUID custom UUID for the value. Optional. Defaults to None. + * If None, a UUID will be generated. + * @param customValueCreationDate custom creation date for the value. Optional. Defaults to None. + * If None, the current instant will be used. + * @param valuePermissions custom permissions for the value. Optional. Defaults to None. + * If `None`, the default permissions will be used. + * @param resourcePermissions permissions for the resource. Optional. If none, the default permissions are used. + * @param resourceCreationDate custom creation date of the resource. Optional. + * @param valuePropertyIRI property IRI of the value. Optional. + * @param resourceClassIRI resource class IRI. Optional. + * @param project the project to which the resource belongs. Optional. Defaults to None. + * If None, [[SharedTestDataADM.anythingProject]] is used. + * @return a [[CreateResourceV2]] representation of the [[UploadFileRequest]] + */ + def toMessage( + resourceIri: Option[String] = None, + internalMimeType: Option[String] = None, + originalFilename: Option[String] = None, + originalMimeType: Option[String] = None, + comment: Option[String] = None, + customValueIri: Option[SmartIri] = None, + customValueUUID: Option[UUID] = None, + customValueCreationDate: Option[Instant] = None, + valuePermissions: Option[String] = None, + resourcePermissions: Option[String] = None, + resourceCreationDate: Option[Instant] = None, + resourceClassIRI: Option[SmartIri] = None, + valuePropertyIRI: Option[SmartIri] = None, + project: Option[ProjectADM] = None + ): CreateResourceV2 = { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - val resourceClassIri: SmartIri = FileModelUtil.getFileRepresentationClassIri(fileType) - val fileValuePropertyIri: SmartIri = FileModelUtil.getFileRepresentationPropertyIri(fileType) - val valueContent = fileType match { - case FileType.DocumentFile => - DocumentFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = internalFilename, - internalMimeType = internalMimeType match { - case Some(v) => v - case None => "application/pdf" - }, - originalFilename = originalFilename, - originalMimeType = Some("application/pdf") - ), - pageCount = pageCount, - dimX = dimX, - dimY = dimY, - comment = comment - ) - case FileType.StillImageFile => - StillImageFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = internalFilename, - internalMimeType = "image/jp2", - originalFilename = originalFilename, - originalMimeType = originalMimeType - ), - dimX = dimX.get, - dimY = dimY.get, - comment = comment - ) - case FileType.MovingImageFile => - MovingImageFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = internalFilename, - internalMimeType = internalMimeType.get, - originalFilename = originalFilename, - originalMimeType = internalMimeType - ), - dimX = dimX.get, - dimY = dimY.get - ) - case FileType.TextFile => - TextFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = internalFilename, - internalMimeType = internalMimeType.get, - originalFilename = originalFilename, - originalMimeType = internalMimeType - ) - ) - case FileType.AudioFile => - AudioFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = internalFilename, - internalMimeType = internalMimeType.get, - originalFilename = originalFilename, - originalMimeType = internalMimeType - ) - ) - case FileType.ArchiveFile => - ArchiveFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = internalFilename, - internalMimeType = internalMimeType match { - case Some(v) => v - case None => "application/zip" - }, - originalFilename = originalFilename, - originalMimeType = internalMimeType - ), - comment = comment - ) + val projectOrDefault = project match { + case Some(p) => p + case None => SharedTestDataADM.anythingProject + } + val resourceIRIOrDefault = resourceIri match { + case Some(value) => value + case None => stringFormatter.makeRandomResourceIri(projectOrDefault.shortcode) } + val resourceClassIRIOrDefault: SmartIri = resourceClassIRI match { + case Some(iri) => iri + case None => FileModelUtil.getFileRepresentationClassIri(fileType) + } + val fileValuePropertyIRIOrDefault: SmartIri = valuePropertyIRI match { + case Some(iri) => iri + case None => FileModelUtil.getFileRepresentationPropertyIri(fileType) + } + val valueContent = FileModelUtil.getFileValueContent( + fileType = fileType, + internalFilename = internalFilename, + internalMimeType = internalMimeType, + originalFilename = originalFilename, + originalMimeType = originalMimeType, + comment = comment + ) val values = List( CreateValueInNewResourceV2( @@ -163,15 +137,16 @@ sealed abstract case class UploadFileRequest private ( permissions = valuePermissions ) ) - val inputValues: Map[SmartIri, Seq[CreateValueInNewResourceV2]] = Map(fileValuePropertyIri -> values) + val inputValues: Map[SmartIri, Seq[CreateValueInNewResourceV2]] = Map(fileValuePropertyIRIOrDefault -> values) CreateResourceV2( - resourceIri = Some(resourceIri.toSmartIri), - resourceClassIri = resourceClassIri, + resourceIri = Some(resourceIRIOrDefault.toSmartIri), + resourceClassIri = resourceClassIRIOrDefault, label = label, values = inputValues, - projectADM = project, - permissions = resourcePermissions + projectADM = projectOrDefault, + permissions = resourcePermissions, + creationDate = resourceCreationDate ) } } @@ -191,110 +166,22 @@ object UploadFileRequest { /** * Smart constructor for instantiating a [[UploadFileRequest]]. * - * @param fileType the [[FileType]] of the resource. - * @param internalFilename the internal file name assigned by SIPI. - * @param className the class name of the resource. Optional. - * @param ontologyName the name of the ontology to be prefixed to the class name. Defaults to `"knora-api"` - * @param shortcode the shortcode of the project to which the resource should be added. Defaults to `"0001"` - * @param resourceIri the custom IRI of the resource. Optional. Defaults to None. If None, a random IRI is generated - * @param dimX the width of the file, if applicable. Optional. Defaults to None. - * If None, the file type specific default is used. - * @param dimY the height of the file, if applicable. Optional. Defaults to None. - * If None, the file type specific default is used. - * @param pageCount the page count of the file, if applicable. Optional. Defaults to None. - * If None, the file type specific default is used. - * @param comment comment. Optional. - * @param internalMimeType internal mime type as determined by SIPI. Optional. - * @param originalMimeType original mime type previous to uploading to SIPI. Optional. - * @param originalFilename original filename previous to uploading to SIPI. Optional. - * @param customValueIri custom IRI for the value. Optional. Defaults to None. - * If None, an IRI will be generated. - * @param customValueUUID custom UUID for the value. Optional. Defaults to None. - * If None, a UUID will be generated. - * @param customValueCreationDate custom creation date for the value. Optional. Defaults to None. - * If None, the current instant will be used. - * @param valuePermissions custom permissions for the value. Optional. Defaults to None. - * If `None`, the default permissions will be used. - * @param label the resource label - * @param resourcePermissions permissions for the resource. Optional. If none, the default permissions are used. - * @param project the project to which the resource belongs. Optional. Defaults to None. - * If None, [[SharedTestDataADM.anythingProject]] is used. + * @param fileType the [[FileType]] of the resource. + * @param internalFilename the internal file name assigned by SIPI. + * @param label the rdf:label * @return returns a [[UploadFileRequest]] object storing all information needed to generate a Message * or JSON-LD serialization that can be used to generate the respective resource in the API. */ - def make( fileType: FileType, internalFilename: String, - className: Option[String] = None, - ontologyName: String = "knora-api", - shortcode: String = "0001", - resourceIri: Option[String] = None, - dimX: Option[Int] = None, - dimY: Option[Int] = None, - pageCount: Option[Int] = None, - comment: Option[String] = None, - internalMimeType: Option[String] = None, - originalFilename: Option[String] = None, - originalMimeType: Option[String] = None, - customValueIri: Option[SmartIri] = None, - customValueUUID: Option[UUID] = None, - customValueCreationDate: Option[Instant] = None, - valuePermissions: Option[String] = None, - label: String = "test label", - resourcePermissions: Option[String] = None, - project: Option[ProjectADM] = None - ): UploadFileRequest = { - val classNameWithDefaults = className match { - case Some(v) => v - case None => FileModelUtil.getDefaultClassName(fileType) - } - val iri = resourceIri match { - case Some(value) => value - case None => stringFormatter.makeRandomResourceIri(shortcode) - } - val (dimXWithDefaults, dimYWithDefaults) = fileType match { - case FileType.DocumentFile | FileType.StillImageFile | FileType.MovingImageFile => - (dimX, dimY) match { - case (Some(x), Some(y)) => (Some(x), Some(y)) - case _ => (Some(100), Some(100)) - } - case FileType.TextFile | FileType.AudioFile | FileType.ArchiveFile => (None, None) - } - val pageCountWithDefaults = fileType match { - case FileType.DocumentFile => - pageCount match { - case Some(value) => Some(value) - case None => Some(1) - } - case _ => None - } + label: String = "test label" + ): UploadFileRequest = new UploadFileRequest( fileType = fileType, internalFilename = internalFilename, - className = classNameWithDefaults, - ontologyName = ontologyName, - shortcode = shortcode, - resourceIri = iri, - dimX = dimXWithDefaults, - dimY = dimYWithDefaults, - pageCount = pageCountWithDefaults, - comment = comment, - internalMimeType = internalMimeType, - originalFilename = originalFilename, - originalMimeType = originalMimeType, - customValueIri = customValueIri, - customValueUUID = customValueUUID, - customValueCreationDate = customValueCreationDate, - valuePermissions = valuePermissions, - label = label, - resourcePermissions = resourcePermissions, - project = project match { - case Some(p) => p - case None => SharedTestDataADM.anythingProject - } + label = label ) {} - } } sealed abstract case class ChangeFileRequest private ( @@ -327,6 +214,61 @@ sealed abstract case class ChangeFileRequest private ( | $context |}""".stripMargin } + + /** + * @param featureFactoryConfig the featureFactoryConfig + * @param internalMimeType internal mimetype, as provided by SIPI. Optional. + * @param originalFilename original filename before the upload. Optional. + * @param originalMimeType file mimetype before the upload. Optional. + * @param comment rdfs:comment to the change. Optional. + * @param requestingUser the user issuing the request. Optional. + * @param permissions permissions of the updated file value. Optional. + * @param valueCreationDate custom creation date of the updated value. Optional. + * @param newValueVersionIri custom IRI of the new version of the value. Optional. + * @param resourceClassIRI the resource class IRI. Optional. + * @return + */ + def toMessage( + featureFactoryConfig: FeatureFactoryConfig, + internalMimeType: Option[String] = None, + originalFilename: Option[String] = None, + originalMimeType: Option[String] = None, + comment: Option[String] = None, + requestingUser: UserADM = SharedTestDataADM.rootUser, + permissions: Option[String] = None, + valueCreationDate: Option[Instant] = None, + newValueVersionIri: Option[SmartIri] = None, + resourceClassIRI: Option[SmartIri] = None + ): UpdateValueRequestV2 = { + val propertyIRI = FileModelUtil.getFileRepresentationPropertyIri(fileType) + val resourceClassIRIWithDefault = resourceClassIRI match { + case Some(value) => value + case None => FileModelUtil.getFileValueTypeIRI(fileType) + } + val valueContent = FileModelUtil.getFileValueContent( + fileType = fileType, + internalFilename = internalFilename, + internalMimeType = internalMimeType, + originalFilename = originalFilename, + originalMimeType = originalMimeType, + comment = comment + ) + UpdateValueRequestV2( + updateValue = UpdateValueContentV2( + resourceIri = resourceIRI, + resourceClassIri = resourceClassIRIWithDefault, + propertyIri = propertyIRI, + valueIri = valueIRI, + valueContent = valueContent, + permissions = permissions, + valueCreationDate = valueCreationDate, + newValueVersionIri = newValueVersionIri + ), + featureFactoryConfig = featureFactoryConfig, + requestingUser = requestingUser, + apiRequestID = UUID.randomUUID + ) + } } /** diff --git a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala index 90ded1bed1..775e563976 100644 --- a/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/models/filemodels/FileModelsSpec.scala @@ -1,15 +1,31 @@ package org.knora.webapi.models.filemodels -import org.knora.webapi.CoreSpec +import org.knora.webapi.{ApiV2Complex, CoreSpec} +import org.knora.webapi.exceptions.AssertionException import org.knora.webapi.messages.StringFormatter import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.messages.IriConversions._ +import org.knora.webapi.messages.v2.responder.resourcemessages.{CreateResourceV2, CreateValueInNewResourceV2} +import org.knora.webapi.messages.v2.responder.valuemessages.{ + DocumentFileValueContentV2, + FileValueV2, + UpdateValueContentV2, + UpdateValueRequestV2 +} import java.time.Instant import java.util.UUID +import spray.json._ +import spray.json.DefaultJsonProtocol._ class FileModelsSpec extends CoreSpec { implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance + private val fileNamePDF = "document-file.pdf" + private val fileNameImage = "image.jp2" + private val fileNameVideo = "video.mp4" + private val fileNameAudio = "audio.mpeg" + private val fileNameText = "text.txt" + private val fileNameArchive = "archive.zip" "FileModelsUtil," when { @@ -29,7 +45,7 @@ class FileModelsSpec extends CoreSpec { context should equal(expectedContext) } - "handle non-specified ontology correctly" in { + "handle non-specified ontology correctly if no ontology IRI is provided" in { val expectedContext = """"@context" : { | "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", | "knora-api": "http://api.knora.org/ontology/knora-api/v2#", @@ -41,131 +57,677 @@ class FileModelsSpec extends CoreSpec { val context = FileModelUtil.getJsonLdContext("knora-api") context should equal(expectedContext) } + + "handle non-specified ontology correctly if an ontology IRI is provided" in { + val expectedContext = """"@context" : { + | "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + | "knora-api": "http://api.knora.org/ontology/knora-api/v2#", + | "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + | "xsd": "http://www.w3.org/2001/XMLSchema#", + | "biblio": "http://www.knora.org/ontology/0801/biblio" + | } + |""".stripMargin + + val context = FileModelUtil.getJsonLdContext( + ontology = "biblio", + ontologyIRI = Some("http://www.knora.org/ontology/0801/biblio") + ) + context should equal(expectedContext) + } + } } + "FileModels," when { + "creating an UploadFileRequest," should { + "create a valid representation of a DocumentRepresentation with default values" in { - val internalFilename = "document-file.pdf" val documentRepresentation = UploadFileRequest.make( - fileType = FileType.DocumentFile, - internalFilename = internalFilename + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF ) - documentRepresentation.fileType should equal(FileType.DocumentFile) - documentRepresentation.internalFilename should equal(internalFilename) - documentRepresentation.internalMimeType should equal(None) - documentRepresentation.dimX should equal(Some(100)) - documentRepresentation.dimY should equal(Some(100)) - documentRepresentation.resourcePermissions should equal(None) - documentRepresentation.customValueUUID should equal(None) - documentRepresentation.project should equal(SharedTestDataADM.anythingProject) - documentRepresentation.customValueIri should equal(None) - documentRepresentation.className should equal(FileModelUtil.getDefaultClassName(FileType.DocumentFile)) - documentRepresentation.comment should equal(None) - documentRepresentation.customValueCreationDate should equal(None) - documentRepresentation.label should equal("test label") - documentRepresentation.ontologyName should equal("knora-api") - documentRepresentation.originalFilename should equal(None) - documentRepresentation.originalMimeType should equal(None) - documentRepresentation.pageCount should equal(Some(1)) - documentRepresentation.resourceIri should not equal (None) - documentRepresentation.shortcode should equal("0001") - documentRepresentation.valuePermissions should equal(None) + documentRepresentation.fileType match { + case FileType.DocumentFile(pg, x, y) => + pg should equal(Some(1)) + x should equal(Some(100)) + y should equal(Some(100)) + case _ => + throw AssertionException(s"FileType ${documentRepresentation.fileType} did not match DocumentFile(_, _, _)") + } + documentRepresentation.internalFilename should equal(fileNamePDF) } "create a valid representation of a DocumentRepresentation with custom values" in { val internalFilename = "document-file.doc" - val project = SharedTestDataADM.beolProject - val resourceIri = stringFormatter.makeRandomResourceIri(project.shortcode) - val comment = Some("This is a custom comment") - val className = Some("biblio:ThingDocument") - val ontologyName = "biblio" val dimX = Some(20) val dimY = Some(30) val pageCount = Some(550) + val customLabel = "a custom label" + val documentRepresentation = UploadFileRequest.make( + fileType = FileType.DocumentFile( + pageCount = pageCount, + dimX = dimX, + dimY = dimY + ), + internalFilename = internalFilename, + label = customLabel + ) + documentRepresentation.fileType match { + case FileType.DocumentFile(pg, x, y) => + pg should equal(pageCount) + x should equal(dimX) + y should equal(dimY) + case _ => + throw AssertionException(s"FileType ${documentRepresentation.fileType} did not match DocumentFile(_, _, _)") + } + documentRepresentation.internalFilename should equal(internalFilename) + documentRepresentation.label should equal(customLabel) + } + + "create a valid representation of a StillImageRepresentation with default values" in { + val stillImageRepresentation = UploadFileRequest.make( + fileType = FileType.StillImageFile(), + internalFilename = fileNameImage + ) + stillImageRepresentation.fileType match { + case FileType.StillImageFile(x, y) => + x should equal(100) + y should equal(100) + case _ => + throw AssertionException( + s"FileType ${stillImageRepresentation.fileType} did not match StillImageFile(_, _)" + ) + } + stillImageRepresentation.internalFilename should equal(fileNameImage) + } + + "create a valid representation of a StillImageRepresentation with custom values" in { + val stillImageRepresentation = UploadFileRequest.make( + fileType = FileType.StillImageFile(dimX = 10, dimY = 10), + internalFilename = fileNameImage + ) + stillImageRepresentation.fileType match { + case FileType.StillImageFile(x, y) => + x should equal(10) + y should equal(10) + case _ => + throw AssertionException( + s"FileType ${stillImageRepresentation.fileType} did not match StillImageFile(_, _)" + ) + } + stillImageRepresentation.internalFilename should equal(fileNameImage) + } + + "create a valid representation of a MovingImageRepresentation with default values" in { + val movingImageRepresentation = UploadFileRequest.make( + fileType = FileType.MovingImageFile(), + internalFilename = fileNameVideo + ) + movingImageRepresentation.fileType match { + case FileType.MovingImageFile(x, y) => + x should equal(100) + y should equal(100) + case _ => + throw AssertionException( + s"FileType ${movingImageRepresentation.fileType} did not match MovingImageFile(_, _)" + ) + } + movingImageRepresentation.internalFilename should equal(fileNameVideo) + } + + "create a valid representation of a MovingImageRepresentation with custom values" in { + val movingImageRepresentation = UploadFileRequest.make( + fileType = FileType.MovingImageFile(10, 11), + internalFilename = fileNameVideo + ) + movingImageRepresentation.fileType match { + case FileType.MovingImageFile(x, y) => + x should equal(10) + y should equal(11) + case _ => + throw AssertionException( + s"FileType ${movingImageRepresentation.fileType} did not match MovingImageFile(_, _)" + ) + } + movingImageRepresentation.internalFilename should equal(fileNameVideo) + } + + "create a valid representation of a AudioRepresentation" in { + val audioRepresentation = UploadFileRequest.make( + fileType = FileType.AudioFile, + internalFilename = fileNameAudio + ) + audioRepresentation.fileType should equal(FileType.AudioFile) + audioRepresentation.internalFilename should equal(fileNameAudio) + } + + "create a valid representation of a TextRepresentation" in { + val textRepresentation = UploadFileRequest.make( + fileType = FileType.TextFile, + internalFilename = fileNameText + ) + textRepresentation.fileType should equal(FileType.TextFile) + textRepresentation.internalFilename should equal(fileNameText) + } + + "create a valid representation of a ArchiveRepresentation" in { + val archiveRepresentation = UploadFileRequest.make( + fileType = FileType.ArchiveFile, + internalFilename = fileNameArchive + ) + archiveRepresentation.fileType should equal(FileType.ArchiveFile) + archiveRepresentation.internalFilename should equal(fileNameArchive) + } + + } + + "generating a JSON-LD representation of a UploadFileRequest," should { + + "correctly serialize a DocumentRepresentation with default values" in { + val documentRepresentation = UploadFileRequest.make( + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF + ) + val json = documentRepresentation.toJsonLd().parseJson + val expectedJSON = Map( + "@type" -> "knora-api:DocumentRepresentation".toJson, + "knora-api:hasDocumentFileValue" -> Map( + "@type" -> "knora-api:DocumentFileValue", + "knora-api:fileValueHasFilename" -> fileNamePDF + ).toJson, + "knora-api:attachedToProject" -> Map( + "@id" -> "http://rdfh.ch/projects/0001" + ).toJson, + "rdfs:label" -> "test label".toJson, + "@context" -> Map( + "rdf" -> "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "knora-api" -> "http://api.knora.org/ontology/knora-api/v2#", + "rdfs" -> "http://www.w3.org/2000/01/rdf-schema#", + "xsd" -> "http://www.w3.org/2001/XMLSchema#" + ).toJson + ).toJson + json should equal(expectedJSON) + } + + "correctly serialize a DocumentRepresentation with custom values" in { + val className = Some("ThingDocument") + val ontologyName = "biblio" + val shortcode = SharedTestDataADM.beolProject.shortcode + val ontologyIRI = SharedTestDataADM.beolProject.ontologies.find(_.endsWith(ontologyName)) + val label = "a custom label" + + val documentRepresentation = UploadFileRequest.make( + fileType = FileType.DocumentFile(pageCount = None, dimX = Some(20), dimY = None), + internalFilename = fileNamePDF, + label = label + ) + val json = documentRepresentation + .toJsonLd( + className = className, + ontologyName = ontologyName, + shortcode = shortcode, + ontologyIRI = ontologyIRI + ) + .parseJson + val expectedJSON = Map( + "@type" -> s"$ontologyName:${className.get}".toJson, + "knora-api:hasDocumentFileValue" -> Map( + "@type" -> "knora-api:DocumentFileValue", + "knora-api:fileValueHasFilename" -> fileNamePDF + ).toJson, + "knora-api:attachedToProject" -> Map( + "@id" -> s"http://rdfh.ch/projects/$shortcode" + ).toJson, + "rdfs:label" -> label.toJson, + "@context" -> Map( + "rdf" -> "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "knora-api" -> "http://api.knora.org/ontology/knora-api/v2#", + "rdfs" -> "http://www.w3.org/2000/01/rdf-schema#", + "xsd" -> "http://www.w3.org/2001/XMLSchema#", + ontologyName -> ontologyIRI.get + ).toJson + ).toJson + json should equal(expectedJSON) + } + + } + + "generating a message representation of a UploadFileRequest," should { + + "correctly serialize a DocumentRepresentation with default values" in { + val documentRepresentation = UploadFileRequest.make( + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF + ) + val msg = documentRepresentation.toMessage() + + msg.resourceClassIri should equal(FileModelUtil.getFileRepresentationClassIri(FileType.DocumentFile())) + msg.label should equal("test label") + msg.values should equal( + Map( + FileModelUtil.getFileRepresentationPropertyIri(FileType.DocumentFile()) -> List( + CreateValueInNewResourceV2( + valueContent = DocumentFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = fileNamePDF, + internalMimeType = "application/pdf", + originalFilename = None, + originalMimeType = Some("application/pdf") + ), + pageCount = Some(1), + dimX = Some(100), + dimY = Some(100), + comment = None + ), + customValueIri = None, + customValueUUID = None, + customValueCreationDate = None, + permissions = None + ) + ) + ) + ) + msg.projectADM should equal(SharedTestDataADM.anythingProject) + msg.permissions should equal(None) + } + + "correctly serialize a DocumentRepresentation with custom values" in { + val pageCount = None + val dimX = Some(20) + val dimY = None + val project = SharedTestDataADM.beolProject + val shortcode = project.shortcode + val label = "a custom label" + val resourceIRI = stringFormatter.makeRandomResourceIri(shortcode) + val comment = Some("This is a custom comment") val internalMimetype = Some("application/msword") val originalFilename = Some("document-file.docm") - val originalMimetype = Some("application/vnd.ms-word.document.macroEnabled.12") - val customValueIri = Some("http://www.knora.org/ontology/0801/biblio#hasThingDocumentValue".toSmartIri) + val originalMimeType = Some("application/vnd.ms-word.document.macroEnabled.12") + val customValueIRI = Some(stringFormatter.makeRandomResourceIri(shortcode).toSmartIri) val customValueUUID = Some(UUID.randomUUID()) val customValueCreationDate = Some(Instant.now()) val valuePermissions = Some("V knora-admin:UnknownUser,knora-admin:KnownUser|M knora-admin:ProjectMember") - val label = "a custom label" val resourcePermissions = Some("V knora-admin:UnknownUser|M knora-admin:ProjectMember,knora-admin:KnownUser") + val valuePropertyIRI = "http://www.knora.org/ontology/0801/biblio#hasThingDocumentValue".toSmartIri + val resourceClassIRI = "http://www.knora.org/ontology/0801/biblio#Book".toSmartIri + val customResourceCreationDate = Some(Instant.now()) val documentRepresentation = UploadFileRequest.make( - fileType = FileType.DocumentFile, - internalFilename = internalFilename, - resourceIri = Some(resourceIri), + fileType = FileType.DocumentFile(pageCount = pageCount, dimX = dimX, dimY = dimY), + internalFilename = fileNamePDF, + label = label + ) + val msg = documentRepresentation.toMessage( + resourceIri = Some(resourceIRI), comment = comment, - className = className, - ontologyName = ontologyName, - shortcode = project.shortcode, - dimX = dimX, - dimY = dimY, - pageCount = pageCount, internalMimeType = internalMimetype, originalFilename = originalFilename, - originalMimeType = originalMimetype, - customValueIri = customValueIri, + originalMimeType = originalMimeType, + customValueIri = customValueIRI, customValueUUID = customValueUUID, customValueCreationDate = customValueCreationDate, valuePermissions = valuePermissions, - label = label, resourcePermissions = resourcePermissions, + resourceCreationDate = customResourceCreationDate, + resourceClassIRI = Some(resourceClassIRI), + valuePropertyIRI = Some(valuePropertyIRI), project = Some(project) ) - documentRepresentation.fileType should equal(FileType.DocumentFile) - documentRepresentation.internalFilename should equal(internalFilename) - documentRepresentation.internalMimeType should equal(internalMimetype) - documentRepresentation.dimX should equal(dimX) - documentRepresentation.dimY should equal(dimY) - documentRepresentation.resourcePermissions should equal(resourcePermissions) - documentRepresentation.customValueUUID should equal(customValueUUID) - documentRepresentation.project should equal(project) - documentRepresentation.customValueIri should equal(customValueIri) - documentRepresentation.className should equal(className.get) - documentRepresentation.comment should equal(comment) - documentRepresentation.customValueCreationDate should equal(customValueCreationDate) - documentRepresentation.label should equal(label) - documentRepresentation.ontologyName should equal(ontologyName) - documentRepresentation.originalFilename should equal(originalFilename) - documentRepresentation.originalMimeType should equal(originalMimetype) - documentRepresentation.pageCount should equal(pageCount) - documentRepresentation.resourceIri should equal(resourceIri) - documentRepresentation.shortcode should equal(project.shortcode) - documentRepresentation.valuePermissions should equal(valuePermissions) + + msg.resourceIri should equal(Some(resourceIRI.toSmartIri)) + msg.label should equal(label) + msg.permissions should equal(resourcePermissions) + msg.projectADM should equal(project) + msg.creationDate should equal(customResourceCreationDate) + msg.resourceClassIri should equal(resourceClassIRI) + msg.values should equal( + Map( + valuePropertyIRI -> List( + CreateValueInNewResourceV2( + valueContent = DocumentFileValueContentV2( + ontologySchema = ApiV2Complex, + fileValue = FileValueV2( + internalFilename = fileNamePDF, + internalMimeType = internalMimetype.get, + originalFilename = originalFilename, + originalMimeType = originalMimeType + ), + pageCount = pageCount, + dimX = dimX, + dimY = dimY, + comment = comment + ), + customValueIri = customValueIRI, + customValueUUID = customValueUUID, + customValueCreationDate = customValueCreationDate, + permissions = valuePermissions + ) + ) + ) + ) } + } - "generating a JSON-LD representation of a UploadFileRequest," should { + "creating a ChangeFileRequest," should { + + "create a valid representation of a DocumentRepresentation with default values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("0000") + val valueIRI = stringFormatter.makeRandomResourceIri("0000") + + val change = ChangeFileRequest.make( + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + change.fileType match { + case FileType.DocumentFile(pg, x, y) => + pg should equal(Some(1)) + x should equal(Some(100)) + y should equal(Some(100)) + case _ => throw AssertionException(s"FileType ${change.fileType} did not match DocumentFile(_, _, _)") + } + change.internalFilename should equal(fileNamePDF) + change.valueIRI should equal(valueIRI) + change.resourceIRI should equal(resourceIRI) + change.className should equal("DocumentRepresentation") + change.ontologyName should equal("knora-api") + } + + "create a valid representation of a DocumentRepresentation with custom values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("0000") + val valueIRI = stringFormatter.makeRandomResourceIri("0000") + val pageCount = Some(33) + val dimX = Some(44) + val dimY = Some(55) + val className = "CustomDocumentResource" + val ontologyName = "anything" + + val change = ChangeFileRequest.make( + fileType = FileType.DocumentFile( + pageCount = pageCount, + dimX = dimX, + dimY = dimY + ), + internalFilename = fileNamePDF, + resourceIri = resourceIRI, + valueIri = valueIRI, + className = Some(className), + ontologyName = ontologyName + ) + change.fileType match { + case FileType.DocumentFile(pg, x, y) => + pg should equal(pageCount) + x should equal(dimX) + y should equal(dimY) + case _ => throw AssertionException(s"FileType ${change.fileType} did not match DocumentFile(_, _, _)") + } + change.internalFilename should equal(fileNamePDF) + change.valueIRI should equal(valueIRI) + change.resourceIRI should equal(resourceIRI) + change.className should equal(className) + change.ontologyName should equal(ontologyName) + } + + "create a valid representation of a StillImageRepresentation with default values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("0000") + val valueIRI = stringFormatter.makeRandomResourceIri("0000") + + val change = ChangeFileRequest.make( + fileType = FileType.StillImageFile(), + internalFilename = fileNameImage, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + change.fileType match { + case FileType.StillImageFile(x, y) => + x should equal(100) + y should equal(100) + case _ => throw AssertionException(s"FileType ${change.fileType} did not match StillImageFile(_, _)") + } + change.internalFilename should equal(fileNameImage) + change.valueIRI should equal(valueIRI) + change.resourceIRI should equal(resourceIRI) + change.className should equal("StillImageRepresentation") + change.ontologyName should equal("knora-api") + } + + "create a valid representation of a MovingImageRepresentation with default values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("0000") + val valueIRI = stringFormatter.makeRandomResourceIri("0000") + + val change = ChangeFileRequest.make( + fileType = FileType.MovingImageFile(), + internalFilename = fileNameVideo, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + change.fileType match { + case FileType.MovingImageFile(x, y) => + x should equal(100) + y should equal(100) + case _ => throw AssertionException(s"FileType ${change.fileType} did not match MovingImageFile(_, _)") + } + change.internalFilename should equal(fileNameVideo) + change.valueIRI should equal(valueIRI) + change.resourceIRI should equal(resourceIRI) + change.className should equal("MovingImageRepresentation") + change.ontologyName should equal("knora-api") + } + + "create a valid representation of a AudioRepresentation with default values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("0000") + val valueIRI = stringFormatter.makeRandomResourceIri("0000") + + val change = ChangeFileRequest.make( + fileType = FileType.AudioFile, + internalFilename = fileNameAudio, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + change.fileType should equal(FileType.AudioFile) + change.internalFilename should equal(fileNameAudio) + change.valueIRI should equal(valueIRI) + change.resourceIRI should equal(resourceIRI) + change.className should equal("AudioRepresentation") + change.ontologyName should equal("knora-api") + } + + "create a valid representation of a TextRepresentation with default values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("0000") + val valueIRI = stringFormatter.makeRandomResourceIri("0000") + + val change = ChangeFileRequest.make( + fileType = FileType.TextFile, + internalFilename = fileNameText, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + change.fileType should equal(FileType.TextFile) + change.internalFilename should equal(fileNameText) + change.valueIRI should equal(valueIRI) + change.resourceIRI should equal(resourceIRI) + change.className should equal("TextRepresentation") + change.ontologyName should equal("knora-api") + } + + "create a valid representation of a ArchiveRepresentation with default values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("0000") + val valueIRI = stringFormatter.makeRandomResourceIri("0000") + + val change = ChangeFileRequest.make( + fileType = FileType.ArchiveFile, + internalFilename = fileNameArchive, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + change.fileType should equal(FileType.ArchiveFile) + change.internalFilename should equal(fileNameArchive) + change.valueIRI should equal(valueIRI) + change.resourceIRI should equal(resourceIRI) + change.className should equal("ArchiveRepresentation") + change.ontologyName should equal("knora-api") + } + + } + + "generating a JSON-LD representation of a ChangeFileRequest," should { + "correctly serialize a DocumentRepresentation with default values" in { - val internalFilename = "document-file.pdf" - val documentRepresentation = UploadFileRequest.make( - fileType = FileType.DocumentFile, - internalFilename = internalFilename - ) - val json = documentRepresentation.toJsonLd - val expectedJson = """{ - | "@type" : "knora-api:DocumentRepresentation", - | "knora-api:hasDocumentFileValue" : { - | "@type" : "knora-api:DocumentFileValue", - | "knora-api:fileValueHasFilename" : "document-file.pdf" - | }, - | "knora-api:attachedToProject" : { - | "@id" : "http://rdfh.ch/projects/0001" - | }, - | "rdfs:label" : "test label", - | "@context" : { - | "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - | "knora-api": "http://api.knora.org/ontology/knora-api/v2#", - | "rdfs": "http://www.w3.org/2000/01/rdf-schema#", - | "xsd": "http://www.w3.org/2001/XMLSchema#" - | } - |}""".stripMargin - json should equal(expectedJson) + val resourceIRI = stringFormatter.makeRandomResourceIri("7777") + val valueIRI = stringFormatter.makeRandomResourceIri("7777") + + val documentRepresentation = ChangeFileRequest.make( + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + val json = documentRepresentation.toJsonLd.parseJson + val expectedJSON = Map( + "@id" -> resourceIRI.toJson, + "@type" -> "knora-api:DocumentRepresentation".toJson, + "knora-api:hasDocumentFileValue" -> Map( + "@id" -> valueIRI, + "@type" -> "knora-api:DocumentFileValue", + "knora-api:fileValueHasFilename" -> fileNamePDF + ).toJson, + "@context" -> Map( + "rdf" -> "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "knora-api" -> "http://api.knora.org/ontology/knora-api/v2#", + "rdfs" -> "http://www.w3.org/2000/01/rdf-schema#", + "xsd" -> "http://www.w3.org/2001/XMLSchema#" + ).toJson + ).toJson + json should equal(expectedJSON) } + "correctly serialize a DocumentRepresentation with custom values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("7777") + val valueIRI = stringFormatter.makeRandomResourceIri("7777") + val className = "CustomDocumentRepresentation" + val prefix = "onto" + + val documentRepresentation = ChangeFileRequest.make( + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF, + resourceIri = resourceIRI, + valueIri = valueIRI, + className = Some(className), + ontologyName = prefix + ) + val json = documentRepresentation.toJsonLd.parseJson + val expectedJSON = Map( + "@id" -> resourceIRI.toJson, + "@type" -> s"$prefix:$className".toJson, + "knora-api:hasDocumentFileValue" -> Map( + "@id" -> valueIRI, + "@type" -> "knora-api:DocumentFileValue", + "knora-api:fileValueHasFilename" -> fileNamePDF + ).toJson, + "@context" -> Map( + "rdf" -> "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "knora-api" -> "http://api.knora.org/ontology/knora-api/v2#", + "rdfs" -> "http://www.w3.org/2000/01/rdf-schema#", + "xsd" -> "http://www.w3.org/2001/XMLSchema#" + ).toJson + ).toJson + json should equal(expectedJSON) + } + } + + "generating a message representation of a ChangeFileRequest," should { + + "correctly serialize a DocumentRepresentation with default values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("7777") + val valueIRI = stringFormatter.makeRandomResourceIri("7777") + + val documentRepresentation = ChangeFileRequest.make( + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF, + resourceIri = resourceIRI, + valueIri = valueIRI + ) + val msg = documentRepresentation.toMessage(featureFactoryConfig = defaultFeatureFactoryConfig) + msg.updateValue should equal( + UpdateValueContentV2( + resourceIri = resourceIRI, + resourceClassIri = "http://api.knora.org/ontology/knora-api/v2#DocumentFileValue".toSmartIri, + propertyIri = "http://api.knora.org/ontology/knora-api/v2#hasDocumentFileValue".toSmartIri, + valueIri = valueIRI, + valueContent = FileModelUtil.getFileValueContent( + fileType = FileType.DocumentFile(), + internalFilename = fileNamePDF, + internalMimeType = Some("application/pdf"), + originalFilename = None, + originalMimeType = Some("application/pdf"), + comment = None + ), + permissions = None, + valueCreationDate = None, + newValueVersionIri = None + ) + ) + } + + "correctly serialize a DocumentRepresentation with custom values" in { + val resourceIRI = stringFormatter.makeRandomResourceIri("7777") + val valueIRI = stringFormatter.makeRandomResourceIri("7777") + val className = "CustomDocumentRepresentation" + val prefix = "onto" + val fileName = "wordfile.docx" + val internalMimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + val originalFileName = "original-wordfile.doc" + val originalMimetype = "application/msword" + val customComment = "a comment on this word file" + val valuePermission = Some("V knora-admin:UnknownUser,knora-admin:KnownUser|M knora-admin:ProjectMember") + val customValueCreationDate = Some(Instant.now()) + val customValueVersionIRI = Some(stringFormatter.makeRandomResourceIri("7777").toSmartIri) + val resourceClassIRI = "http://www.knora.org/ontology/0801/biblio#Book".toSmartIri + + val documentRepresentation = ChangeFileRequest.make( + fileType = FileType.DocumentFile(), + internalFilename = fileName, + resourceIri = resourceIRI, + valueIri = valueIRI, + className = Some(className), + ontologyName = prefix + ) + val msg = documentRepresentation.toMessage( + featureFactoryConfig = defaultFeatureFactoryConfig, + internalMimeType = Some(internalMimeType), + originalFilename = Some(originalFileName), + originalMimeType = Some(originalMimetype), + comment = Some(customComment), + permissions = valuePermission, + valueCreationDate = customValueCreationDate, + newValueVersionIri = customValueVersionIRI, + resourceClassIRI = Some(resourceClassIRI) + ) + println(msg) + msg.updateValue should equal( + UpdateValueContentV2( + resourceIri = resourceIRI, + resourceClassIri = resourceClassIRI, + propertyIri = "http://api.knora.org/ontology/knora-api/v2#hasDocumentFileValue".toSmartIri, + valueIri = valueIRI, + valueContent = FileModelUtil.getFileValueContent( + fileType = FileType.DocumentFile(), + internalFilename = fileName, + internalMimeType = Some(internalMimeType), + originalFilename = Some(originalFileName), + originalMimeType = Some(originalMimetype), + comment = Some(customComment) + ), + permissions = valuePermission, + valueCreationDate = customValueCreationDate, + newValueVersionIri = customValueVersionIRI + ) + ) + } } } } diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala index fa637022dd..9b318118e1 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ResourcesResponderV2Spec.scala @@ -1164,15 +1164,13 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { val inputResource = UploadFileRequest .make( - fileType = FileType.StillImageFile, - internalFilename = "IQUO3t1AABm-FSLC0vNvVpr.jp2", - className = Some("ThingPicture"), - ontologyName = "anything", - resourceIri = Some(resourceIri), - dimX = Some(512), - dimY = Some(256) + fileType = FileType.StillImageFile( + dimX = 512, + dimY = 256 + ), + internalFilename = "IQUO3t1AABm-FSLC0vNvVpr.jp2" ) - .toMessage + .toMessage(resourceIri = Some(resourceIri)) responderManager ! CreateResourceRequestV2( createResource = inputResource, @@ -1204,11 +1202,10 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { val inputResource = UploadFileRequest .make( - fileType = FileType.DocumentFile, - resourceIri = Some(resourceIri), + fileType = FileType.DocumentFile(), internalFilename = "IQUO3t1AABm-FSLC0vNvVpr.pdf" ) - .toMessage + .toMessage(resourceIri = Some(resourceIri)) responderManager ! CreateResourceRequestV2( createResource = inputResource, @@ -1241,11 +1238,12 @@ class ResourcesResponderV2Spec extends CoreSpec() with ImplicitSender { val inputResource = UploadFileRequest .make( fileType = FileType.ArchiveFile, + internalFilename = "IQUO3t1AABm-FSLC0vNvVps.zip" + ) + .toMessage( resourceIri = Some(resourceIri), - internalFilename = "IQUO3t1AABm-FSLC0vNvVps.zip", internalMimeType = Some("application/zip") ) - .toMessage responderManager ! CreateResourceRequestV2( createResource = inputResource, diff --git a/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala b/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala index a793d92fb3..c4acf3791e 100644 --- a/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala +++ b/webapi/src/test/scala/org/knora/webapi/responders/v2/ValuesResponderV2Spec.scala @@ -29,6 +29,7 @@ import org.knora.webapi.messages.v2.responder.searchmessages.GravsearchRequestV2 import org.knora.webapi.messages.v2.responder.standoffmessages._ import org.knora.webapi.messages.v2.responder.valuemessages._ import org.knora.webapi.messages.{OntologyConstants, SmartIri, StringFormatter} +import org.knora.webapi.models.filemodels.{ChangeFileRequest, FileType} import org.knora.webapi.settings.{KnoraDispatchers, _} import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.store.iiif.MockSipiConnector @@ -47,12 +48,16 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { private val aThingIri = "http://rdfh.ch/0001/a-thing" private val aThingPictureIri = "http://rdfh.ch/0001/a-thing-picture" private val sierraIri = "http://rdfh.ch/0001/0C-0L1kORryKzJAJxxRyRQ" + private val thingPictureClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#ThingPicture" private val incunabulaUser = SharedTestDataADM.incunabulaMemberUser private val incunabulaCreatorUser = SharedTestDataADM.incunabulaCreatorUser private val anythingUser1 = SharedTestDataADM.anythingUser1 private val anythingUser2 = SharedTestDataADM.anythingUser2 + private val mimeTypeTIFF = "image/tiff" + private val mimeTypeJP2 = "image/jp2" + /* we need to run our app with the mocked sipi actor */ override lazy val appActor: ActorRef = system.actorOf( Props(new ApplicationActor with ManagersWithMockedSipi).withDispatcher(KnoraDispatchers.KnoraActorDispatcher), @@ -4128,31 +4133,26 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { "not update a still image file value without changing it" in { val resourceIri: IRI = aThingPictureIri stillImageFileValueIri.set("http://rdfh.ch/0001/a-thing-picture/values/goZ7JFRNSeqF-dNxsqAS7Q") - - val valueContent = StillImageFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = "B1D0OkEgfFp-Cew2Seur7Wi.jp2", - internalMimeType = "image/jp2", - originalFilename = Some("test.tiff"), - originalMimeType = Some("image/tiff") - ), - dimX = 512, - dimY = 256 - ) - - val updateValueRequest = UpdateValueRequestV2( - UpdateValueContentV2( + val fileType = FileType.StillImageFile(dimX = 512, dimY = 256) + val internalFilename = "B1D0OkEgfFp-Cew2Seur7Wi.jp2" + val valueIri = stillImageFileValueIri.get + + val updateValueRequest = ChangeFileRequest + .make( + fileType = fileType, + internalFilename = internalFilename, resourceIri = resourceIri, - resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#ThingPicture".toSmartIri, - propertyIri = OntologyConstants.KnoraApiV2Complex.HasStillImageFileValue.toSmartIri, - valueIri = stillImageFileValueIri.get, - valueContent = valueContent - ), - featureFactoryConfig = defaultFeatureFactoryConfig, - requestingUser = anythingUser1, - apiRequestID = UUID.randomUUID - ) + valueIri = valueIri, + ontologyName = "anything" + ) + .toMessage( + featureFactoryConfig = defaultFeatureFactoryConfig, + internalMimeType = Some(mimeTypeJP2), + originalFilename = Some("test.tiff"), + originalMimeType = Some(mimeTypeTIFF), + resourceClassIRI = Some(thingPictureClassIri.toSmartIri), + requestingUser = anythingUser1 + ) responderManager ! updateValueRequest @@ -4178,31 +4178,32 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ) // Update the value. - - val valueContent = StillImageFileValueContentV2( - ontologySchema = ApiV2Complex, - fileValue = FileValueV2( - internalFilename = "updated-filename.jp2", - internalMimeType = "image/jp2", - originalFilename = Some("test.tiff"), - originalMimeType = Some("image/tiff") - ), - dimX = 512, - dimY = 256 - ) - - responderManager ! UpdateValueRequestV2( - UpdateValueContentV2( + val dimX = 512 + val dimY = 256 + val internalFilename = "updated-filename.jp2" + val internalMimeType = mimeTypeJP2 + val originalFilename = Some("test.tiff") + val originalMimeType = Some(mimeTypeTIFF) + + val changeFileRequest = ChangeFileRequest + .make( + fileType = FileType.StillImageFile(dimX = dimX, dimY = dimY), + internalFilename = internalFilename, resourceIri = resourceIri, - resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#ThingPicture".toSmartIri, - propertyIri = propertyIri, valueIri = stillImageFileValueIri.get, - valueContent = valueContent - ), - featureFactoryConfig = defaultFeatureFactoryConfig, - requestingUser = anythingUser1, - apiRequestID = UUID.randomUUID - ) + ontologyName = "anything" + ) + val changeFileMessage = changeFileRequest + .toMessage( + featureFactoryConfig = defaultFeatureFactoryConfig, + resourceClassIRI = Some(thingPictureClassIri.toSmartIri), + internalMimeType = Some(internalMimeType), + originalMimeType = originalMimeType, + originalFilename = originalFilename + ) + responderManager ! changeFileMessage + + println(changeFileMessage) expectMsgPF(timeout) { case updateValueResponse: UpdateValueResponseV2 => stillImageFileValueIri.set(updateValueResponse.valueIri) @@ -4219,13 +4220,20 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { requestingUser = anythingUser1 ) + updatedValueFromTriplestore.valueIri should equal(stillImageFileValueIri.get) updatedValueFromTriplestore.valueContent match { case savedValue: StillImageFileValueContentV2 => - savedValue should ===(valueContent) - updatedValueFromTriplestore.permissions should ===(previousValueFromTriplestore.permissions) + savedValue.comment should be(None) + savedValue.dimX should equal(dimX) + savedValue.dimY should equal(dimY) + savedValue.fileValue.internalFilename should equal(internalFilename) + savedValue.fileValue.internalMimeType should equal(internalMimeType) + savedValue.fileValue.originalMimeType should equal(originalMimeType) + savedValue.fileValue.originalFilename should equal(originalFilename) case _ => throw AssertionException(s"Expected still image file value, got $updatedValueFromTriplestore") } + updatedValueFromTriplestore.permissions should equal(previousValueFromTriplestore.permissions) } @@ -4237,9 +4245,9 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ontologySchema = ApiV2Complex, fileValue = FileValueV2( internalFilename = MockSipiConnector.FAILURE_FILENAME, // tells the mock Sipi responder to simulate failure - internalMimeType = "image/jp2", + internalMimeType = mimeTypeJP2, originalFilename = Some("test.tiff"), - originalMimeType = Some("image/tiff") + originalMimeType = Some(mimeTypeTIFF) ), dimX = 512, dimY = 256 @@ -4249,7 +4257,7 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { responderManager ! UpdateValueRequestV2( UpdateValueContentV2( resourceIri = resourceIri, - resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#ThingPicture".toSmartIri, + resourceClassIri = thingPictureClassIri.toSmartIri, propertyIri = propertyIri, valueIri = stillImageFileValueIri.get, valueContent = valueContent @@ -4272,9 +4280,9 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { ontologySchema = ApiV2Complex, fileValue = FileValueV2( internalFilename = MockSipiConnector.FAILURE_FILENAME, // tells the mock Sipi responder to simulate failure - internalMimeType = "image/jp2", + internalMimeType = mimeTypeJP2, originalFilename = Some("test.tiff"), - originalMimeType = Some("image/tiff") + originalMimeType = Some(mimeTypeTIFF) ), dimX = 512, dimY = 256 @@ -4284,7 +4292,7 @@ class ValuesResponderV2Spec extends CoreSpec() with ImplicitSender { responderManager ! UpdateValueRequestV2( UpdateValueContentV2( resourceIri = resourceIri, - resourceClassIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#ThingPicture".toSmartIri, + resourceClassIri = thingPictureClassIri.toSmartIri, propertyIri = propertyIri, valueIri = stillImageFileValueIri.get, valueContent = valueContent