diff options
Diffstat (limited to 'tests/units/toolkit')
-rw-r--r-- | tests/units/toolkit/__main__.py | 2 | ||||
-rwxr-xr-x | tests/units/toolkit/coroutine.py | 31 | ||||
-rwxr-xr-x | tests/units/toolkit/i18n.py | 68 | ||||
-rwxr-xr-x | tests/units/toolkit/router.py | 126 | ||||
-rwxr-xr-x | tests/units/toolkit/toolkit.py | 37 |
5 files changed, 192 insertions, 72 deletions
diff --git a/tests/units/toolkit/__main__.py b/tests/units/toolkit/__main__.py index 79b0e5b..68cb254 100644 --- a/tests/units/toolkit/__main__.py +++ b/tests/units/toolkit/__main__.py @@ -2,6 +2,7 @@ from __init__ import tests +from coroutine import * from http import * from lsb_release import * from mountpoints import * @@ -11,6 +12,7 @@ from options import * from spec import * from router import * from gbus import * +from i18n import * if __name__ == '__main__': tests.main() diff --git a/tests/units/toolkit/coroutine.py b/tests/units/toolkit/coroutine.py new file mode 100755 index 0000000..95738d0 --- /dev/null +++ b/tests/units/toolkit/coroutine.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# sugar-lint: disable + +from __init__ import tests + +from sugar_network.toolkit.coroutine import Spooler, spawn, sleep + + +class CoroutineTest(tests.Test): + + def test_Spooler_ContinuousFeeding(self): + spooler = Spooler() + events = [] + + def consumer(num): + while True: + events[num].append(spooler.wait()) + + for i in range(10): + events.append([]) + spawn(consumer, i) + sleep(.1) + + for i in range(10): + spooler.notify_all(i) + sleep(.1) + self.assertEqual([range(10)] * 10, events) + + +if __name__ == '__main__': + tests.main() diff --git a/tests/units/toolkit/i18n.py b/tests/units/toolkit/i18n.py new file mode 100755 index 0000000..6c4c0ca --- /dev/null +++ b/tests/units/toolkit/i18n.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# sugar-lint: disable + +import gettext + +from __init__ import tests + +from sugar_network.toolkit import i18n + + +class I18nTest(tests.Test): + + def test_decode(self): + # Fallback to default lang + i18n._default_langs = ['default'] + self.assertEqual('foo', i18n.decode({'lang': 'foo', 'default': 'bar'}, 'lang')) + self.assertEqual('bar', i18n.decode({'lang': 'foo', 'default': 'bar'}, 'fake')) + + # Exact accept_language + self.assertEqual('', i18n.decode(None, 'lang')) + self.assertEqual('foo', i18n.decode('foo', 'lang')) + self.assertEqual('foo', i18n.decode({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, 'lang')) + self.assertEqual('foo', i18n.decode({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, ['lang', 'fake'])) + self.assertEqual('bar', i18n.decode({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, ['fake', 'lang'])) + + # Last resort + self.assertEqual('foo', i18n.decode({'1': 'foo', '2': 'bar'}, 'fake')) + + # Primed accept_language + self.assertEqual('foo', i18n.decode({'1': 'foo', '2': 'bar', 'default': 'default'}, '1-a')) + + # Primed i18n value + self.assertEqual('bar', i18n.decode({'1-a': 'foo', '1': 'bar', 'default': 'default'}, '1-b')) + self.assertEqual('foo', i18n.decode({'1-a': 'foo', '2': 'bar', 'default': 'default'}, '1-b')) + + def test_decode_EnAsTheLastResort(self): + i18n._default_langs = ['en-us'] + self.assertEqual('right', i18n.decode({'a': 'wrong', 'en': 'right'}, 'probe')) + self.assertEqual('exact', i18n.decode({'a': 'wrong', 'en': 'right', 'probe': 'exact'}, 'probe')) + + def test_encode(self): + self.assertEqual({ + 'en': 'Delete Log File', + 'es': 'Borrar el archivo de registro', + 'fr': 'Supprimer le fichier log', + }, i18n.encode('Delete Log File')) + + self.assertEqual({ + 'en': "Error: Can't open file 'probe'\n", + 'es': "Error: No se puede abrir el archivo 'probe'\n", + 'fr': "Erreur : Ouverture du fichier 'probe' impossible\n", + }, i18n.encode("Error: Can't open file '%s'\n", 'probe')) + + self.assertEqual({ + 'en': "Error: Can't open file '1'\n", + 'es': "Error: No se puede abrir el archivo '2'\n", + 'fr': "Erreur : Ouverture du fichier '3' impossible\n", + }, i18n.encode("Error: Can't open file '%s'\n", {'en': 1, 'es': 2, 'fr': 3})) + + self.assertEqual({ + 'en': '1 when deleting 5', + 'es': '2 borrando 6', + 'fr': '3 lors de la suppression de 7', + }, i18n.encode('%(error)s when deleting %(file)s', error={'en': 1, 'es': 2, 'fr': 3}, file={'en': 5, 'es': 6, 'fr': 7})) + + +if __name__ == '__main__': + tests.main() diff --git a/tests/units/toolkit/router.py b/tests/units/toolkit/router.py index a9b17f2..3dd1306 100755 --- a/tests/units/toolkit/router.py +++ b/tests/units/toolkit/router.py @@ -9,9 +9,10 @@ from cStringIO import StringIO from __init__ import tests, src_root -from sugar_network import db, client -from sugar_network.toolkit.router import Blob, Router, Request, _parse_accept_language, route, fallbackroute, preroute, postroute, _filename -from sugar_network.toolkit import default_lang, http, coroutine +from sugar_network import db, client, toolkit +from sugar_network.toolkit.router import Router, Request, _parse_accept_language, route, fallbackroute, preroute, postroute +from sugar_network.toolkit.coroutine import this +from sugar_network.toolkit import http, coroutine class RouterTest(tests.Test): @@ -499,26 +500,44 @@ class RouterTest(tests.Test): def test_routes_Pre(self): - class Routes(object): + class A(object): @route('PROBE') def ok(self, request, response): return request['probe'] @preroute - def preroute(self, op, request, response): - request['probe'] = 'request' + def _(self, op, request, response): + request['probe'] = '_' - router = Router(Routes()) + class B1(A): + + @preroute + def z(self, op, request, response): + request['probe'] += 'z' + + class B2(object): + + @preroute + def f(self, op, request, response): + request['probe'] += 'f' + + class C(B1, B2): + + @preroute + def a(self, op, request, response): + request['probe'] += 'a' + + router = Router(C()) self.assertEqual( - ['request'], + ['_afz'], [i for i in router({'REQUEST_METHOD': 'PROBE', 'PATH_INFO': '/'}, lambda *args: None)]) def test_routes_Post(self): postroutes = [] - class Routes(object): + class A(object): @route('OK') def ok(self): @@ -529,20 +548,51 @@ class RouterTest(tests.Test): raise Exception('fail') @postroute - def postroute(self, request, response, result, exception): - postroutes.append((result, str(exception))) + def _(self, request, response, result, exception): + postroutes.append(('_', result, str(exception))) - router = Router(Routes()) + class B1(A): + + @postroute + def z(self, request, response, result, exception): + postroutes.append(('z', result, str(exception))) + + class B2(object): + + @postroute + def f(self, request, response, result, exception): + postroutes.append(('f', result, str(exception))) + + class C(B1, B2): + + @postroute + def a(self, request, response, result, exception): + postroutes.append(('a', result, str(exception))) + + router = Router(C()) self.assertEqual( ['ok'], [i for i in router({'REQUEST_METHOD': 'OK', 'PATH_INFO': '/'}, lambda *args: None)]) - self.assertEqual(('ok', 'None'), postroutes[-1]) + self.assertEqual([ + ('_', 'ok', 'None'), + ('a', 'ok', 'None'), + ('f', 'ok', 'None'), + ('z', 'ok', 'None'), + ], + postroutes) + del postroutes[:] self.assertEqual( ['{"request": "/", "error": "fail"}'], [i for i in router({'REQUEST_METHOD': 'FAIL', 'PATH_INFO': '/'}, lambda *args: None)]) - self.assertEqual((None, 'fail'), postroutes[-1]) + self.assertEqual([ + ('_', None, 'fail'), + ('a', None, 'fail'), + ('f', None, 'fail'), + ('z', None, 'fail'), + ], + postroutes) def test_routes_WildcardsAsLastResort(self): @@ -968,14 +1018,14 @@ class RouterTest(tests.Test): ], response) - def test_BlobsRedirects(self): + def test_FilesRedirects(self): URL = 'http://sugarlabs.org' class CommandsProcessor(object): @route('GET') def get(self, response): - return Blob(url=URL) + return toolkit.File(meta={'url': URL}) router = Router(CommandsProcessor()) @@ -1171,33 +1221,18 @@ class RouterTest(tests.Test): ], response) - def test_filename(self): - self.assertEqual('Foo', _filename('foo', None)) - self.assertEqual('Foo-Bar', _filename(['foo', 'bar'], None)) - self.assertEqual('FOO-BaR', _filename([' f o o', ' ba r '], None)) - - self.assertEqual('12-3', _filename(['/1/2/', '/3/'], None)) - - self.assertEqual('Foo.png', _filename('foo', 'image/png')) - self.assertEqual('Foo-Bar.gif', _filename(['foo', 'bar'], 'image/gif')) - self.assertEqual('Fake', _filename('fake', 'foo/bar')) - - self.assertEqual('Eng', _filename({default_lang(): 'eng'}, None)) - self.assertEqual('Eng', _filename([{default_lang(): 'eng'}], None)) - self.assertEqual('Bar-1', _filename([{'lang': 'foo', default_lang(): 'bar'}, '1'], None)) - - def test_BlobsDisposition(self): + def test_FilesDisposition(self): self.touch(('blob.data', 'value')) class CommandsProcessor(object): @route('GET', [], '1') def cmd1(self, request): - return Blob(name='foo', blob='blob.data') + return toolkit.File('blob.data', {'name': 'foo', 'mime_type': 'application/octet-stream'}) @route('GET', [], cmd='2') def cmd2(self, request): - return Blob(filename='foo.bar', blob='blob.data') + return toolkit.File('blob.data', {'filename': 'foo.bar'}) router = Router(CommandsProcessor()) @@ -1216,7 +1251,7 @@ class RouterTest(tests.Test): 'last-modified': formatdate(os.stat('blob.data').st_mtime, localtime=False, usegmt=True), 'content-length': str(len(result)), 'content-type': 'application/octet-stream', - 'content-disposition': 'attachment; filename="Foo.obj"', + 'content-disposition': 'attachment; filename="foo.obj"', } ], response) @@ -1292,7 +1327,6 @@ class RouterTest(tests.Test): [i for i in reply]) def test_SpawnEventStream(self): - events = [] class Routes(object): @@ -1301,8 +1335,10 @@ class RouterTest(tests.Test): yield {} yield {'foo': 'bar'} - def broadcast(self, event): - events.append(event.copy()) + events = [] + def localcast(event): + events.append(event.copy()) + this.localcast = localcast reply = Router(Routes(), allow_spawn=True)({ 'PATH_INFO': '/resource/guid/prop', @@ -1321,7 +1357,6 @@ class RouterTest(tests.Test): del events[:] def test_SpawnEventStreamFailure(self): - events = [] class Routes(object): @@ -1332,8 +1367,10 @@ class RouterTest(tests.Test): yield {'foo': 'bar'}, {'add': 'on'} raise RuntimeError('error') - def broadcast(self, event): - events.append(event.copy()) + events = [] + def localcast(event): + events.append(event.copy()) + this.localcast = localcast reply = Router(Routes(), allow_spawn=True)({ 'PATH_INFO': '/', @@ -1353,7 +1390,6 @@ class RouterTest(tests.Test): del events[:] def test_ReadRequestOnEventStreamSpawn(self): - events = [] class Routes(object): @@ -1362,8 +1398,10 @@ class RouterTest(tests.Test): yield {} yield {'request': request.content} - def broadcast(self, event): - events.append(event.copy()) + events = [] + def localcast(event): + events.append(event.copy()) + this.localcast = localcast reply = Router(Routes(), allow_spawn=True)({ 'PATH_INFO': '/', diff --git a/tests/units/toolkit/toolkit.py b/tests/units/toolkit/toolkit.py index 8c13b84..07ed9c6 100755 --- a/tests/units/toolkit/toolkit.py +++ b/tests/units/toolkit/toolkit.py @@ -8,7 +8,7 @@ from cStringIO import StringIO from __init__ import tests from sugar_network import toolkit -from sugar_network.toolkit import Seqno, Sequence +from sugar_network.toolkit import Seqno, Sequence, File class UtilTest(tests.Test): @@ -421,33 +421,14 @@ class UtilTest(tests.Test): ['d', 'a', 'b', 'c'], [i for i in stack]) - def test_gettext(self): - # Fallback to default lang - toolkit._default_langs = ['default'] - self.assertEqual('foo', toolkit.gettext({'lang': 'foo', 'default': 'bar'}, 'lang')) - self.assertEqual('bar', toolkit.gettext({'lang': 'foo', 'default': 'bar'}, 'fake')) - - # Exact accept_language - self.assertEqual('', toolkit.gettext(None, 'lang')) - self.assertEqual('foo', toolkit.gettext('foo', 'lang')) - self.assertEqual('foo', toolkit.gettext({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, 'lang')) - self.assertEqual('foo', toolkit.gettext({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, ['lang', 'fake'])) - self.assertEqual('bar', toolkit.gettext({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, ['fake', 'lang'])) - - # Last resort - self.assertEqual('foo', toolkit.gettext({'1': 'foo', '2': 'bar'}, 'fake')) - - # Primed accept_language - self.assertEqual('foo', toolkit.gettext({'1': 'foo', '2': 'bar', 'default': 'default'}, '1-a')) - - # Primed i18n value - self.assertEqual('bar', toolkit.gettext({'1-a': 'foo', '1': 'bar', 'default': 'default'}, '1-b')) - self.assertEqual('foo', toolkit.gettext({'1-a': 'foo', '2': 'bar', 'default': 'default'}, '1-b')) - - def test_gettext_EnAsTheLastResort(self): - toolkit._default_langs = ['en-us'] - self.assertEqual('right', toolkit.gettext({'a': 'wrong', 'en': 'right'}, 'probe')) - self.assertEqual('exact', toolkit.gettext({'a': 'wrong', 'en': 'right', 'probe': 'exact'}, 'probe')) + def test_FileName(self): + self.assertEqual('blob', File().name) + self.assertEqual('blob', File('foo/bar').name) + self.assertEqual('digest', File(digest='digest').name) + self.assertEqual('foo', File(meta={'filename': 'foo'}).name) + self.assertEqual('foo', File(meta={'name': 'foo'}).name) + self.assertEqual('foo', File(meta={'filename': 'foo', 'mime_type': 'image/png'}).name) + self.assertEqual('digest.png', File(digest='digest', meta={'mime_type': 'image/png'}).name) if __name__ == '__main__': |