diff --git a/CHANGES.rst b/CHANGES.rst
index bda63e9..ec0786a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -5,7 +5,8 @@ Changelog
1.0a15 (unreleased)
-------------------
-- Nothing changed yet.
+- Override 'update' and 'workflow transition' to use the uid
+ [vpiret]
1.0a14 (2021-07-16)
diff --git a/src/imio/restapi/services/configure.zcml b/src/imio/restapi/services/configure.zcml
index 3abc3ce..9784020 100644
--- a/src/imio/restapi/services/configure.zcml
+++ b/src/imio/restapi/services/configure.zcml
@@ -73,6 +73,24 @@
permission="cmf.ModifyPortalContent"
/>
+
+
+
+
= now)
+
+ def test_calling_workflow_with_additional_path_segments_results_in_404(self):
+ uid = self.portal.doc1.UID()
+ endpoint_url = "{0}/@wf/{1}/publish/test".format(self.portal_url, uid)
+ response = requests.post(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
+ json={},
+ )
+ transaction.commit()
+ self.assertEqual(404, response.status_code)
+
+ def test_transition_including_children(self):
+ transaction.commit()
+ uid = self.folder.UID()
+ endpoint_url = "{0}/@wf/{1}/publish".format(self.portal_url, uid)
+ response = requests.post(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
+ json={"include_children": "true"},
+ )
+ transaction.commit()
+ self.assertEqual(200, response.status_code)
+ self.assertEqual(
+ u"published", self.wftool.getInfoFor(self.folder, u"review_state")
+ )
+ self.assertEqual(
+ u"published", self.wftool.getInfoFor(self.subfolder, u"review_state")
+ )
+
+ def test_transition_with_effective_date(self):
+ uid = self.portal.doc1.UID()
+ endpoint_url = "{0}/@wf/{1}/publish".format(self.portal_url, uid)
+ requests.post(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
+ json={"effective": "2018-06-24T09:17:02"},
+ )
+ transaction.commit()
+ self.assertEqual(
+ "2018-06-24T09:17:00+00:00", self.portal.doc1.effective().ISO8601()
+ )
+
+ def test_transition_with_expiration_date(self):
+ uid = self.portal.doc1.UID()
+ endpoint_url = "{0}/@wf/{1}/publish".format(self.portal_url, uid)
+ requests.post(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
+ json={"expires": "2019-06-20T18:00:00",
+ "comment": "A comment"},
+ )
+ transaction.commit()
+ self.assertEqual(
+ "A comment", self.wftool.getInfoFor(self.portal.doc1, u"comments")
+ )
+ self.assertEqual(
+ "2019-06-20T18:00:00+00:00", self.portal.doc1.expires().ISO8601()
+ )
+
+ def test_transition_with_no_access_to_review_history_in_target_state(self):
+ self.wftool.setChainForPortalTypes(["Folder"], "restriction_workflow")
+ folder = self.portal[
+ self.portal.invokeFactory("Folder", id="folder_test", title="Test")
+ ]
+ transaction.commit()
+ uid = folder.UID()
+ setRoles(
+ self.portal, TEST_USER_ID, ["Contributor", "Editor", "Member", "Reviewer"]
+ )
+ login(self.portal, TEST_USER_NAME)
+ endpoint_url = "{0}/@wf/{1}/restrict".format(self.portal_url, uid)
+ response = requests.post(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(TEST_USER_NAME, TEST_USER_PASSWORD),
+ json={},
+ )
+ transaction.commit()
+ self.assertEqual(200, response.status_code)
+ self.assertEqual(u"restricted", self.wftool.getInfoFor(folder, u"review_state"))
diff --git a/src/imio/restapi/tests/test_service_update.py b/src/imio/restapi/tests/test_service_update.py
new file mode 100644
index 0000000..0113a1c
--- /dev/null
+++ b/src/imio/restapi/tests/test_service_update.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+from imio.restapi.testing import IMIO_RESTAPI_DX_FUNCTIONAL_TESTING
+from plone.app.testing import login
+from plone.app.testing import setRoles
+from plone.app.testing import SITE_OWNER_NAME
+from plone.app.testing import SITE_OWNER_PASSWORD
+from plone.app.testing import TEST_USER_ID
+from plone.app.testing import TEST_USER_NAME
+from plone.app.testing import TEST_USER_PASSWORD
+from Products.CMFCore.utils import getToolByName
+
+import requests
+import transaction
+import unittest
+
+
+class TestContentPatch(unittest.TestCase):
+ layer = IMIO_RESTAPI_DX_FUNCTIONAL_TESTING
+
+ def setUp(self):
+ self.app = self.layer["app"]
+ self.portal = self.layer["portal"]
+ self.request = self.layer["request"]
+ self.portal_url = self.portal.absolute_url()
+ setRoles(self.portal, TEST_USER_ID, ["Member"])
+ login(self.portal, SITE_OWNER_NAME)
+ self.portal.invokeFactory(
+ "Document", id="doc1", title="My Document", description="Some Description"
+ )
+ wftool = getToolByName(self.portal, "portal_workflow")
+ wftool.doActionFor(self.portal.doc1, "publish")
+ transaction.commit()
+
+ def tearDown(self):
+ login(self.portal, SITE_OWNER_NAME)
+ self.portal.manage_delObjects(["doc1"])
+ transaction.commit()
+
+ def test_patch_document(self):
+ self.request["BODY"] = '{"title": "Patched Document"}'
+
+ uid = self.portal.doc1.UID()
+ endpoint_url = "{0}/@content/{1}".format(self.portal_url, uid)
+ response = requests.patch(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
+ json={"title": "Patched Document"},
+ )
+ transaction.commit()
+ self.assertEqual(204, response.status_code)
+ self.assertEqual("Patched Document", self.portal.doc1.Title())
+
+ def test_patch_document_will_delete_value_with_null(self):
+ self.assertEqual(self.portal.doc1.description, "Some Description")
+ uid = self.portal.doc1.UID()
+ endpoint_url = "{0}/@content/{1}".format(self.portal_url, uid)
+ response = requests.patch(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
+ json={"description": ""},
+ )
+ transaction.commit()
+ self.assertEqual(204, response.status_code)
+ self.assertEqual(u"", self.portal.doc1.description)
+
+ def test_patch_document_unauthorized(self):
+ uid = self.portal.doc1.UID()
+ endpoint_url = "{0}/@content/{1}".format(self.portal_url, uid)
+ response = requests.patch(
+ endpoint_url,
+ headers={"Accept": "application/json"},
+ auth=(TEST_USER_NAME, TEST_USER_PASSWORD),
+ json={"description": ""},
+ )
+ transaction.commit()
+ self.assertEqual(401, response.status_code)