From 0455f6f0a8fda5586ac2b708acd68abda864b230 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Sun, 07 Oct 2012 07:29:41 +0000 Subject: Fail if there is no way to return BLOB urls in GET requests and avoid returning raw BLOB meta --- 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() -- cgit v0.9.1