plone.restapi/unify-expired-and-excluded-items-handling: Add tests for locking

Thomas Buchberger <jenkins-z4DKO/[email protected]> Sat, 29 Jul 2017 16:32:02 -0700 (PDT)
Newsgroups gmane.comp.web.zope.plone.cvs
Message-ID <[email protected]>
Repository: plone.restapi
Branch: refs/heads/unify-expired-and-excluded-items-handling
Date: 2017-07-27T10:02:23+02:00
Author: Thomas Buchberger (buchi) <t.buchberger-/8aE7x569Db/[email protected]>
Commit: https://github.com/plone/plone.restapi/commit/82535ea13dcb5508e1420b9eab7c295bd9ebe3ae

Add tests for locking

Files changed:
A src/plone/restapi/tests/test_locking.py

diff --git a/src/plone/restapi/tests/test_locking.py b/src/plone/restapi/tests/test_locking.py
new file mode 100644
index 00000000..b2d9cd14
--- /dev/null
+++ b/src/plone/restapi/tests/test_locking.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+from plone.app.testing import SITE_OWNER_NAME
+from plone.app.testing import SITE_OWNER_PASSWORD
+from plone.app.testing import login
+from plone.locking.interfaces import ITTWLockable
+from plone.restapi.testing import PLONE_RESTAPI_DX_FUNCTIONAL_TESTING
+from plone.restapi.testing import RelativeSession
+from zope.interface import alsoProvides
+from plone.locking.interfaces import ILockable
+from plone.locking.interfaces import INonStealableLock
+
+
+import unittest
+import transaction
+
+
+class TestLocking(unittest.TestCase):
+
+    layer = PLONE_RESTAPI_DX_FUNCTIONAL_TESTING
+
+    def setUp(self):
+        self.portal = self.layer['portal']
+        self.request = self.layer['request']
+        login(self.portal, SITE_OWNER_NAME)
+        self.doc = self.portal[self.portal.invokeFactory(
+            'Document', id='doc1', title='My Document')]
+        alsoProvides(self.doc, ITTWLockable)
+
+        self.api_session = RelativeSession(self.doc.absolute_url())
+        self.api_session.headers.update({'Accept': 'application/json'})
+        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)
+
+        transaction.commit()
+
+    def test_lock_object(self):
+        response = self.api_session.post('/@lock',)
+        transaction.commit()
+
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(ILockable(self.doc).locked())
+
+    def test_lock_object_non_stealable(self):
+        response = self.api_session.post('/@lock', json={'stealable': False})
+        transaction.commit()
+
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(INonStealableLock.providedBy(self.doc))
+
+    def test_lock_object_with_custom_timeout(self):
+        response = self.api_session.post('/@lock', json={'timeout': 86400})
+        transaction.commit()
+
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(self.doc.wl_lockValues()[0].getTimeout(), 86400)
+
+    def test_unlock_object(self):
+        lockable = ILockable(self.doc)
+        lockable.lock()
+        transaction.commit()
+        response = self.api_session.post('/@unlock')
+        transaction.commit()
+
+        self.assertEqual(response.status_code, 200)
+        self.assertFalse(lockable.locked())
+
+    def test_refresh_lock(self):
+        lockable = ILockable(self.doc)
+        lockable.lock()
+        modified = self.doc.wl_lockValues()[0].getModifiedTime()
+        transaction.commit()
+        response = self.api_session.post('/@refresh-lock')
+        transaction.commit()
+
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(
+            self.doc.wl_lockValues()[0].getModifiedTime() > modified)
+
+    def test_lock_info_for_locked_object(self):
+        lockable = ILockable(self.doc)
+        lockable.lock()
+        transaction.commit()
+        response = self.api_session.get('/@lock')
+
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(response.json()['locked'])
+
+    def test_lock_info_for_unlocked_object(self):
+        response = self.api_session.get('/@lock')
+
+        self.assertEqual(response.status_code, 200)
+        self.assertFalse(response.json()['locked'])



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot