Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tests/units/node/node.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/units/node/node.py')
-rwxr-xr-xtests/units/node/node.py117
1 files changed, 109 insertions, 8 deletions
diff --git a/tests/units/node/node.py b/tests/units/node/node.py
index 388b2ed..9ad5726 100755
--- a/tests/units/node/node.py
+++ b/tests/units/node/node.py
@@ -1317,15 +1317,116 @@ class NodeTest(tests.Test):
'post.total',
], start=ts + 1, end=ts + 3))
+ def test_AggpropInsertAccess(self):
-def call(routes, method, document=None, guid=None, prop=None, principal=None, content=None, **kwargs):
- path = ['']
- if document:
- path.append(document)
- if guid:
- path.append(guid)
- if prop:
- path.append(prop)
+ class Document(db.Resource):
+
+ @db.stored_property(typecast=db.AggregatedType, default=db.AggregatedType(), acl=ACL.READ | ACL.INSERT)
+ def prop1(self, value):
+ return value
+
+ @db.stored_property(typecast=db.AggregatedType, default=db.AggregatedType(), acl=ACL.READ | ACL.INSERT | ACL.AUTHOR)
+ def prop2(self, value):
+ return value
+
+ volume = db.Volume('db', [Document, User])
+ volume['user'].create({'guid': tests.UID, 'name': 'user1', 'pubkey': {'blob': StringIO(tests.PUBKEY)}})
+ volume['user'].create({'guid': tests.UID2, 'name': 'user2', 'pubkey': {'blob': StringIO(tests.PUBKEY2)}})
+
+ cp = NodeRoutes('node', volume)
+ guid = call(cp, method='POST', document='document', principal=tests.UID, content={})
+ self.override(time, 'time', lambda: 0)
+
+ call(cp, method='POST', path=['document', guid, 'prop1'], principal=tests.UID, content={'guid': '1'})
+ call(cp, method='POST', path=['document', guid, 'prop1'], principal=tests.UID2, content={'guid': '2'})
+ self.assertEqual({
+ '1': {'seqno': 4, 'author': {tests.UID: {'name': 'user1', 'order': 0, 'role': 3}}},
+ '2': {'seqno': 5, 'author': {tests.UID2: {'name': 'user2', 'order': 0, 'role': 3}}},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop1']))
+
+ call(cp, method='POST', path=['document', guid, 'prop2'], principal=tests.UID, content={'guid': '1'})
+ self.assertRaises(http. Forbidden, call, cp, method='POST', path=['document', guid, 'prop2'], principal=tests.UID2, content={'guid': '2'})
+ self.assertEqual({
+ '1': {'seqno': 6, 'author': {tests.UID: {'name': 'user1', 'order': 0, 'role': 3}}},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop2']))
+
+ def test_AggpropRemoveAccess(self):
+
+ class Document(db.Resource):
+
+ @db.stored_property(typecast=db.AggregatedType, default=db.AggregatedType(), acl=ACL.READ | ACL.INSERT | ACL.REMOVE)
+ def prop1(self, value):
+ return value
+
+ @db.stored_property(typecast=db.AggregatedType, default=db.AggregatedType(), acl=ACL.READ | ACL.INSERT | ACL.REMOVE | ACL.AUTHOR)
+ def prop2(self, value):
+ return value
+
+ volume = db.Volume('db', [Document, User])
+ volume['user'].create({'guid': tests.UID, 'name': 'user1', 'pubkey': {'blob': StringIO(tests.PUBKEY)}})
+ volume['user'].create({'guid': tests.UID2, 'name': 'user2', 'pubkey': {'blob': StringIO(tests.PUBKEY2)}})
+
+ cp = NodeRoutes('node', volume)
+ guid = call(cp, method='POST', document='document', principal=tests.UID, content={})
+ self.override(time, 'time', lambda: 0)
+
+ call(cp, method='POST', path=['document', guid, 'prop1'], principal=tests.UID, content={'guid': '1', 'probe': True})
+ call(cp, method='POST', path=['document', guid, 'prop1'], principal=tests.UID2, content={'guid': '2', 'probe': True})
+ self.assertEqual({
+ '1': {'seqno': 4, 'probe': True, 'author': {tests.UID: {'name': 'user1', 'order': 0, 'role': 3}}},
+ '2': {'seqno': 5, 'probe': True, 'author': {tests.UID2: {'name': 'user2', 'order': 0, 'role': 3}}},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop1']))
+ self.assertRaises(http.Forbidden, call, cp, method='DELETE', path=['document', guid, 'prop1', '1'], principal=tests.UID2)
+ self.assertRaises(http.Forbidden, call, cp, method='DELETE', path=['document', guid, 'prop1', '2'], principal=tests.UID)
+ self.assertEqual({
+ '1': {'seqno': 4, 'probe': True, 'author': {tests.UID: {'name': 'user1', 'order': 0, 'role': 3}}},
+ '2': {'seqno': 5, 'probe': True, 'author': {tests.UID2: {'name': 'user2', 'order': 0, 'role': 3}}},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop1']))
+
+ call(cp, method='DELETE', path=['document', guid, 'prop1', '1'], principal=tests.UID)
+ self.assertEqual({
+ '1': {'seqno': 6},
+ '2': {'seqno': 5, 'probe': True, 'author': {tests.UID2: {'name': 'user2', 'order': 0, 'role': 3}}},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop1']))
+ call(cp, method='DELETE', path=['document', guid, 'prop1', '2'], principal=tests.UID2)
+ self.assertEqual({
+ '1': {'seqno': 6},
+ '2': {'seqno': 7},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop1']))
+
+ call(cp, method='POST', path=['document', guid, 'prop2'], principal=tests.UID, content={'guid': '1', 'probe': True})
+ self.assertEqual({
+ '1': {'seqno': 8, 'probe': True, 'author': {tests.UID: {'name': 'user1', 'order': 0, 'role': 3}}},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop2']))
+
+ self.assertRaises(http.Forbidden, call, cp, method='DELETE', path=['document', guid, 'prop2', '1'], principal=tests.UID2)
+ self.assertEqual({
+ '1': {'seqno': 8, 'probe': True, 'author': {tests.UID: {'name': 'user1', 'order': 0, 'role': 3}}},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop2']))
+ call(cp, method='DELETE', path=['document', guid, 'prop2', '1'], principal=tests.UID)
+ self.assertEqual({
+ '1': {'seqno': 9},
+ },
+ call(cp, method='GET', path=['document', guid, 'prop2']))
+
+
+def call(routes, method, document=None, guid=None, prop=None, principal=None, content=None, path=None, **kwargs):
+ if not path:
+ path = ['']
+ if document:
+ path.append(document)
+ if guid:
+ path.append(guid)
+ if prop:
+ path.append(prop)
env = {'REQUEST_METHOD': method,
'PATH_INFO': '/'.join(path),
'HTTP_HOST': '127.0.0.1',