diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala index df4e36b311..ce3802d1b9 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponderADM.scala @@ -725,11 +725,13 @@ class ListsResponderADM(responderData: ResponderData) extends Responder(responde _ = if (changeListRequest.labels.nonEmpty) { - if (updatedList.listinfo.labels.stringLiterals.sorted != changeListRequest.labels.sorted) throw UpdateNotPerformedException("Lists's 'labels' where not updated. Please report this as a possible bug.") + if (updatedList.listinfo.labels.stringLiterals.diff(changeListRequest.labels).nonEmpty) throw UpdateNotPerformedException("Lists's 'labels' where not updated. Please report this as a possible bug.") } _ = if (changeListRequest.comments.nonEmpty) { - if (updatedList.listinfo.comments.stringLiterals.sorted != changeListRequest.comments.sorted) throw UpdateNotPerformedException("List's 'comments' was not updated. Please report this as a possible bug.") + if (updatedList.listinfo.comments.stringLiterals.diff(changeListRequest.comments).nonEmpty) + + throw UpdateNotPerformedException("List's 'comments' was not updated. Please report this as a possible bug.") } // _ = log.debug(s"listInfoChangeRequest - updatedList: {}", updatedList) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala index c745108340..e0c3220ae2 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala @@ -716,7 +716,7 @@ class ProjectsResponderADM(responderData: ResponderData) extends Responder(respo } _ = if (projectUpdatePayload.description.isDefined) { - if (updatedProject.description.sorted != projectUpdatePayload.description.get.sorted) throw UpdateNotPerformedException("Project's 'description' was not updated. Please report this as a possible bug.") + if (updatedProject.description.diff(projectUpdatePayload.description.get).nonEmpty) throw UpdateNotPerformedException("Project's 'description' was not updated. Please report this as a possible bug.") } _ = if (projectUpdatePayload.keywords.isDefined) { diff --git a/webapi/src/main/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala b/webapi/src/main/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala index 0efb213cb0..743e5fa01b 100644 --- a/webapi/src/main/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/sharedtestdata/SharedTestDataADM.scala @@ -641,6 +641,14 @@ object SharedTestDataADM { | "selfjoin": true |}""".stripMargin + val updateProjectMultipleDescriptionRequest: String = + s"""{ + | "description": [ + | {"value": "Test Project", "language": "en"}, + | {"value": "Test Project", "language": "se"} + | ] + |}""".stripMargin + val createUserRequest: String = s"""{ | "username": "donald.duck", @@ -750,6 +758,23 @@ object SharedTestDataADM { |}""".stripMargin } + def updateListInfoWithRepeatedCommentAndLabelValuesRequest(listIri: IRI): String = { + s"""{ + | "listIri": "$listIri", + | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", + | "labels": [ + | {"language": "en", "value": "Test List"}, + | {"language": "se", "value": "Test List"} + | ], + | "comments": [ + | {"language": "en", "value": "test"}, + | {"language": "de", "value": "test"}, + | {"language": "fr", "value": "test"}, + | {"language": "it", "value": "test"} + | ] + |}""".stripMargin + } + def addChildListNodeRequest(parentNodeIri: IRI, name: String, label: String, diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ListsADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/ListsADME2ESpec.scala index f2761eae20..0f71903e3e 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ListsADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/ListsADME2ESpec.scala @@ -315,6 +315,26 @@ class ListsADME2ESpec extends E2ESpec(ListsADME2ESpec.config) with SessionJsonPr comments.size should be (2) } + "update basic list information with repeated comment and label in different languages" in { + val params = SharedTestDataADM.updateListInfoWithRepeatedCommentAndLabelValuesRequest("http://rdfh.ch/lists/0001/treeList") + val encodedListUrl = java.net.URLEncoder.encode("http://rdfh.ch/lists/0001/treeList", "utf-8") + + val request = Put(baseApiUrl + s"/admin/lists/infos/" + encodedListUrl, HttpEntity(ContentTypes.`application/json`, params)) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + // log.debug(s"response: ${response.toString}") + response.status should be(StatusCodes.OK) + + val receivedListInfo: ListRootNodeInfoADM = AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] + + receivedListInfo.projectIri should be (SharedTestDataADM.ANYTHING_PROJECT_IRI) + + val labels: Seq[StringLiteralV2] = receivedListInfo.labels.stringLiterals + labels.size should be (2) + + val comments = receivedListInfo.comments.stringLiterals + comments.size should be (4) + } + "return a ForbiddenException if the user updating the list is not project or system admin" in { val params = s""" @@ -551,7 +571,6 @@ class ListsADME2ESpec extends E2ESpec(ListsADME2ESpec.config) with SessionJsonPr "delete node if not in use" ignore { } - } } } diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala index 9900d684b2..2326104e91 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala @@ -288,6 +288,19 @@ class ProjectsADME2ESpec extends E2ESpec(ProjectsADME2ESpec.config) with Session result.selfjoin should be (true) } + "UPDATE a project with multiple description" in { + + val projectIriEncoded = URLEncoder.encode(newProjectIri.get, "utf-8") + val request = Put(baseApiUrl + s"/admin/projects/iri/" + projectIriEncoded, HttpEntity(ContentTypes.`application/json`, SharedTestDataADM.updateProjectMultipleDescriptionRequest)) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) + val response: HttpResponse = singleAwaitingRequest(request) + response.status should be (StatusCodes.OK) + + val result: ProjectADM = AkkaHttpUtils.httpResponseToJson(response).fields("project").convertTo[ProjectADM] + result.description.size should be (2) + result.description should contain (StringLiteralV2(value = "Test Project", language = Some("en"))) + result.description should contain (StringLiteralV2(value = "Test Project", language = Some("se"))) + } + "DELETE a project" in { val projectIriEncoded = URLEncoder.encode(newProjectIri.get, "utf-8")