Merge lp:~terrycojones/txfluiddb/perms-Dec-2009 into lp:txfluiddb

Proposed by Terry Jones
Status: Merged
Approved by: Tristan Seligmann
Approved revision: not available
Merged at revision: 6
Proposed branch: lp:~terrycojones/txfluiddb/perms-Dec-2009
Merge into: lp:txfluiddb
Diff against target: 710 lines (+273/-62)
3 files modified
txfluiddb/client.py (+60/-11)
txfluiddb/http.py (+3/-1)
txfluiddb/test/test_client.py (+210/-50)
To merge this branch: bzr merge lp:~terrycojones/txfluiddb/perms-Dec-2009
Reviewer Review Type Date Requested Status
Tristan Seligmann Needs Fixing
Review via email: mp+17545@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Terry Jones (terrycojones) wrote :

Add getting/setting perms on namespaces, tags, and sets of tag values.

Revision history for this message
Tristan Seligmann (mithrandi) wrote :

> 36 + components.extend([collectionName or self.collectionName] +
> 37 + self.components)

I'd write this as:

components.append(collectionName or self.collectionName)
components.extend(self.components)

We're supposed to be applying the Twisted coding standard; could you ensure all of the code you changed has three empty lines between classes, and two empty lines between functions / methods? There are various places that look like they need some additional empty lines, while class TagValueTests seems to have an extra empty line before it.

There are two pyflakes warnings, one of which was probably introduced in your previous branch, but I only noticed now:

http.py:11: 'log' imported but unused
test/test_client.py:7: 'TagValues' imported but unused

Aside from those issues, this all looks good; I like the test coverage, and I assume the semantics are correct given who wrote the code ;)

review: Needs Fixing
8. By Terry Jones

Cleanup following Tristan review: consistent whitespace between classes and methods/funcs, pyflakes warnings fixed, clearer/simple treatment of path in _HasPath.getURL

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'txfluiddb/client.py'
--- txfluiddb/client.py 2010-01-17 11:25:03 +0000
+++ txfluiddb/client.py 2010-01-17 19:12:17 +0000
@@ -9,6 +9,7 @@
9from txfluiddb.http import getPage9from txfluiddb.http import getPage
1010
1111
12
12class _HasPath(object):13class _HasPath(object):
13 """14 """
14 Base class for FluidDB identifiers composed of path components.15 Base class for FluidDB identifiers composed of path components.
@@ -68,7 +69,7 @@
68 return u'/'.join(self.components)69 return u'/'.join(self.components)
6970
7071
71 def getURL(self, endpoint, prefix=None, suffix=[]):72 def getURL(self, endpoint, prefix=None, suffix=None, collectionName=None):
72 """73 """
73 Get the URL for this path as accessed through the given endpoint.74 Get the URL for this path as accessed through the given endpoint.
7475
@@ -81,6 +82,9 @@
81 @type suffix: C{list} of C{unicode}82 @type suffix: C{list} of C{unicode}
82 @param suffix: A list of components to append after this path.83 @param suffix: A list of components to append after this path.
8384
85 @type collectionName: C{unicode}
86 @param suffix: A collectionName to use instead of self.collectionName.
87
84 @rtype: C{str}88 @rtype: C{str}
85 """89 """
86 if self.collectionName is None:90 if self.collectionName is None:
@@ -88,22 +92,41 @@
88 'Must override collectionName on _HasPath subclasses')92 'Must override collectionName on _HasPath subclasses')
8993
90 components = []94 components = []
91 if prefix is None:95 if prefix:
92 components.append(self.collectionName)
93 else:
94 components.extend(prefix)96 components.extend(prefix)
95 # Should self.collectionName be appended here? Or is a passed97 components.append(collectionName or self.collectionName)
96 # prefix supposed to take the place of the collection name?
97 components.extend(self.components)98 components.extend(self.components)
98 components.extend(suffix)99 if suffix:
100 components.extend(suffix)
99101
100 components = [quote(component.encode('utf-8'), safe='')102 components = [quote(component.encode('utf-8'), safe='')
101 for component in components]103 for component in components]
102 return endpoint.getRootURL() + '/'.join(components)104 return endpoint.getRootURL() + '/'.join(components)
103105
104106
105107class _HasPerms(object):
106class Namespace(_HasPath):108 """
109 Mixin base class for FluidDB elements that have permissions.
110 """
111
112
113 def getPerms(self, endpoint, action):
114 url = self.getURL(endpoint,
115 prefix=[u'permissions']) + '?action=%s' % action
116 d = endpoint.submit(url=url, method='GET')
117 return d.addCallback(lambda res: (res[u'policy'], res[u'exceptions']))
118
119
120 def setPerms(self, endpoint, action, policy, exceptions):
121 return endpoint.submit(
122 url=self.getURL(endpoint,
123 prefix=[u'permissions']) + '?action=%s' % action,
124 method='PUT',
125 data={u'policy' : policy, u'exceptions' : exceptions })
126
127
128
129class Namespace(_HasPath, _HasPerms):
107 """130 """
108 Representation of a FluidDB namespace.131 Representation of a FluidDB namespace.
109 """132 """
@@ -141,6 +164,21 @@
141 return Tag(*path)164 return Tag(*path)
142165
143166
167 def tagValues(self, name):
168 """
169 Get the tag values.
170
171 @type name: C{unicode}
172 @param name: The name of the tag.
173
174 @rtype: L{Tag}
175 @return: A TagValues object for the tag with the given name.
176 """
177 path = list(self.components)
178 path.append(name)
179 return TagValues(*path)
180
181
144 def getDescription(self, endpoint):182 def getDescription(self, endpoint):
145 """183 """
146 Get a description of the namespace.184 Get a description of the namespace.
@@ -258,7 +296,7 @@
258 @return: The newly-created tag.296 @return: The newly-created tag.
259 """297 """
260 self.checkComponent(name)298 self.checkComponent(name)
261 return endpoint.submit(url=self.getURL(endpoint, ['tags']),299 return endpoint.submit(url=self.getURL(endpoint, collectionName='tags'),
262 method='POST',300 method='POST',
263 data={u'name': name,301 data={u'name': name,
264 u'description': description,302 u'description': description,
@@ -279,7 +317,7 @@
279317
280318
281319
282class Tag(_HasPath):320class Tag(_HasPath, _HasPerms):
283 """321 """
284 Representation of a FluidDB tag.322 Representation of a FluidDB tag.
285 """323 """
@@ -332,6 +370,14 @@
332370
333371
334372
373class TagValues(_HasPath, _HasPerms):
374 """
375 Representation of the set of values of a tag.
376 """
377 collectionName = u'tag-values'
378
379
380
335class BasicCreds(object):381class BasicCreds(object):
336 """382 """
337 Credentials for HTTP Basic Authentication.383 Credentials for HTTP Basic Authentication.
@@ -346,6 +392,7 @@
346 self.username = username392 self.username = username
347 self.password = password393 self.password = password
348394
395
349 def encode(self):396 def encode(self):
350 """397 """
351 Encode these credentials.398 Encode these credentials.
@@ -362,6 +409,7 @@
362PRIMITIVE_CONTENT_TYPE = 'application/vnd.fluiddb.value+json'409PRIMITIVE_CONTENT_TYPE = 'application/vnd.fluiddb.value+json'
363410
364411
412
365class Endpoint(object):413class Endpoint(object):
366 """414 """
367 A FluidDB endpoint.415 A FluidDB endpoint.
@@ -505,6 +553,7 @@
505 return d.addCallback(_parse)553 return d.addCallback(_parse)
506554
507555
556
508class Object(_HasPath):557class Object(_HasPath):
509 """558 """
510 A FluidDB object.559 A FluidDB object.
511560
=== modified file 'txfluiddb/http.py'
--- txfluiddb/http.py 2010-01-17 11:25:03 +0000
+++ txfluiddb/http.py 2010-01-17 19:12:17 +0000
@@ -8,10 +8,10 @@
8FluidDB returns a 204 in various cases."""8FluidDB returns a 204 in various cases."""
99
10from twisted.internet import reactor10from twisted.internet import reactor
11from twisted.python import log
12from twisted.web import client, error11from twisted.web import client, error
1312
1413
14
15class HTTPError(error.Error):15class HTTPError(error.Error):
16 def __init__(self, code, message=None, response=None,16 def __init__(self, code, message=None, response=None,
17 response_headers=None):17 response_headers=None):
@@ -19,10 +19,12 @@
19 self.response_headers = response_headers19 self.response_headers = response_headers
2020
2121
22
22class HTTPPageGetter(client.HTTPPageGetter):23class HTTPPageGetter(client.HTTPPageGetter):
23 handleStatus_204 = lambda self: self.handleStatus_200()24 handleStatus_204 = lambda self: self.handleStatus_200()
2425
2526
27
26class HTTPClientFactory(client.HTTPClientFactory):28class HTTPClientFactory(client.HTTPClientFactory):
27 protocol = HTTPPageGetter29 protocol = HTTPPageGetter
28 30
2931
=== modified file 'txfluiddb/test/test_client.py'
--- txfluiddb/test/test_client.py 2009-10-18 01:44:44 +0000
+++ txfluiddb/test/test_client.py 2010-01-17 19:12:17 +0000
@@ -18,7 +18,7 @@
18 L{_HasPath.getURL} raises C{NotImplementedError} if C{collectionName}18 L{_HasPath.getURL} raises C{NotImplementedError} if C{collectionName}
19 is not overridden.19 is not overridden.
20 """20 """
21 endpoint = Endpoint('http://fluiddb.test.url/')21 endpoint = Endpoint('http://fluiddb.url/')
22 path = _HasPath(u'foo')22 path = _HasPath(u'foo')
23 self.assertRaises(NotImplementedError, path.getURL, endpoint)23 self.assertRaises(NotImplementedError, path.getURL, endpoint)
2424
@@ -38,44 +38,54 @@
38 The getURL method returns the URL for this entity as accessed through38 The getURL method returns the URL for this entity as accessed through
39 the given endpoint.39 the given endpoint.
40 """40 """
41 endpoint = Endpoint('http://fluiddb.test.url/')41 endpoint = Endpoint('http://fluiddb.url/')
42 path = _HasPath(u'foo')42 path = _HasPath(u'foo')
43 path.collectionName = 'tests'43 path.collectionName = u'tests'
44 self.assertEqual(path.getURL(endpoint),44 self.assertEqual(path.getURL(endpoint), 'http://fluiddb.url/tests/foo')
45 'http://fluiddb.test.url/tests/foo')
4645
4746
48 def test_getURLPrefix(self):47 def test_getURLPrefix(self):
49 """48 """
50 Passing prefix to getURL prepends the given components to the path.49 Passing prefix to getURL prepends the given components to the path.
51 """50 """
52 endpoint = Endpoint('http://fluiddb.test.url/')51 endpoint = Endpoint('http://fluiddb.url/')
53 path = _HasPath(u'foo')52 path = _HasPath(u'foo')
54 path.collectionName = 'tests'53 path.collectionName = u'tests'
55 self.assertEqual(path.getURL(endpoint, prefix=[u'quux', u'42']),54 self.assertEqual(path.getURL(endpoint, prefix=[u'quux', u'42']),
56 'http://fluiddb.test.url/quux/42/foo')55 'http://fluiddb.url/quux/42/tests/foo')
5756
5857
59 def test_getURLSuffix(self):58 def test_getURLSuffix(self):
60 """59 """
61 Passing suffix to getURL appends the given components to the path.60 Passing suffix to getURL appends the given components to the path.
62 """61 """
63 endpoint = Endpoint('http://fluiddb.test.url/')62 endpoint = Endpoint('http://fluiddb.url/')
64 path = _HasPath(u'foo')63 path = _HasPath(u'foo')
65 path.collectionName = 'tests'64 path.collectionName = u'tests'
66 self.assertEqual(path.getURL(endpoint, suffix=[u'quux', u'42']),65 self.assertEqual(path.getURL(endpoint, suffix=[u'quux', u'42']),
67 'http://fluiddb.test.url/tests/foo/quux/42')66 'http://fluiddb.url/tests/foo/quux/42')
67
68
69 def test_getURLCollectionName(self):
70 """
71 Passing collectionName to getURL overrides the one in self.
72 """
73 endpoint = Endpoint('http://fluiddb.url/')
74 path = _HasPath(u'foo')
75 path.collectionName = u'tests'
76 self.assertEqual(path.getURL(endpoint, collectionName=u'new'),
77 'http://fluiddb.url/new/foo')
6878
6979
70 def test_urlEncoding(self):80 def test_urlEncoding(self):
71 """81 """
72 URL encoding is done according to IRI rules.82 URL encoding is done according to IRI rules.
73 """83 """
74 endpoint = Endpoint('http://fluiddb.test.url/')84 endpoint = Endpoint('http://fluiddb.url/')
75 path = _HasPath(u'r\xfasty')85 path = _HasPath(u'r\xfasty')
76 path.collectionName = 'tests'86 path.collectionName = u'tests'
77 self.assertEqual(path.getURL(endpoint),87 self.assertEqual(path.getURL(endpoint),
78 'http://fluiddb.test.url/tests/r%C3%BAsty')88 'http://fluiddb.url/tests/r%C3%BAsty')
7989
8090
8191
@@ -84,7 +94,7 @@
84 Tests for L{Namespace}.94 Tests for L{Namespace}.
85 """95 """
86 def setUp(self):96 def setUp(self):
87 self.endpoint = MockEndpoint('http://fluiddb.test.url/')97 self.endpoint = MockEndpoint('http://fluiddb.url/')
88 self.namespace = Namespace(u'test')98 self.namespace = Namespace(u'test')
8999
90100
@@ -118,8 +128,17 @@
118 """128 """
119 The tag method returns a tag of the given name in this namespace.129 The tag method returns a tag of the given name in this namespace.
120 """130 """
121 tag = Namespace(u'test').tag(u'sometag')131 tag = Namespace(u'test').tag(u'atag')
122 self.assertEqual(tag.getPath(), u'test/sometag')132 self.assertEqual(tag.getPath(), u'test/atag')
133
134
135 def test_tagValues(self):
136 """
137 The tagValues method returns a TagValues object for the given name
138 in this namespace.
139 """
140 tagValues = Namespace(u'test').tagValues(u'atag')
141 self.assertEqual(tagValues.getPath(), u'test/atag')
123142
124143
125 def test_collectionName(self):144 def test_collectionName(self):
@@ -128,7 +147,7 @@
128 """147 """
129 namespace = Namespace(u'test')148 namespace = Namespace(u'test')
130 self.assertEqual(namespace.child(u'namespace').getURL(self.endpoint),149 self.assertEqual(namespace.child(u'namespace').getURL(self.endpoint),
131 'http://fluiddb.test.url/namespaces/test/namespace')150 'http://fluiddb.url/namespaces/test/namespace')
132151
133152
134 def test_getDescription(self):153 def test_getDescription(self):
@@ -146,7 +165,7 @@
146 self.assertEqual(self.endpoint.method, 'GET')165 self.assertEqual(self.endpoint.method, 'GET')
147 self.assertEqual(166 self.assertEqual(
148 self.endpoint.url,167 self.endpoint.url,
149 'http://fluiddb.test.url/namespaces/test?returnDescription=true')168 'http://fluiddb.url/namespaces/test?returnDescription=true')
150 self.assertEqual(self.endpoint.data, None)169 self.assertEqual(self.endpoint.data, None)
151 return d170 return d
152171
@@ -160,7 +179,7 @@
160 d = self.namespace.setDescription(self.endpoint, u'New description')179 d = self.namespace.setDescription(self.endpoint, u'New description')
161 self.assertEqual(self.endpoint.method, 'PUT')180 self.assertEqual(self.endpoint.method, 'PUT')
162 self.assertEqual(self.endpoint.url,181 self.assertEqual(self.endpoint.url,
163 'http://fluiddb.test.url/namespaces/test')182 'http://fluiddb.url/namespaces/test')
164 self.assertEqual(json.loads(self.endpoint.data),183 self.assertEqual(json.loads(self.endpoint.data),
165 {u'description': u'New description'})184 {u'description': u'New description'})
166 return d185 return d
@@ -187,7 +206,7 @@
187 self.assertEqual(self.endpoint.method, 'GET')206 self.assertEqual(self.endpoint.method, 'GET')
188 self.assertEqual(207 self.assertEqual(
189 self.endpoint.url,208 self.endpoint.url,
190 'http://fluiddb.test.url/namespaces/test?returnNamespaces=true')209 'http://fluiddb.url/namespaces/test?returnNamespaces=true')
191 self.assertEqual(self.endpoint.data, None)210 self.assertEqual(self.endpoint.data, None)
192 return d211 return d
193212
@@ -212,7 +231,7 @@
212 self.assertEqual(self.endpoint.method, 'GET')231 self.assertEqual(self.endpoint.method, 'GET')
213 self.assertEqual(232 self.assertEqual(
214 self.endpoint.url,233 self.endpoint.url,
215 'http://fluiddb.test.url/namespaces/test?returnTags=true')234 'http://fluiddb.url/namespaces/test?returnTags=true')
216 self.assertEqual(self.endpoint.data, None)235 self.assertEqual(self.endpoint.data, None)
217 return d236 return d
218237
@@ -222,7 +241,7 @@
222 Test creating a new namespace under an existing namespace.241 Test creating a new namespace under an existing namespace.
223 """242 """
224 res = {u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',243 res = {u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',
225 u'URI': u'http://fluiddb.test.url/namespaces/test/newchild'}244 u'URI': u'http://fluiddb.url/namespaces/test/newchild'}
226 self.endpoint.response = json.dumps(res)245 self.endpoint.response = json.dumps(res)
227246
228 def _gotResult(ns):247 def _gotResult(ns):
@@ -234,7 +253,7 @@
234 u'New child namespace')253 u'New child namespace')
235 self.assertEqual(self.endpoint.method, 'POST')254 self.assertEqual(self.endpoint.method, 'POST')
236 self.assertEqual(self.endpoint.url,255 self.assertEqual(self.endpoint.url,
237 'http://fluiddb.test.url/namespaces/test')256 'http://fluiddb.url/namespaces/test')
238 self.assertEqual(json.loads(self.endpoint.data),257 self.assertEqual(json.loads(self.endpoint.data),
239 {u'name': u'newchild',258 {u'name': u'newchild',
240 u'description': u'New child namespace'})259 u'description': u'New child namespace'})
@@ -258,7 +277,7 @@
258 Test creating a tag in a namespace.277 Test creating a tag in a namespace.
259 """278 """
260 response = {u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',279 response = {u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',
261 u'URI': u'http://fluiddb.test.url/tags/test/newtag'}280 u'URI': u'http://fluiddb.url/tags/test/newtag'}
262 self.endpoint.response = json.dumps(response)281 self.endpoint.response = json.dumps(response)
263282
264 def _gotResult(tag):283 def _gotResult(tag):
@@ -271,7 +290,7 @@
271 False)290 False)
272 self.assertEqual(self.endpoint.method, 'POST')291 self.assertEqual(self.endpoint.method, 'POST')
273 self.assertEqual(self.endpoint.url,292 self.assertEqual(self.endpoint.url,
274 'http://fluiddb.test.url/tags/test')293 'http://fluiddb.url/tags/test')
275 self.assertEqual(json.loads(self.endpoint.data),294 self.assertEqual(json.loads(self.endpoint.data),
276 {u'name': u'newtag',295 {u'name': u'newtag',
277 u'description': u'New tag',296 u'description': u'New tag',
@@ -301,7 +320,48 @@
301 d = self.namespace.delete(self.endpoint)320 d = self.namespace.delete(self.endpoint)
302 self.assertEqual(self.endpoint.method, 'DELETE')321 self.assertEqual(self.endpoint.method, 'DELETE')
303 self.assertEqual(self.endpoint.url,322 self.assertEqual(self.endpoint.url,
304 'http://fluiddb.test.url/namespaces/test')323 'http://fluiddb.url/namespaces/test')
324 return d
325
326
327 def test_getPerms(self):
328 """
329 Test getting permissions for a namespace.
330 """
331 response = {u'policy': u'open',
332 u'exceptions': [u'tom', u'dick', u'harry']}
333 self.endpoint.response = json.dumps(response)
334
335 def _gotResult((policy, exceptions)):
336 self.assertEqual(policy, u'open')
337 self.assertEqual(exceptions, [u'tom', u'dick', u'harry'])
338
339 d = self.namespace.getPerms(self.endpoint, 'create')
340 d.addCallback(_gotResult)
341 self.assertEqual(self.endpoint.method, 'GET')
342 self.assertEqual(
343 self.endpoint.url,
344 'http://fluiddb.url/permissions/namespaces/test?action=create')
345 return d
346
347
348 def test_setPerms(self):
349 """
350 Test setting permissions for a namespace.
351 """
352 self.endpoint.response = ''
353
354 d = self.namespace.setPerms(self.endpoint,
355 'create',
356 u'open',
357 [u'tom', u'dick', u'harry'])
358 self.assertEqual(self.endpoint.method, 'PUT')
359 self.assertEqual(
360 self.endpoint.url,
361 'http://fluiddb.url/permissions/namespaces/test?action=create')
362 self.assertEqual(json.loads(self.endpoint.data),
363 {u'policy': u'open',
364 u'exceptions': [u'tom', u'dick', u'harry']})
305 return d365 return d
306366
307367
@@ -311,8 +371,8 @@
311 Tests for L{Tag}.371 Tests for L{Tag}.
312 """372 """
313 def setUp(self):373 def setUp(self):
314 self.endpoint = MockEndpoint('http://fluiddb.test.url/')374 self.endpoint = MockEndpoint('http://fluiddb.url/')
315 self.tag = Namespace(u'test').tag(u'sometag')375 self.tag = Namespace(u'test').tag(u'atag')
316376
317377
318 def test_collectionName(self):378 def test_collectionName(self):
@@ -320,9 +380,9 @@
320 Tags are under the collection name 'tags'.380 Tags are under the collection name 'tags'.
321 """381 """
322 namespace = Namespace(u'test')382 namespace = Namespace(u'test')
323 endpoint = Endpoint('http://fluiddb.test.url/')383 endpoint = Endpoint('http://fluiddb.url/')
324 self.assertEqual(namespace.tag(u'tag').getURL(endpoint),384 self.assertEqual(namespace.tag(u'tag').getURL(endpoint),
325 'http://fluiddb.test.url/tags/test/tag')385 'http://fluiddb.url/tags/test/tag')
326386
327387
328 def test_getDescription(self):388 def test_getDescription(self):
@@ -341,7 +401,7 @@
341 self.assertEqual(self.endpoint.method, 'GET')401 self.assertEqual(self.endpoint.method, 'GET')
342 self.assertEqual(402 self.assertEqual(
343 self.endpoint.url,403 self.endpoint.url,
344 'http://fluiddb.test.url/tags/test/sometag?returnDescription=true')404 'http://fluiddb.url/tags/test/atag?returnDescription=true')
345 self.assertEqual(self.endpoint.data, None)405 self.assertEqual(self.endpoint.data, None)
346 return d406 return d
347407
@@ -355,7 +415,7 @@
355 d = self.tag.setDescription(self.endpoint, u'New description')415 d = self.tag.setDescription(self.endpoint, u'New description')
356 self.assertEqual(self.endpoint.method, 'PUT')416 self.assertEqual(self.endpoint.method, 'PUT')
357 self.assertEqual(self.endpoint.url,417 self.assertEqual(self.endpoint.url,
358 'http://fluiddb.test.url/tags/test/sometag')418 'http://fluiddb.url/tags/test/atag')
359 self.assertEqual(json.loads(self.endpoint.data),419 self.assertEqual(json.loads(self.endpoint.data),
360 {u'description': u'New description'})420 {u'description': u'New description'})
361 return d421 return d
@@ -370,7 +430,107 @@
370 d = self.tag.delete(self.endpoint)430 d = self.tag.delete(self.endpoint)
371 self.assertEqual(self.endpoint.method, 'DELETE')431 self.assertEqual(self.endpoint.method, 'DELETE')
372 self.assertEqual(self.endpoint.url,432 self.assertEqual(self.endpoint.url,
373 'http://fluiddb.test.url/tags/test/sometag')433 'http://fluiddb.url/tags/test/atag')
434 return d
435
436
437 def test_getPerms(self):
438 """
439 Test getting permissions for a tag.
440 """
441 response = {u'policy': u'open',
442 u'exceptions': [u'tom', u'dick', u'harry']}
443 self.endpoint.response = json.dumps(response)
444
445 def _gotResult((policy, exceptions)):
446 self.assertEqual(policy, u'open')
447 self.assertEqual(exceptions, [u'tom', u'dick', u'harry'])
448
449 d = self.tag.getPerms(self.endpoint, 'create').addCallback(_gotResult)
450 self.assertEqual(self.endpoint.method, 'GET')
451 self.assertEqual(
452 self.endpoint.url,
453 'http://fluiddb.url/permissions/tags/test/atag?action=create')
454 return d
455
456
457 def test_setPerms(self):
458 """
459 Test setting permissions for a tag.
460 """
461 self.endpoint.response = ''
462
463 d = self.tag.setPerms(self.endpoint,
464 'create',
465 u'open',
466 [u'tom', u'dick', u'harry'])
467 self.assertEqual(self.endpoint.method, 'PUT')
468 self.assertEqual(
469 self.endpoint.url,
470 'http://fluiddb.url/permissions/tags/test/atag?action=create')
471 self.assertEqual(json.loads(self.endpoint.data),
472 {u'policy': u'open',
473 u'exceptions': [u'tom', u'dick', u'harry']})
474 return d
475
476
477class TagValueTests(TestCase):
478 """
479 Tests for L{TagValues}.
480 """
481 def setUp(self):
482 self.endpoint = MockEndpoint('http://fluiddb.url/')
483 self.tagValues = Namespace(u'test').tagValues(u'atag')
484
485
486 def test_collectionName(self):
487 """
488 Tag values are under the collection name 'tag-values'.
489 """
490 namespace = Namespace(u'test')
491 endpoint = Endpoint('http://fluiddb.url/')
492 self.assertEqual(namespace.tagValues(u'tag').getURL(endpoint),
493 'http://fluiddb.url/tag-values/test/tag')
494
495
496 def test_getPerms(self):
497 """
498 Test getting permissions for a tag's values.
499 """
500 response = {u'policy': u'open',
501 u'exceptions': [u'tom', u'dick', u'harry']}
502 self.endpoint.response = json.dumps(response)
503
504 def _gotResult((policy, exceptions)):
505 self.assertEqual(policy, u'open')
506 self.assertEqual(exceptions, [u'tom', u'dick', u'harry'])
507
508 d = self.tagValues.getPerms(self.endpoint, 'create')
509 d.addCallback(_gotResult)
510 self.assertEqual(self.endpoint.method, 'GET')
511 self.assertEqual(
512 self.endpoint.url,
513 'http://fluiddb.url/permissions/tag-values/test/atag?action=create')
514 return d
515
516
517 def test_setPerms(self):
518 """
519 Test setting permissions for a tag.
520 """
521 self.endpoint.response = ''
522
523 d = self.tagValues.setPerms(self.endpoint,
524 'create',
525 u'open',
526 [u'tom', u'dick', u'harry'])
527 self.assertEqual(self.endpoint.method, 'PUT')
528 self.assertEqual(
529 self.endpoint.url,
530 'http://fluiddb.url/permissions/tag-values/test/atag?action=create')
531 self.assertEqual(json.loads(self.endpoint.data),
532 {u'policy': u'open',
533 u'exceptions': [u'tom', u'dick', u'harry']})
374 return d534 return d
375535
376536
@@ -401,7 +561,7 @@
401 """561 """
402 Constructing an endpoint stores the given base URL.562 Constructing an endpoint stores the given base URL.
403 """563 """
404 url = 'http://fluiddb.test.url/'564 url = 'http://fluiddb.url/'
405 endpoint = Endpoint(url)565 endpoint = Endpoint(url)
406 self.assertEqual(endpoint.baseURL, url)566 self.assertEqual(endpoint.baseURL, url)
407567
@@ -426,9 +586,9 @@
426 """586 """
427 The root URL must include the API version if specified.587 The root URL must include the API version if specified.
428 """588 """
429 endpoint = Endpoint('http://fluiddb.test.url/', '20090817')589 endpoint = Endpoint('http://fluiddb.url/', '20090817')
430 self.assertEqual(endpoint.getRootURL(),590 self.assertEqual(endpoint.getRootURL(),
431 'http://fluiddb.test.url/20090817/')591 'http://fluiddb.url/20090817/')
432592
433593
434 def test_basicAuth(self):594 def test_basicAuth(self):
@@ -437,9 +597,9 @@
437 with every request.597 with every request.
438 """598 """
439 creds = BasicCreds('testuser', 'password')599 creds = BasicCreds('testuser', 'password')
440 endpoint = MockEndpoint('http://fluiddb.test.url/', creds=creds)600 endpoint = MockEndpoint('http://fluiddb.url/', creds=creds)
441 endpoint.response = ''601 endpoint.response = ''
442 endpoint.submit('http://fluiddb.test.url/blah', 'GET')602 endpoint.submit('http://fluiddb.url/blah', 'GET')
443 self.assertEqual(endpoint.headers['Authorization'],603 self.assertEqual(endpoint.headers['Authorization'],
444 'Basic dGVzdHVzZXI6cGFzc3dvcmQ=')604 'Basic dGVzdHVzZXI6cGFzc3dvcmQ=')
445605
@@ -458,7 +618,7 @@
458 Tests for L{Object}.618 Tests for L{Object}.
459 """619 """
460 def setUp(self):620 def setUp(self):
461 self.endpoint = MockEndpoint('http://fluiddb.test.url/')621 self.endpoint = MockEndpoint('http://fluiddb.url/')
462622
463623
464 def test_getTags(self):624 def test_getTags(self):
@@ -484,7 +644,7 @@
484 self.assertEqual(self.endpoint.method, 'GET')644 self.assertEqual(self.endpoint.method, 'GET')
485 self.assertEqual(645 self.assertEqual(
486 self.endpoint.url,646 self.endpoint.url,
487 'http://fluiddb.test.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx')647 'http://fluiddb.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx')
488 self.assertEqual(json.loads(self.endpoint.data),648 self.assertEqual(json.loads(self.endpoint.data),
489 {u'showAbout': True})649 {u'showAbout': True})
490 return d650 return d
@@ -504,7 +664,7 @@
504 self.assertEqual(self.endpoint.data, None)664 self.assertEqual(self.endpoint.data, None)
505 self.assertEqual(665 self.assertEqual(
506 self.endpoint.url,666 self.endpoint.url,
507 'http://fluiddb.test.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')667 'http://fluiddb.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')
508 return d668 return d
509669
510670
@@ -553,7 +713,7 @@
553 self.assertEqual(self.endpoint.method, 'DELETE')713 self.assertEqual(self.endpoint.method, 'DELETE')
554 self.assertEqual(714 self.assertEqual(
555 self.endpoint.url,715 self.endpoint.url,
556 'http://fluiddb.test.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')716 'http://fluiddb.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')
557 self.assertEqual(self.endpoint.data, None)717 self.assertEqual(self.endpoint.data, None)
558 return d718 return d
559719
@@ -570,7 +730,7 @@
570 self.assertEqual(self.endpoint.method, 'PUT')730 self.assertEqual(self.endpoint.method, 'PUT')
571 self.assertEqual(731 self.assertEqual(
572 self.endpoint.url,732 self.endpoint.url,
573 'http://fluiddb.test.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')733 'http://fluiddb.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')
574 self.assertEqual(json.loads(self.endpoint.data), 42)734 self.assertEqual(json.loads(self.endpoint.data), 42)
575 return d735 return d
576736
@@ -588,7 +748,7 @@
588 self.assertEqual(self.endpoint.method, 'PUT')748 self.assertEqual(self.endpoint.method, 'PUT')
589 self.assertEqual(749 self.assertEqual(
590 self.endpoint.url,750 self.endpoint.url,
591 'http://fluiddb.test.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')751 'http://fluiddb.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/test/tag')
592 self.assertEqual(self.endpoint.data, '<p>foo</p>')752 self.assertEqual(self.endpoint.data, '<p>foo</p>')
593 self.assertEqual(self.endpoint.headers['Content-Type'], 'text/html')753 self.assertEqual(self.endpoint.headers['Content-Type'], 'text/html')
594 return d754 return d
@@ -598,7 +758,7 @@
598 """758 """
599 Creating an object returns the newly created object.759 Creating an object returns the newly created object.
600 """760 """
601 response = {u'URI': u'http://fluiddb.test.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',761 response = {u'URI': u'http://fluiddb.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',
602 u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'}762 u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'}
603 self.endpoint.response = json.dumps(response)763 self.endpoint.response = json.dumps(response)
604764
@@ -608,7 +768,7 @@
608768
609 d = Object.create(self.endpoint).addCallback(_gotResponse)769 d = Object.create(self.endpoint).addCallback(_gotResponse)
610 self.assertEqual(self.endpoint.method, 'POST')770 self.assertEqual(self.endpoint.method, 'POST')
611 self.assertEqual(self.endpoint.url, 'http://fluiddb.test.url/objects')771 self.assertEqual(self.endpoint.url, 'http://fluiddb.url/objects')
612 self.assertEqual(self.endpoint.data, None)772 self.assertEqual(self.endpoint.data, None)
613 return d773 return d
614774
@@ -617,7 +777,7 @@
617 """777 """
618 Test creating an object with an about value.778 Test creating an object with an about value.
619 """779 """
620 response = {u'URI': u'http://fluiddb.test.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',780 response = {u'URI': u'http://fluiddb.url/objects/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',
621 u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'}781 u'id': u'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'}
622 self.endpoint.response = json.dumps(response)782 self.endpoint.response = json.dumps(response)
623783
@@ -627,7 +787,7 @@
627787
628 d = Object.create(self.endpoint, u'New object').addCallback(_gotResponse)788 d = Object.create(self.endpoint, u'New object').addCallback(_gotResponse)
629 self.assertEqual(self.endpoint.method, 'POST')789 self.assertEqual(self.endpoint.method, 'POST')
630 self.assertEqual(self.endpoint.url, 'http://fluiddb.test.url/objects')790 self.assertEqual(self.endpoint.url, 'http://fluiddb.url/objects')
631 self.assertEqual(json.loads(self.endpoint.data),791 self.assertEqual(json.loads(self.endpoint.data),
632 {u'about': u'New object'})792 {u'about': u'New object'})
633 return d793 return d
@@ -651,6 +811,6 @@
651811
652 d = Object.query(self.endpoint, u'has fluiddb/about').addCallback(_gotResponse)812 d = Object.query(self.endpoint, u'has fluiddb/about').addCallback(_gotResponse)
653 self.assertEqual(self.endpoint.method, 'GET')813 self.assertEqual(self.endpoint.method, 'GET')
654 self.assertEqual(self.endpoint.url, 'http://fluiddb.test.url/objects?query=has+fluiddb%2Fabout')814 self.assertEqual(self.endpoint.url, 'http://fluiddb.url/objects?query=has+fluiddb%2Fabout')
655 self.assertEqual(self.endpoint.data, None)815 self.assertEqual(self.endpoint.data, None)
656 return d816 return d

Subscribers

People subscribed via source and target branches

to all changes: