Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tests/units/toolkit
diff options
context:
space:
mode:
Diffstat (limited to 'tests/units/toolkit')
-rw-r--r--tests/units/toolkit/__main__.py2
-rwxr-xr-xtests/units/toolkit/coroutine.py31
-rwxr-xr-xtests/units/toolkit/i18n.py68
-rwxr-xr-xtests/units/toolkit/router.py126
-rwxr-xr-xtests/units/toolkit/toolkit.py37
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__':