From 499eb6e121dfe7cef521553eba3f85e9122a6cea Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Tue, 31 Dec 2013 21:02:48 +0000 Subject: Use stubs for missed context images; rename context types --- diff --git a/misc/stub-images b/misc/stub-images new file mode 100755 index 0000000..93f0fac --- /dev/null +++ b/misc/stub-images @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# sugar-lint: disable + +# Copyright (C) 2013 Aleksey Lim +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from optparse import OptionParser + +from sugar_network import db, model, static +from sugar_network.model.context import Context +from sugar_network.node import data_root +from sugar_network.toolkit import Option + + +Option.seek('node', [data_root]) +Option.parse_args(OptionParser(), config_files=['~/.config/sugar-network/config']) + +db.index_write_queue.value = 1024 * 10 +db.index_flush_threshold.value = 0 +db.index_flush_timeout.value = 0 + +volume = db.Volume(data_root.value, model.RESOURCES) +volume.populate() +directory = volume['context'] +try: + items, __ = directory.find() + for context in items: + if context['artifact_icon'] or not (set(context['type']) & set(['activity', 'book', 'group'])): + continue + for name in ('activity', 'book', 'group'): + if name in context['type']: + with file(static.path('images', name + '.svg')) as f: + Context.populate_images(context, f.read()) + directory.update(context.guid, context) + break +finally: + volume.close() diff --git a/sugar_network/db/routes.py b/sugar_network/db/routes.py index bff9fc5..9f59d68 100644 --- a/sugar_network/db/routes.py +++ b/sugar_network/db/routes.py @@ -135,14 +135,6 @@ class Routes(object): directory.update(request.guid, {'author': authors}) def on_create(self, request, props, event): - if 'guid' in props: - # TODO Temporal security hole, see TODO - guid = props['guid'] - enforce(not self.volume[request.resource].exists(guid), - '%s already exists', guid) - enforce(_GUID_RE.match(guid) is not None, - 'Malformed %s GUID', guid) - ts = int(time.time()) props['ctime'] = ts props['mtime'] = ts @@ -204,6 +196,14 @@ class Routes(object): content.get(name) is None and \ (prop.default is not None or prop.on_set is not None): doc[name] = prop.default + if doc['guid']: + # TODO Temporal security hole, see TODO + enforce(not self.volume[request.resource].exists(doc['guid']), + '%s already exists', doc['guid']) + enforce(_GUID_RE.match(doc['guid']) is not None, + 'Malformed %s GUID', doc['guid']) + else: + doc['guid'] = toolkit.uuid() try: for name, value in doc.props.items(): diff --git a/sugar_network/model/__init__.py b/sugar_network/model/__init__.py index bb70a8a..c846bc7 100644 --- a/sugar_network/model/__init__.py +++ b/sugar_network/model/__init__.py @@ -16,7 +16,7 @@ from sugar_network.model.routes import VolumeRoutes, FrontRoutes -CONTEXT_TYPES = ['activity', 'project', 'package', 'content'] +CONTEXT_TYPES = ['activity', 'group', 'package', 'book'] NOTIFICATION_TYPES = ['create', 'update', 'delete', 'vote'] FEEDBACK_TYPES = ['question', 'idea', 'problem'] ARTIFACT_TYPES = ['instance', 'preview'] diff --git a/sugar_network/model/artifact.py b/sugar_network/model/artifact.py index e461c4d..0a0239d 100644 --- a/sugar_network/model/artifact.py +++ b/sugar_network/model/artifact.py @@ -13,8 +13,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from os.path import join - from sugar_network import db, model, static from sugar_network.toolkit.router import Blob, ACL @@ -62,8 +60,8 @@ class Artifact(db.Resource): if value: return value return Blob({ - 'url': '/static/images/missing.png', - 'blob': join(static.PATH, 'images', 'missing.png'), + 'url': '/static/images/missing-preview.png', + 'blob': static.path('images', 'missing-preview.png'), 'mime_type': 'image/png', }) diff --git a/sugar_network/model/context.py b/sugar_network/model/context.py index 869ad6c..461960b 100644 --- a/sugar_network/model/context.py +++ b/sugar_network/model/context.py @@ -13,9 +13,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from os.path import join +import hashlib +from cStringIO import StringIO -from sugar_network import db, model, static +from sugar_network import db, model, static, toolkit from sugar_network.toolkit.router import Blob, ACL @@ -30,6 +31,13 @@ class Context(db.Resource): def type(self, value): if value and 'package' in value and 'common' not in self['layer']: self['layer'] = tuple(self['layer']) + ('common',) + if 'artifact_icon' not in self: + for name in ('activity', 'book', 'group'): + if name not in self.type: + continue + with file(static.path('images', name + '.svg')) as f: + Context.populate_images(self, f.read()) + break return value @db.indexed_property(slot=1, prefix='S', full_text=True, localized=True) @@ -59,13 +67,13 @@ class Context(db.Resource): if 'package' in self['type']: return Blob({ 'url': '/static/images/package.png', - 'blob': join(static.PATH, 'images', 'package.png'), + 'blob': static.path('images', 'package.png'), 'mime_type': 'image/png', }) else: return Blob({ 'url': '/static/images/missing.png', - 'blob': join(static.PATH, 'images', 'missing.png'), + 'blob': static.path('images', 'missing.png'), 'mime_type': 'image/png', }) @@ -73,21 +81,35 @@ class Context(db.Resource): def artifact_icon(self, value): if value: return value - return Blob({ - 'url': '/static/images/missing.svg', - 'blob': join(static.PATH, 'images', 'missing.svg'), - 'mime_type': 'image/svg+xml', - }) + if 'package' in self['type']: + return Blob({ + 'url': '/static/images/package.svg', + 'blob': static.path('images', 'package.svg'), + 'mime_type': 'image/png', + }) + else: + return Blob({ + 'url': '/static/images/missing.svg', + 'blob': static.path('images', 'missing.svg'), + 'mime_type': 'image/svg+xml', + }) @db.blob_property(mime_type='image/png') def preview(self, value): if value: return value - return Blob({ - 'url': '/static/images/missing.png', - 'blob': join(static.PATH, 'images', 'missing.png'), - 'mime_type': 'image/png', - }) + if 'package' in self['type']: + return Blob({ + 'url': '/static/images/package-preview.png', + 'blob': static.path('images', 'package-preview.png'), + 'mime_type': 'image/png', + }) + else: + return Blob({ + 'url': '/static/images/missing-preview.png', + 'blob': static.path('images', 'missing-preview.png'), + 'mime_type': 'image/png', + }) @db.indexed_property(slot=3, default=0, acl=ACL.READ | ACL.CALC) def downloads(self, value): @@ -130,3 +152,24 @@ class Context(db.Resource): @db.stored_property(typecast=dict, default={}, acl=ACL.PUBLIC | ACL.LOCAL) def packages(self, value): return value + + @staticmethod + def populate_images(props, svg): + if 'guid' in props: + from sugar_network.toolkit.sugar import color_svg + svg = color_svg(svg, props['guid']) + + def convert(w, h): + png = toolkit.svg_to_png(svg, w, h) + return {'blob': png, + 'mime_type': 'image/png', + 'digest': hashlib.sha1(png.getvalue()).hexdigest(), + } + + props['artifact_icon'] = { + 'blob': StringIO(svg), + 'mime_type': 'image/svg+xml', + 'digest': hashlib.sha1(svg).hexdigest(), + } + props['icon'] = convert(55, 55) + props['preview'] = convert(140, 140) diff --git a/sugar_network/model/routes.py b/sugar_network/model/routes.py index 447ff30..c5c4929 100644 --- a/sugar_network/model/routes.py +++ b/sugar_network/model/routes.py @@ -15,7 +15,7 @@ import logging import mimetypes -from os.path import join, split +from os.path import split from sugar_network import static, db from sugar_network.toolkit.router import route, fallbackroute, Blob, ACL @@ -99,7 +99,7 @@ class FrontRoutes(object): @fallbackroute('GET', ['static']) def get_static(self, request): - path = join(static.PATH, *request.path[1:]) + path = static.path(*request.path[1:]) if not mimetypes.inited: mimetypes.init() mime_type = mimetypes.types_map.get('.' + path.rsplit('.', 1)[-1]) @@ -116,7 +116,7 @@ class FrontRoutes(object): @route('GET', ['favicon.ico']) def favicon(self, request, response): return Blob({ - 'blob': join(static.PATH, 'favicon.ico'), + 'blob': static.path('favicon.ico'), 'mime_type': 'image/x-icon', }) diff --git a/sugar_network/node/routes.py b/sugar_network/node/routes.py index 17e7bbf..80f8893 100644 --- a/sugar_network/node/routes.py +++ b/sugar_network/node/routes.py @@ -19,13 +19,13 @@ import shutil import gettext import logging import hashlib -from cStringIO import StringIO from contextlib import contextmanager from ConfigParser import ConfigParser from os.path import join, isdir, exists from sugar_network import node, toolkit, model from sugar_network.node import stats_node, stats_user +from sugar_network.model.context import Context # pylint: disable-msg=W0611 from sugar_network.toolkit.router import route, preroute, postroute, ACL from sugar_network.toolkit.router import Unauthorized, Request, fallbackroute @@ -504,7 +504,7 @@ def load_bundle(volume, request, bundle_path): bundle = Bundle(bundle_path, mime_type='application/zip') except Exception: _logger.debug('Load unrecognized bundle from %r', bundle_path) - context_type = 'content' + context_type = 'book' else: _logger.debug('Load Sugar Activity bundle from %r', bundle_path) context_type = 'activity' @@ -540,7 +540,6 @@ def load_bundle(volume, request, bundle_path): data['mime_type'] = 'application/vnd.olpc-sugar' if initial and not contexts.exists(context): - context_meta['guid'] = context context_meta['type'] = 'activity' request.call(method='POST', path=['context'], content=context_meta) context_meta = None @@ -583,32 +582,16 @@ def load_bundle(volume, request, bundle_path): def _load_context_metadata(bundle, spec): - - def convert(data, w, h): - result = toolkit.svg_to_png(data.getvalue(), w, h, spec['context']) - return {'blob': result, - 'mime_type': 'image/png', - 'digest': hashlib.sha1(result.getvalue()).hexdigest(), - } - result = {} for prop in ('homepage', 'mime_types'): if spec[prop]: result[prop] = spec[prop] + result['guid'] = spec['context'] try: icon_file = bundle.extractfile(join(bundle.rootdir, spec['icon'])) - icon = StringIO(icon_file.read()) + Context.populate_images(result, icon_file.read()) icon_file.close() - result.update({ - 'artifact_icon': { - 'blob': icon, - 'mime_type': 'image/svg+xml', - 'digest': hashlib.sha1(icon.getvalue()).hexdigest(), - }, - 'preview': convert(icon, 140, 140), - 'icon': convert(icon, 55, 55), - }) except Exception: exception(_logger, 'Failed to load icon') diff --git a/sugar_network/static/__init__.py b/sugar_network/static/__init__.py index 5fec95b..4295e38 100644 --- a/sugar_network/static/__init__.py +++ b/sugar_network/static/__init__.py @@ -15,5 +15,8 @@ from os.path import dirname, join - PATH = join(dirname(__file__), 'httpdocs') + + +def path(*args): + return join(PATH, *args) diff --git a/sugar_network/static/httpdocs/images/activity.svg b/sugar_network/static/httpdocs/images/activity.svg new file mode 100644 index 0000000..c5302fd --- /dev/null +++ b/sugar_network/static/httpdocs/images/activity.svg @@ -0,0 +1,68 @@ + + + +]> +image/svg+xml diff --git a/sugar_network/static/httpdocs/images/book.svg b/sugar_network/static/httpdocs/images/book.svg new file mode 100644 index 0000000..92fb811 --- /dev/null +++ b/sugar_network/static/httpdocs/images/book.svg @@ -0,0 +1,68 @@ + + + +]> +image/svg+xml diff --git a/sugar_network/static/httpdocs/images/group.svg b/sugar_network/static/httpdocs/images/group.svg new file mode 100644 index 0000000..c9a6b64 --- /dev/null +++ b/sugar_network/static/httpdocs/images/group.svg @@ -0,0 +1,68 @@ + + + +]> +image/svg+xml diff --git a/sugar_network/static/httpdocs/images/missing-preview.png b/sugar_network/static/httpdocs/images/missing-preview.png new file mode 100644 index 0000000..64f5077 --- /dev/null +++ b/sugar_network/static/httpdocs/images/missing-preview.png Binary files differ diff --git a/sugar_network/static/httpdocs/images/missing.png b/sugar_network/static/httpdocs/images/missing.png index 8d6c26d..c3907f7 100644 --- a/sugar_network/static/httpdocs/images/missing.png +++ b/sugar_network/static/httpdocs/images/missing.png Binary files differ diff --git a/sugar_network/static/httpdocs/images/missing.svg b/sugar_network/static/httpdocs/images/missing.svg index cba7e35..d11c283 100644 --- a/sugar_network/static/httpdocs/images/missing.svg +++ b/sugar_network/static/httpdocs/images/missing.svg @@ -1,69 +1,70 @@ - - - - - image/svg+xml - - - - - image/svg+xml - - - - - - + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:window-width="1364" + inkscape:window-height="725" + id="namedview3039" + showgrid="true" + inkscape:zoom="8" + inkscape:cx="3.412668" + inkscape:cy="28.88286" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="layer1" + showguides="true" + inkscape:guide-bbox="true" + showborder="true"> \ No newline at end of file diff --git a/sugar_network/static/httpdocs/images/package-preview.png b/sugar_network/static/httpdocs/images/package-preview.png new file mode 100644 index 0000000..c6cf086 --- /dev/null +++ b/sugar_network/static/httpdocs/images/package-preview.png Binary files differ diff --git a/sugar_network/static/httpdocs/images/package.png b/sugar_network/static/httpdocs/images/package.png index b8134cf..24bd5ac 100644 --- a/sugar_network/static/httpdocs/images/package.png +++ b/sugar_network/static/httpdocs/images/package.png Binary files differ diff --git a/sugar_network/static/httpdocs/images/package.svg b/sugar_network/static/httpdocs/images/package.svg new file mode 100644 index 0000000..a5fd32d --- /dev/null +++ b/sugar_network/static/httpdocs/images/package.svg @@ -0,0 +1,71 @@ + +image/svg+xml \ No newline at end of file diff --git a/sugar_network/toolkit/__init__.py b/sugar_network/toolkit/__init__.py index 95d89dc..5988e5d 100644 --- a/sugar_network/toolkit/__init__.py +++ b/sugar_network/toolkit/__init__.py @@ -499,14 +499,10 @@ class mkdtemp(str): shutil.rmtree(self) -def svg_to_png(data, w, h, replace_color=None): +def svg_to_png(data, w, h): import rsvg import cairo - if replace_color: - from sugar_network.toolkit.sugar import color_svg - data = color_svg(data, replace_color) - svg = rsvg.Handle(data=data) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) context = cairo.Context(surface) diff --git a/sugar_network/toolkit/router.py b/sugar_network/toolkit/router.py index 6309301..7f2c268 100644 --- a/sugar_network/toolkit/router.py +++ b/sugar_network/toolkit/router.py @@ -214,6 +214,10 @@ class Request(dict): if value is not None: return int(value) + @content_length.setter + def content_length(self, value): + self.environ['CONTENT_LENGTH'] = str(value) + @property def content_stream(self): if self._content_stream is _NOT_SET: @@ -224,6 +228,10 @@ class Request(dict): self._content_stream = _ContentStream(s, self.content_length) return self._content_stream + @content_stream.setter + def content_stream(self, value): + self._content_stream = value + @property def resource(self): if self.path: diff --git a/tests/integration/master_personal.py b/tests/integration/master_personal.py index 6c1dfed..82c66b2 100755 --- a/tests/integration/master_personal.py +++ b/tests/integration/master_personal.py @@ -77,6 +77,7 @@ class MasterPersonalTest(tests.Test): 'title': 'title_1', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview1', 'layer': 'pilot', }) @@ -85,6 +86,7 @@ class MasterPersonalTest(tests.Test): 'title': 'title_2', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview2', 'layer': 'pilot', }) @@ -95,6 +97,7 @@ class MasterPersonalTest(tests.Test): 'title': 'title_3', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview3', 'layer': 'pilot', }) @@ -103,6 +106,7 @@ class MasterPersonalTest(tests.Test): 'title': 'title_4', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview4', 'layer': 'pilot', }) @@ -129,6 +133,7 @@ class MasterPersonalTest(tests.Test): 'title': 'title_5', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview5', 'layer': 'pilot', }) @@ -141,6 +146,7 @@ class MasterPersonalTest(tests.Test): 'title': 'title_6', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview6', 'layer': 'pilot', }) diff --git a/tests/integration/master_slave.py b/tests/integration/master_slave.py index f521a2b..9a870e3 100755 --- a/tests/integration/master_slave.py +++ b/tests/integration/master_slave.py @@ -65,6 +65,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title1', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview1', 'layer': 'pilot', }) @@ -75,6 +76,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title2', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview2', 'layer': 'pilot', }) @@ -115,6 +117,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title3', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview3', 'layer': 'pilot', }) @@ -128,6 +131,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title4', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview4', 'layer': 'pilot', }) @@ -187,6 +191,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title_1', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview1', 'layer': 'pilot', }) @@ -195,6 +200,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title_2', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview2', 'layer': 'pilot', }) @@ -205,6 +211,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title_3', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview3', 'layer': 'pilot', }) @@ -213,6 +220,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title_4', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview4', 'layer': 'pilot', }) @@ -237,6 +245,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title_5', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview5', 'layer': 'pilot', }) @@ -249,6 +258,7 @@ class MasterSlaveTest(tests.Test): 'title': 'title_6', 'summary': 'summary', 'description': 'description', + 'artifact_icon': 'artifact_icon', 'preview': 'preview6', 'layer': 'pilot', }) diff --git a/tests/integration/node_client.py b/tests/integration/node_client.py index a44ce77..c4de2fb 100755 --- a/tests/integration/node_client.py +++ b/tests/integration/node_client.py @@ -75,7 +75,7 @@ class NodeClientTest(tests.Test): def test_ReleaseContext(self): context = self.cli(['POST', '/context'], stdin={ - 'type': 'content', + 'type': 'book', 'title': 'title', 'summary': 'summary', 'description': 'description', diff --git a/tests/units/client/implementations.py b/tests/units/client/implementations.py index 06902a0..b77c558 100755 --- a/tests/units/client/implementations.py +++ b/tests/units/client/implementations.py @@ -359,7 +359,7 @@ class Implementations(tests.Test): conn.post(['context'], { 'guid': 'document', - 'type': 'content', + 'type': 'book', 'title': 'title', 'summary': 'summary', 'description': 'description', @@ -432,7 +432,7 @@ class Implementations(tests.Test): conn.post(['context'], { 'guid': 'document', - 'type': 'content', + 'type': 'book', 'title': 'title', 'summary': 'summary', 'description': 'description', diff --git a/tests/units/client/offline_routes.py b/tests/units/client/offline_routes.py index 2300b7a..a163769 100755 --- a/tests/units/client/offline_routes.py +++ b/tests/units/client/offline_routes.py @@ -141,7 +141,7 @@ class OfflineRoutes(tests.Test): ipc = self.start_offline_client() guid = ipc.post(['context'], { - 'type': 'activity', + 'type': 'package', 'title': 'title', 'summary': 'summary', 'description': 'description', @@ -159,13 +159,13 @@ class OfflineRoutes(tests.Test): ipc.get(['context'], reply=['preview'])['result']) self.assertEqual( - file(src_root + '/sugar_network/static/httpdocs/images/missing.png').read(), + file(src_root + '/sugar_network/static/httpdocs/images/package.png').read(), ipc.request('GET', ['context', guid, 'icon']).content) self.assertEqual( - {'icon': 'http://127.0.0.1:5555/static/images/missing.png'}, + {'icon': 'http://127.0.0.1:5555/static/images/package.png'}, ipc.get(['context', guid], reply=['icon'])) self.assertEqual( - [{'icon': 'http://127.0.0.1:5555/static/images/missing.png'}], + [{'icon': 'http://127.0.0.1:5555/static/images/package.png'}], ipc.get(['context'], reply=['icon'])['result']) def test_favorite(self): diff --git a/tests/units/client/online_routes.py b/tests/units/client/online_routes.py index 6314948..ddf8a4c 100755 --- a/tests/units/client/online_routes.py +++ b/tests/units/client/online_routes.py @@ -228,7 +228,7 @@ class OnlineRoutes(tests.Test): ipc = IPCConnection() guid = ipc.post(['context'], { - 'type': 'activity', + 'type': 'package', 'title': 'title', 'summary': 'summary', 'description': 'description', @@ -246,13 +246,13 @@ class OnlineRoutes(tests.Test): ipc.get(['context'], reply=['preview'])['result']) self.assertEqual( - file(src_root + '/sugar_network/static/httpdocs/images/missing.png').read(), + file(src_root + '/sugar_network/static/httpdocs/images/package.png').read(), ipc.request('GET', ['context', guid, 'icon']).content) self.assertEqual( - {'icon': 'http://127.0.0.1:8888/static/images/missing.png'}, + {'icon': 'http://127.0.0.1:8888/static/images/package.png'}, ipc.get(['context', guid], reply=['icon'])) self.assertEqual( - [{'icon': 'http://127.0.0.1:8888/static/images/missing.png'}], + [{'icon': 'http://127.0.0.1:8888/static/images/package.png'}], ipc.get(['context'], reply=['icon'])['result']) def test_favorite(self): @@ -486,7 +486,7 @@ Can't find all required implementations: coroutine.dispatch() context = ipc.post(['context'], { - 'type': 'content', + 'type': 'book', 'title': 'title', 'summary': 'summary', 'description': 'description', @@ -545,7 +545,7 @@ Can't find all required implementations: [(i.guid, i['layer']) for i in local['context'].find(reply='layer')[0]]) self.assertEqual({ 'layer': ['clone'], - 'type': ['content'], + 'type': ['book'], 'author': {tests.UID: {'role': 3, 'name': 'test', 'order': 0}}, 'title': {'en-us': 'title'}, }, @@ -590,7 +590,7 @@ Can't find all required implementations: self.assertEqual([], ipc.get(['context', context, 'layer'])) self.assertEqual({ 'layer': [], - 'type': ['content'], + 'type': ['book'], 'author': {tests.UID: {'role': 3, 'name': 'test', 'order': 0}}, 'title': {'en-us': 'title'}, }, @@ -1181,7 +1181,7 @@ Can't find all required implementations: ipc = IPCConnection() guid = ipc.post(['context'], { - 'type': 'content', + 'type': 'book', 'title': 'remote', 'summary': 'summary', 'description': 'description', diff --git a/tests/units/client/server_routes.py b/tests/units/client/server_routes.py index c477ff2..47282ce 100755 --- a/tests/units/client/server_routes.py +++ b/tests/units/client/server_routes.py @@ -124,7 +124,7 @@ class ServerRoutesTest(tests.Test): ipc = IPCConnection() guid = ipc.post(['context'], { - 'type': 'activity', + 'type': 'package', 'title': 'title', 'summary': 'summary', 'description': 'description', @@ -142,13 +142,13 @@ class ServerRoutesTest(tests.Test): ipc.get(['context'], reply=['preview'])['result']) self.assertEqual( - file(src_root + '/sugar_network/static/httpdocs/images/missing.png').read(), + file(src_root + '/sugar_network/static/httpdocs/images/package.png').read(), ipc.request('GET', ['context', guid, 'icon']).content) self.assertEqual( - {'icon': 'http://127.0.0.1:5555/static/images/missing.png'}, + {'icon': 'http://127.0.0.1:5555/static/images/package.png'}, ipc.get(['context', guid], reply=['icon'])) self.assertEqual( - [{'icon': 'http://127.0.0.1:5555/static/images/missing.png'}], + [{'icon': 'http://127.0.0.1:5555/static/images/package.png'}], ipc.get(['context'], reply=['icon'])['result']) def test_PopulateNode(self): diff --git a/tests/units/model/context.py b/tests/units/model/context.py index 25b21b4..b48db6f 100755 --- a/tests/units/model/context.py +++ b/tests/units/model/context.py @@ -1,6 +1,8 @@ #!/usr/bin/env python # sugar-lint: disable +from os.path import exists + from __init__ import tests from sugar_network.node import obs @@ -40,6 +42,21 @@ class ContextTest(tests.Test): }) self.assertEqual(['common', 'bar'], ipc.get(['context', guid, 'layer'])) + def test_DefaultImages(self): + self.start_online_client() + ipc = IPCConnection() + + guid = ipc.post(['context'], { + 'guid': 'guid', + 'type': 'activity', + 'title': 'title', + 'summary': 'summary', + 'description': 'description', + }) + assert exists('master/context/gu/guid/artifact_icon.blob') + assert exists('master/context/gu/guid/icon.blob') + assert exists('master/context/gu/guid/preview.blob') + if __name__ == '__main__': tests.main() diff --git a/tests/units/model/implementation.py b/tests/units/model/implementation.py index 6b4bbc3..070df70 100755 --- a/tests/units/model/implementation.py +++ b/tests/units/model/implementation.py @@ -70,7 +70,7 @@ class ImplementationTest(tests.Test): self.node_volume['context'].create({ 'guid': 'context', - 'type': 'content', + 'type': 'book', 'title': 'title', 'summary': 'summary', 'description': 'description', diff --git a/tests/units/node/node.py b/tests/units/node/node.py index cf0bf73..5c7cb58 100755 --- a/tests/units/node/node.py +++ b/tests/units/node/node.py @@ -817,8 +817,8 @@ class NodeTest(tests.Test): svg = '\n'.join([ '', '', - ' ', + ' ', + ' ', ']>', '', ' ', -- cgit v0.9.1