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)