소스 검색

HUE-9096 [doc] Adding unit tests for link sharing

Romain 6 년 전
부모
커밋
9287be19f8
2개의 변경된 파일150개의 추가작업 그리고 59개의 파일을 삭제
  1. 139 52
      desktop/core/src/desktop/api2_tests.py
  2. 11 7
      desktop/core/src/desktop/models.py

+ 139 - 52
desktop/core/src/desktop/api2_tests.py

@@ -93,18 +93,13 @@ class TestDocumentApiSharingPermissions(object):
         'data': json.dumps(permissions)
     })
 
-  def share_doc_read_only(self, doc):
-    return self.share_doc(doc, {
-      'read': {
-        'user_ids': [
-          self.user.id
-        ],
-        'group_ids': []
-      },
-      'write': {
-        'user_ids': [],
-        'group_ids': []
-      }
+  def share_link_doc(self, doc, perm, is_on=False, client=None):
+    if client is None:
+      client = self.client
+
+    return client.post("/desktop/api2/doc/share/link", {
+        'uuid': json.dumps(doc.uuid),
+        'data': json.dumps({'name': 'link_%s' % perm, 'is_link_on': is_on})
     })
 
   def test_update_permissions(self):
@@ -125,24 +120,20 @@ class TestDocumentApiSharingPermissions(object):
   def test_share_document_permissions(self):
     # No doc
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_false(data['documents'])
+    assert_false(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_false(data['documents'])
+    assert_false(json.loads(response.content)['documents'])
 
     # Add doc
     doc = self._add_doc('test_update_permissions')
     doc_id = '%s' % doc.id
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_false(data['documents'])
+    assert_false(json.loads(response.content)['documents'])
 
     assert_true(doc.can_read(self.user))
     assert_true(doc.can_write(self.user))
@@ -172,12 +163,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_false(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     # Un-share
     response = self.share_doc(doc, {
@@ -201,12 +190,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_false(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_false(data['documents'])
+    assert_false(json.loads(response.content)['documents'])
 
     # Share by group
     default_group = get_default_user_group()
@@ -232,12 +219,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_true(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     # Un-share
     response = self.share_doc(doc, {
@@ -261,12 +246,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_false(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_false(data['documents'])
+    assert_false(json.loads(response.content)['documents'])
 
     # Modify by other user
     response = self.share_doc(doc, {
@@ -290,12 +273,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_true(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     # Un-share
     response = self.share_doc(doc, {
@@ -319,12 +300,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_false(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_false(data['documents'])
+    assert_false(json.loads(response.content)['documents'])
 
     # Modify by group
     response = self.share_doc(doc, {
@@ -348,12 +327,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_true(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     # Un-share
     response = self.share_doc(doc, {
@@ -377,12 +354,10 @@ class TestDocumentApiSharingPermissions(object):
     assert_false(doc.can_write(self.user_not_me))
 
     response = self.client.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_true(data['documents'])
+    assert_true(json.loads(response.content)['documents'])
 
     response = self.client_not_me.get('/desktop/api2/docs/')
-    data = json.loads(response.content)
-    assert_false(data['documents'])
+    assert_false(json.loads(response.content)['documents'])
 
 
   def test_update_permissions_cannot_escalate_privileges(self):
@@ -436,3 +411,115 @@ class TestDocumentApiSharingPermissions(object):
     assert_true(doc.can_write(self.user))
     assert_true(doc.can_read(self.user_not_me))
     assert_false(doc.can_write(self.user_not_me))
+
+
+  def test_link_sharing_permissions(self):
+    # Add doc
+    doc = self._add_doc('test_link_sharing_permissions')
+    doc_id = '%s' % doc.id
+
+    response = self.client.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_true(json.loads(response.content)['documents'])
+
+    response = self.client_not_me.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_false(json.loads(response.content)['documents'])
+
+    response = self.client.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    response = self.client_not_me.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(-1, json.loads(response.content)['status'], response.content)
+
+
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
+    # Share by read link
+    response = self.share_link_doc(doc, perm='read', is_on=True)
+
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_true(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
+    response = self.client.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_true(json.loads(response.content)['documents'])
+
+    response = self.client_not_me.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_false(json.loads(response.content)['documents'])  #  Link sharing does not list docs in Home, only provides direct access
+
+    response = self.client.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    response = self.client_not_me.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    # Un-share
+    response = self.share_link_doc(doc, perm='read', is_on=False)
+
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
+    response = self.client.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_true(json.loads(response.content)['documents'])
+
+    response = self.client_not_me.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_false(json.loads(response.content)['documents'])
+
+    response = self.client.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    response = self.client_not_me.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(-1, json.loads(response.content)['status'], response.content)
+
+    # Share by write link
+    response = self.share_link_doc(doc, perm='write', is_on=True)
+
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_true(doc.can_read(self.user_not_me))
+    assert_true(doc.can_write(self.user_not_me))
+
+    response = self.client.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_true(json.loads(response.content)['documents'])
+
+    response = self.client_not_me.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_false(json.loads(response.content)['documents'])
+
+    response = self.client.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    response = self.client_not_me.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    # Un-share
+    response = self.share_link_doc(doc, perm='write', is_on=False)
+
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    assert_true(doc.can_read(self.user))
+    assert_true(doc.can_write(self.user))
+    assert_false(doc.can_read(self.user_not_me))
+    assert_false(doc.can_write(self.user_not_me))
+
+    response = self.client.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_true(json.loads(response.content)['documents'])
+
+    response = self.client_not_me.get('/desktop/api2/docs/?text=test_link_sharing_permissions')
+    assert_false(json.loads(response.content)['documents'])
+
+    response = self.client.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(0, json.loads(response.content)['status'], response.content)
+
+    response = self.client_not_me.get('/desktop/api2/doc/?uuid=%s' % doc_id)
+    assert_equal(-1, json.loads(response.content)['status'], response.content)

+ 11 - 7
desktop/core/src/desktop/models.py

@@ -905,25 +905,29 @@ class FilesystemException(Exception):
 
 class Document2QueryMixin(object):
 
-  def documents(self, user, perms='both', include_history=False, include_trashed=False, include_managed=False):
+  def documents(self, user, perms='both', include_history=False, include_trashed=False, include_managed=False, include_shared_links=False):
     """
     Returns all documents that are owned or shared with the user.
     :param perms: both, shared, owned. Defaults to both.
     :param include_history: boolean flag to return history documents. Defaults to False.
     :param include_trashed: boolean flag to return trashed documents. Defaults to True.
+    :param include_managed: boolean flag to return documents generated by Hue. Defaults to False.
+    :param include_shared_links: boolean flag to include documents shared by links. Defaults to False.
     """
     if perms == 'both':
       docs = self.filter(
         Q(owner=user) |
         Q(document2permission__users=user) |
-        Q(document2permission__groups__in=user.groups.all())
+        Q(document2permission__groups__in=user.groups.all()) |
+        (Q(document2permission__is_link_on=include_shared_links) & Q(document2permission__is_link_on=True))
       )
     elif perms == 'shared':
       docs = self.filter(
         Q(document2permission__users=user) |
-        Q(document2permission__groups__in=user.groups.all())
+        Q(document2permission__groups__in=user.groups.all()) |
+        (Q(document2permission__is_link_on=include_shared_links) & Q(document2permission__is_link_on=True))
       )
-    else:  # only return documents owned by the user
+    else:  # Only return documents owned by the user
       docs = self.filter(owner=user)
 
     if not include_history:
@@ -970,15 +974,15 @@ class Document2Manager(models.Manager, Document2QueryMixin):
 
   # TODO prevent get() in favor of this
   def document(self, user, doc_id):
-    return self.documents(user, include_trashed=True, include_history=True).get(id=doc_id)
+    return self.documents(user, include_trashed=True, include_history=True, include_shared_links=True).get(id=doc_id)
 
   def get_by_natural_key(self, uuid, version, is_history):
     return self.get(uuid=uuid, version=version, is_history=is_history)
 
   def get_by_uuid(self, user, uuid, perm_type='read'):
     """
-    Since UUID is not a unique field, but part of a composite unique key, this returns the latest version by UUID
-    This should always be used in place of Document2.objects.get(uuid=) when a single document is expected
+    Since UUID is not a unique field, but part of a composite unique key, this returns the latest version by UUID.
+    This should always be used in place of Document2.objects.get(uuid=) when a single document is expected.
 
     :param user: User to check permissions against
     :param uuid