Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-10-07 07:29:41 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-10-07 12:10:27 (GMT)
commit0455f6f0a8fda5586ac2b708acd68abda864b230 (patch)
treeb77c063a3a8035ef0251fb8bfe4e5e9425a14fdd
parent054ea99ccd67e73919edb216480567796e57098b (diff)
Fail if there is no way to return BLOB urls in GET requests and avoid returning raw BLOB meta
-rw-r--r--sugar_network/resources/volume.py7
-rwxr-xr-xtests/units/node.py71
-rwxr-xr-xtests/units/volume.py95
3 files changed, 97 insertions, 76 deletions
diff --git a/sugar_network/resources/volume.py b/sugar_network/resources/volume.py
index a8f732b..440551a 100644
--- a/sugar_network/resources/volume.py
+++ b/sugar_network/resources/volume.py
@@ -215,11 +215,6 @@ class Commands(object):
def _mixin_blobs(self, request, result):
requested_guid = request.get('guid')
- if not requested_guid:
- reply = request.get('reply')
- if reply and 'guid' not in reply:
- return
-
if node.static_url.value:
prefix = node.static_url.value
elif hasattr(request, 'environ'):
@@ -237,6 +232,8 @@ class Commands(object):
for name, value in props.items():
if not isinstance(value, ad.PropertyMeta):
continue
+ enforce(guid, 'No way to get BLOB urls if %r was not '
+ 'in %r parameter', 'guid', 'reply')
props[name] = value.url(
default='/'.join(['', document, guid, name]) + postfix,
prefix=prefix)
diff --git a/tests/units/node.py b/tests/units/node.py
index e0bd295..376fd76 100755
--- a/tests/units/node.py
+++ b/tests/units/node.py
@@ -277,77 +277,6 @@ class NodeTest(tests.Test):
node.find_limit.value = 1
self.assertEqual(1, len(call(cp, method='GET', document='context', limit=1024)['result']))
- def test_GetBlobsByUrls(self):
- volume = Volume('db')
- cp = NodeCommands(volume)
-
- guid1 = call(cp, method='POST', document='context', principal='principal', content={
- 'type': 'activity',
- 'title': 'title1',
- 'summary': 'summary',
- 'description': 'description',
- })
- guid2 = call(cp, method='POST', document='context', principal='principal', content={
- 'type': 'activity',
- 'title': 'title2',
- 'summary': 'summary',
- 'description': 'description',
- })
- volume['context'].set_blob(guid2, 'icon', url='http://foo/bar')
- guid3 = call(cp, method='POST', document='context', principal='principal', content={
- 'type': 'activity',
- 'title': 'title3',
- 'summary': 'summary',
- 'description': 'description',
- })
- volume['context'].set_blob(guid3, 'icon', url='/foo/bar')
- guid4 = call(cp, method='POST', document='artifact', principal='principal', content={
- })
- guid5 = call(cp, method='POST', document='context', principal='principal', content={
- 'type': 'activity',
- 'title': 'title5',
- 'summary': 'summary',
- 'description': 'description',
- })
- volume['context'].set_blob(guid5, 'icon', url={'file1': {'order': 1, 'url': '/1'}, 'file2': {'order': 2, 'url': 'http://2'}})
-
- self.assertEqual(
- {'guid': guid1, 'icon': 'http://localhost/static/images/missing.png', 'layer': ['public']},
- call(cp, method='GET', document='context', guid=guid1, reply=['guid', 'icon', 'layer']))
- self.assertEqual(
- {'guid': guid2, 'icon': 'http://foo/bar', 'layer': ['public']},
- call(cp, method='GET', document='context', guid=guid2, reply=['guid', 'icon', 'layer']))
- self.assertEqual(
- {'guid': guid3, 'icon': 'http://localhost/foo/bar', 'layer': ['public']},
- call(cp, method='GET', document='context', guid=guid3, reply=['guid', 'icon', 'layer']))
- self.assertEqual(
- {'guid': guid4, 'data': 'http://localhost/artifact/%s/data' % guid4, 'layer': ['public']},
- call(cp, method='GET', document='artifact', guid=guid4, reply=['guid', 'data', 'layer']))
-
- self.assertEqual(
- sorted([
- {'guid': guid1, 'icon': 'http://localhost/static/images/missing.png', 'layer': ['public']},
- {'guid': guid2, 'icon': 'http://foo/bar', 'layer': ['public']},
- {'guid': guid3, 'icon': 'http://localhost/foo/bar', 'layer': ['public']},
- {'guid': guid5, 'icon': ['http://localhost/1', 'http://2'], 'layer': ['public']},
- ]),
- sorted(call(cp, method='GET', document='context', reply=['guid', 'icon', 'layer'])['result']))
-
- self.assertEqual([
- {'guid': guid4, 'data': 'http://localhost/artifact/%s/data' % guid4, 'layer': ['public']},
- ],
- call(cp, method='GET', document='artifact', reply=['guid', 'data', 'layer'])['result'])
-
- node.static_url.value = 'static_url'
- self.assertEqual(
- sorted([
- {'guid': guid1, 'icon': 'static_url/static/images/missing.png', 'layer': ['public']},
- {'guid': guid2, 'icon': 'http://foo/bar', 'layer': ['public']},
- {'guid': guid3, 'icon': 'static_url/foo/bar', 'layer': ['public']},
- {'guid': guid5, 'icon': ['static_url/1', 'http://2'], 'layer': ['public']},
- ]),
- sorted(call(cp, method='GET', document='context', reply=['guid', 'icon', 'layer'])['result']))
-
def test_DeletedDocuments(self):
volume = Volume('db')
cp = NodeCommands(volume)
diff --git a/tests/units/volume.py b/tests/units/volume.py
index 23e3733..aa01da0 100755
--- a/tests/units/volume.py
+++ b/tests/units/volume.py
@@ -6,6 +6,7 @@ import json
from __init__ import tests
import active_document as ad
+from sugar_network import node
from sugar_network.toolkit.collection import Sequence
from sugar_network.toolkit.sneakernet import InPacket, OutBufferPacket, DiskFull
from sugar_network.resources.volume import Volume, Resource, Commands, Request
@@ -247,6 +248,92 @@ class VolumeTest(tests.Test):
],
events)
+ def test_MixinBlobUrls(self):
+ volume = Volume('db')
+ cp = TestCommands(volume)
+
+ guid1 = call(cp, method='POST', document='context', principal='principal', content={
+ 'type': 'activity',
+ 'title': 'title1',
+ 'summary': 'summary',
+ 'description': 'description',
+ })
+ guid2 = call(cp, method='POST', document='context', principal='principal', content={
+ 'type': 'activity',
+ 'title': 'title2',
+ 'summary': 'summary',
+ 'description': 'description',
+ })
+ volume['context'].set_blob(guid2, 'icon', url='http://foo/bar')
+ guid3 = call(cp, method='POST', document='context', principal='principal', content={
+ 'type': 'activity',
+ 'title': 'title3',
+ 'summary': 'summary',
+ 'description': 'description',
+ })
+ volume['context'].set_blob(guid3, 'icon', url='/foo/bar')
+ guid4 = call(cp, method='POST', document='artifact', principal='principal', content={
+ })
+ guid5 = call(cp, method='POST', document='context', principal='principal', content={
+ 'type': 'activity',
+ 'title': 'title5',
+ 'summary': 'summary',
+ 'description': 'description',
+ })
+ volume['context'].set_blob(guid5, 'icon', url={'file1': {'order': 1, 'url': '/1'}, 'file2': {'order': 2, 'url': 'http://2'}})
+
+ # No GUID in reply
+ self.assertEqual(
+ {'icon': 'http://localhost/static/images/missing.png'},
+ call(cp, method='GET', document='context', guid=guid1, reply=['icon']))
+ self.assertEqual(
+ {'icon': 'http://foo/bar'},
+ call(cp, method='GET', document='context', guid=guid2, reply=['icon']))
+ self.assertEqual(
+ {'icon': 'http://localhost/foo/bar'},
+ call(cp, method='GET', document='context', guid=guid3, reply=['icon']))
+ self.assertEqual(
+ {'data': 'http://localhost/artifact/%s/data' % guid4},
+ call(cp, method='GET', document='artifact', guid=guid4, reply=['data']))
+ self.assertRaises(RuntimeError, call, cp, method='GET', document='context', reply=['icon'])
+
+ # GUID in reply
+ self.assertEqual(
+ {'guid': guid1, 'icon': 'http://localhost/static/images/missing.png', 'layer': ['public']},
+ call(cp, method='GET', document='context', guid=guid1, reply=['guid', 'icon', 'layer']))
+ self.assertEqual(
+ {'guid': guid2, 'icon': 'http://foo/bar', 'layer': ['public']},
+ call(cp, method='GET', document='context', guid=guid2, reply=['guid', 'icon', 'layer']))
+ self.assertEqual(
+ {'guid': guid3, 'icon': 'http://localhost/foo/bar', 'layer': ['public']},
+ call(cp, method='GET', document='context', guid=guid3, reply=['guid', 'icon', 'layer']))
+ self.assertEqual(
+ {'guid': guid4, 'data': 'http://localhost/artifact/%s/data' % guid4, 'layer': ['public']},
+ call(cp, method='GET', document='artifact', guid=guid4, reply=['guid', 'data', 'layer']))
+ self.assertEqual(
+ sorted([
+ {'guid': guid1, 'icon': 'http://localhost/static/images/missing.png', 'layer': ['public']},
+ {'guid': guid2, 'icon': 'http://foo/bar', 'layer': ['public']},
+ {'guid': guid3, 'icon': 'http://localhost/foo/bar', 'layer': ['public']},
+ {'guid': guid5, 'icon': ['http://localhost/1', 'http://2'], 'layer': ['public']},
+ ]),
+ sorted(call(cp, method='GET', document='context', reply=['guid', 'icon', 'layer'])['result']))
+
+ self.assertEqual([
+ {'guid': guid4, 'data': 'http://localhost/artifact/%s/data' % guid4, 'layer': ['public']},
+ ],
+ call(cp, method='GET', document='artifact', reply=['guid', 'data', 'layer'])['result'])
+
+ node.static_url.value = 'static_url'
+ self.assertEqual(
+ sorted([
+ {'guid': guid1, 'icon': 'static_url/static/images/missing.png', 'layer': ['public']},
+ {'guid': guid2, 'icon': 'http://foo/bar', 'layer': ['public']},
+ {'guid': guid3, 'icon': 'static_url/foo/bar', 'layer': ['public']},
+ {'guid': guid5, 'icon': ['static_url/1', 'http://2'], 'layer': ['public']},
+ ]),
+ sorted(call(cp, method='GET', document='context', reply=['guid', 'icon', 'layer'])['result']))
+
class TestCommands(ad.VolumeCommands, Commands):
@@ -267,5 +354,13 @@ def read_packet(packet):
return result
+def call(cp, principal=None, content=None, **kwargs):
+ request = Request(**kwargs)
+ request.principal = principal
+ request.content = content
+ request.environ = {'HTTP_HOST': 'localhost'}
+ return cp.call(request, ad.Response())
+
+
if __name__ == '__main__':
tests.main()