diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala index 9b6b09c8a9..d74811c5d2 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/ontologymessages/OntologyMessagesV2.scala @@ -3340,16 +3340,17 @@ case class OntologyMetadataV2(ontologyIri: SmartIri, } /** - * Undoes the SPARQL-escaping of the `rdfs:label` of this ontology. This method is meant to be used in tests after an update, when the + * Undoes the SPARQL-escaping of the `rdfs:label` and `rdfs:comment` of this ontology. This method is meant to be used in tests after an update, when the * input (which has been escaped for use in SPARQL) needs to be compared with the updated data * read back from the triplestore (which is not escaped). * - * @return a copy of this [[OntologyMetadataV2]] with the `rdfs:label` unescaped. + * @return a copy of this [[OntologyMetadataV2]] with the `rdfs:label` and `rdfs:comment` unescaped. */ def unescape: OntologyMetadataV2 = { val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance - copy(label = label.map(stringFormatter.fromSparqlEncodedString)) + copy(label = label.map(stringFormatter.fromSparqlEncodedString), + comment = comment.map(stringFormatter.fromSparqlEncodedString)) } def toJsonLD(targetSchema: ApiV2Schema): Map[String, JsonLDValue] = { diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala index fb49195090..8b126cbb44 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/OntologyV2R2RSpec.scala @@ -302,7 +302,9 @@ class OntologyV2R2RSpec extends R2RSpec { ) private val fooIri = new MutableTestIri + private val barIri = new MutableTestIri private var fooLastModDate: Instant = Instant.now + private var barLastModDate: Instant = Instant.now private var anythingLastModDate: Instant = Instant.parse("2017-12-19T15:23:42.166Z") @@ -494,7 +496,16 @@ class OntologyV2R2RSpec extends R2RSpec { val metadata = responseJsonDoc.body val ontologyIri = metadata.value("@id").asInstanceOf[JsonLDString].value assert(ontologyIri == "http://0.0.0.0:3333/ontology/0001/bar/v2") - assert(metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString(comment)) + assert( + metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString( + stringFormatter.fromSparqlEncodedString(comment))) + barIri.set(ontologyIri) + val lastModDate = metadata.requireDatatypeValueInObject( + key = OntologyConstants.KnoraApiV2Complex.LastModificationDate, + expectedDatatype = OntologyConstants.Xsd.DateTimeStamp.toSmartIri, + validationFun = stringFormatter.xsdDateTimeStampToInstant + ) + barLastModDate = lastModDate clientTestDataCollector.addFile( TestDataFileContent( @@ -509,6 +520,38 @@ class OntologyV2R2RSpec extends R2RSpec { } } + "create an empty ontology called 'test' with a comment that has a special character" in { + val label = "The test ontology" + val comment = "some \\\"test\\\" comment" + + val params = + s"""{ + | "knora-api:ontologyName": "test", + | "knora-api:attachedToProject": { + | "@id": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}" + | }, + | "rdfs:label": "$label", + | "rdfs:comment": "$comment", + | "@context": { + | "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + | "knora-api": "http://api.knora.org/ontology/knora-api/v2#" + | } + |}""".stripMargin + + Post("/v2/ontologies", HttpEntity(RdfMediaTypes.`application/ld+json`, params)) ~> addCredentials( + BasicHttpCredentials(anythingUsername, password)) ~> ontologiesPath ~> check { + val responseStr = responseAs[String] + assert(status == StatusCodes.OK, responseStr) + val responseJsonDoc = JsonLDUtil.parseJsonLD(responseStr) + val metadata = responseJsonDoc.body + val ontologyIri = metadata.value("@id").asInstanceOf[JsonLDString].value + assert(ontologyIri == "http://0.0.0.0:3333/ontology/0001/test/v2") + assert( + metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString( + stringFormatter.fromSparqlEncodedString(comment))) + } + } + "change the metadata of 'foo'" in { val newLabel = "The modified foo ontology" val newComment = "new comment" @@ -561,6 +604,46 @@ class OntologyV2R2RSpec extends R2RSpec { } } + "change the metadata of 'bar' ontology giving a comment containing a special character" in { + val newComment = "a \\\"new\\\" comment" + + val params = + s"""{ + | "@id": "${barIri.get}", + | "rdfs:comment": "$newComment", + | "knora-api:lastModificationDate": { + | "@type" : "xsd:dateTimeStamp", + | "@value" : "$barLastModDate" + | }, + | "@context": { + | "xsd" : "http://www.w3.org/2001/XMLSchema#", + | "rdfs" : "http://www.w3.org/2000/01/rdf-schema#", + | "knora-api" : "http://api.knora.org/ontology/knora-api/v2#" + | } + |}""".stripMargin + + Put("/v2/ontologies/metadata", HttpEntity(RdfMediaTypes.`application/ld+json`, params)) ~> addCredentials( + BasicHttpCredentials(anythingUsername, password)) ~> ontologiesPath ~> check { + assert(status == StatusCodes.OK, response.toString) + val responseJsonDoc = responseToJsonLDDocument(response) + val metadata = responseJsonDoc.body + val ontologyIri = metadata.value("@id").asInstanceOf[JsonLDString].value + assert(ontologyIri == barIri.get) + assert( + metadata.value(OntologyConstants.Rdfs.Comment) == JsonLDString( + stringFormatter.fromSparqlEncodedString(newComment))) + + val lastModDate = metadata.requireDatatypeValueInObject( + key = OntologyConstants.KnoraApiV2Complex.LastModificationDate, + expectedDatatype = OntologyConstants.Xsd.DateTimeStamp.toSmartIri, + validationFun = stringFormatter.xsdDateTimeStampToInstant + ) + + assert(lastModDate.isAfter(barLastModDate)) + barLastModDate = lastModDate + } + } + "delete the comment from 'foo'" in { val fooIriEncoded = URLEncoder.encode(fooIri.get, "UTF-8") val lastModificationDate = URLEncoder.encode(fooLastModDate.toString, "UTF-8")