#!/usr/bin/env python # -*- coding: utf-8 -*- """ Unit tests for gluon.languages """ import sys import os import shutil import tempfile import unittest from gluon import languages from gluon._compat import PY2, to_unicode, to_bytes from gluon.storage import Messages from gluon.html import SPAN MP_WORKING = 0 try: import multiprocessing MP_WORKING = 1 #due to http://bugs.python.org/issue10845, testing multiprocessing in python is impossible if sys.platform.startswith('win'): MP_WORKING = 0 #multiprocessing is also not available on GAE. Since tests randomly #fail, let's not make them on it too if 'datastore' in os.getenv('DB', ''): MP_WORKING = 0 except ImportError: pass def read_write(args): (filename, iterations) = args for i in range(0, iterations): content = languages.read_dict(filename) if not len(content): return False languages.write_dict(filename, content) return True class TestLanguagesParallel(unittest.TestCase): def setUp(self): self.filename = tempfile.mktemp() contents = dict() for i in range(1000): contents["key%d" % i] = "value%d" % i languages.write_dict(self.filename, contents) languages.read_dict(self.filename) def tearDown(self): try: os.remove(self.filename) except: pass @unittest.skipIf(MP_WORKING == 0, 'multiprocessing tests unavailable') def test_reads_and_writes(self): readwriters = 10 pool = multiprocessing.Pool(processes=readwriters) results = pool.map(read_write, [[self.filename, 10]] * readwriters) for result in results: self.assertTrue(result) @unittest.skipIf(MP_WORKING == 1, 'multiprocessing tests available') def test_reads_and_writes_no_mp(self): results = [] for i in range(10): results.append(read_write([self.filename, 10])) for result in results: self.assertTrue(result) class TestTranslations(unittest.TestCase): def setUp(self): if os.path.isdir('gluon'): self.langpath = 'applications/welcome/languages' else: self.langpath = os.path.realpath( '../../applications/welcome/languages') self.http_accept_language = 'en' def tearDown(self): pass def test_plain(self): T = languages.translator(self.langpath, self.http_accept_language) self.assertEqual(str(T('Hello World')), 'Hello World') self.assertEqual(str(T('Hello World## comment')), 'Hello World') self.assertEqual(str(T.M('**Hello World**')), 'Hello World') # sub_tuple testing self.assertEqual(str(T('%s %%{shop}', 1)), '1 shop') self.assertEqual(str(T('%s %%{shop}', 2)), '2 shops') self.assertEqual(str(T('%%{quark(%s)}', 1)), 'quark') self.assertEqual(str(T('%%{quark(%i)}', 2)), 'quarks') self.assertEqual(str(T('%%{!quark(%s)}', 1)), 'Quark') self.assertEqual(str(T('%%{!!quark(%i)}', 2)), 'Quarks') self.assertEqual(str(T('%%{!!!quark(%s)}', 0)), 'QUARKS') self.assertEqual(str(T('%%{?an?%i}', 1)), 'an') self.assertEqual(str(T('%%{?an?%s}', 0)), '0') self.assertEqual(str(T('%%{??%i}', 1)), '') self.assertEqual(str(T('%%{??%s}', 2)), '2') self.assertEqual(str(T('%%{?%i}', 1)), '') self.assertEqual(str(T('%%{?%s}', 0)), '0') self.assertEqual(str(T('%%{?one?%i?zero}', 1)), 'one') self.assertEqual(str(T('%%{?one?%s?zero}', 23)), '23') self.assertEqual(str(T('%%{?one?%i?zero}', 0)), 'zero') self.assertEqual(str(T('%%{?one?%s?}', 1)), 'one') self.assertEqual(str(T('%%{?one?%i?}', 23)), '23') self.assertEqual(str(T('%%{?one?%s?}', 0)), '') self.assertEqual(str(T('%%{??%i?zero}', 1)), '') self.assertEqual(str(T('%%{??%s?zero}', 23)), '23') self.assertEqual(str(T('%%{??%i?zero}', 0)), 'zero') self.assertEqual(str(T('%%{??1?}%s', '')), '') self.assertEqual(str(T('%%{??%s?}', 23)), '23') self.assertEqual(str(T('%%{??0?}%s', '')), '') self.assertEqual(str(T('%s %%{shop[0]}', 1)), '1 shop') self.assertEqual(str(T('%s %%{shop[0]}', 2)), '2 shops') self.assertEqual(str(T('%i %%{?one?not_one[0]}', 1)), '1 one') self.assertEqual(str(T('%i %%{?one?not_one[0]}', 2)), '2 not_one') self.assertEqual(str(T('%%{??on[0]} %i', 1)), ' 1') self.assertEqual(str(T('%%{??on[0]} %s', 0)), 'on 0') self.assertEqual(str(T('%%{?on[0]} %s', 1)), ' 1') self.assertEqual(str(T('%%{?on[0]} %i', 2)), 'on 2') self.assertEqual(str(T('%i %%{?one?or_more?zero[0]}', 1)), '1 one') self.assertEqual(str(T('%i %%{?one?or_more?zero[0]}', 2)), '2 or_more') self.assertEqual(str(T('%i %%{?one?or_more?zero[0]}', 0)), '0 zero') self.assertEqual(str(T('%i %%{?one?hands?[0]}', 1)), '1 one') self.assertEqual(str(T('%s %%{?one?hands?[0]}', 2)), '2 hands') self.assertEqual(str(T('%i %%{?one?hands?[0]}', 0)), '0 ') self.assertEqual(str(T('%s %%{??or_more?zero[0]}', 1)), '1 ') self.assertEqual(str(T('%i %%{??or_more?zero[0]}', 2)), '2 or_more') self.assertEqual(str(T('%s %%{??or_more?zero[0]}', 0)), '0 zero') self.assertEqual(str(T('%i%%{??nd?[0]}', 1)), '1') self.assertEqual(str(T('%i%%{??nd?[0]}', 2)), '2nd') self.assertEqual(str(T('%i%%{??nd?[0]}', 0)), '0') self.assertEqual(str(T('%i%%{?st?[0]}', 1)), '1st') self.assertEqual(str(T('%i%%{?st?[0]}', 2)), '2') self.assertEqual(str(T('%i%%{?st?[0]}', 0)), '0') # sub_dict testing self.assertEqual(str(T('%(key)s %%{is(key)}', dict(key=1))), '1 is') self.assertEqual(str(T('%(key)i %%{is(key)}', dict(key=2))), '2 are') self.assertEqual(str(T('%%{!!!is(%(key)s)}', dict(key=2))), 'ARE') self.assertEqual(str(T('%(key)i %%{?not_one(key)}', dict(key=1))), '1 ') self.assertEqual(str(T('%(key)s %%{?not_one(key)}', dict(key=2))), '2 not_one') self.assertEqual(str(T('%(key)i %%{?not_one(key)}', dict(key=0))), '0 not_one') self.assertEqual(str(T('%(key)s %%{?one?not_one(key)}', dict(key=1))), '1 one') self.assertEqual(str(T('%(key)i %%{?one?not_one(key)}', dict(key=2))), '2 not_one') self.assertEqual(str(T('%(key)s %%{?one?not_one(key)}', dict(key=0))), '0 not_one') self.assertEqual(str(T('%(key)i %%{?one?(key)}', dict(key=1))), '1 one') self.assertEqual(str(T('%(key)s %%{?one?(key)}', dict(key=2))), '2 ') self.assertEqual(str(T('%(key)i %%{?one?(key)}', dict(key=0))), '0 ') self.assertEqual(str(T('%(key)s %%{??not_one(key)}', dict(key=1))), '1 ') self.assertEqual(str(T('%(key)i %%{??not_one(key)}', dict(key=2))), '2 not_one') self.assertEqual(str(T('%(key)s %%{?not_one(key)}', dict(key=1))), '1 ') self.assertEqual(str(T('%(key)i %%{?not_one(key)}', dict(key=0))), '0 not_one') self.assertEqual(str(T('%(key)s %%{?one?other?zero(key)}', dict(key=1))), '1 one') self.assertEqual(str(T('%(key)i %%{?one?other?zero(key)}', dict(key=4))), '4 other') self.assertEqual(str(T('%(key)s %%{?one?other?zero(key)}', dict(key=0))), '0 zero') self.assertEqual(str(T('%(key)i %%{?one?two_or_more?(key)}', dict(key=1))), '1 one') self.assertEqual(str(T('%(key)s %%{?one?two_or_more?(key)}', dict(key=2))), '2 two_or_more') self.assertEqual(str(T('%(key)i %%{?one?two_or_more?(key)}', dict(key=0))), '0 ') self.assertEqual(str(T('%(key)s %%{??two_or_more?zero(key)}', dict(key=1))), '1 ') self.assertEqual(str(T('%(key)i %%{??two_or_more?zero(key)}', dict(key=2))), '2 two_or_more') self.assertEqual(str(T('%(key)s %%{??two_or_more?zero(key)}', dict(key=0))), '0 zero') self.assertEqual(str(T('%(key)i %%{??two_or_more?(key)}', dict(key=1))), '1 ') self.assertEqual(str(T('%(key)s %%{??two_or_more?(key)}', dict(key=0))), '0 ') self.assertEqual(str(T('%(key)i %%{??two_or_more?(key)}', dict(key=2))), '2 two_or_more') T.force('it') self.assertEqual(str(T('Hello World')), 'Salve Mondo') self.assertEqual(to_unicode(T('Hello World')), 'Salve Mondo') class TestDummyApp(unittest.TestCase): def setUp(self): pjoin = os.path.join self.apppath = os.path.abspath(pjoin(os.path.dirname(os.path.abspath(__file__)), 'dummy')) os.mkdir(self.apppath) os.mkdir(pjoin(self.apppath, 'languages')) os.mkdir(pjoin(self.apppath, 'models')) os.mkdir(pjoin(self.apppath, 'controllers')) os.mkdir(pjoin(self.apppath, 'views')) os.mkdir(pjoin(self.apppath, 'views', 'default')) os.mkdir(pjoin(self.apppath, 'modules')) with open(pjoin(self.apppath, 'languages', 'en.py'), 'w') as testlang: testlang.write( """ {} """ ) with open(pjoin(self.apppath, 'languages', 'pt.py'), 'w') as testlang: testlang.write( """ {} """ ) with open(pjoin(self.apppath, 'modules', 'test.py'), 'w') as testmodule: testmodule.write( """ from gluon import current hello = current.T('hello') """ ) with open(pjoin(self.apppath, 'models', 'db.py'), 'w') as testmodel: testmodel.write( """ world = T("world") """ ) with open(pjoin(self.apppath, 'controllers', 'default.py'), 'w') as testcontroller: testcontroller.write( """ def index(): message = T('%s %%{shop}', 2) return dict(message=message) """ ) with open(pjoin(self.apppath, 'views', 'default', 'index.html'), 'w') as testview: testview.write( """

{{=T('ahoy')}}

""" ) def tearDown(self): shutil.rmtree(self.apppath) def test_update_all_languages(self): languages.update_all_languages(self.apppath) en_file = os.path.join(self.apppath, 'languages', 'en.py') pt_file = os.path.join(self.apppath, 'languages', 'pt.py') en_dict = languages.read_dict(en_file) pt_dict = languages.read_dict(pt_file) for key in ['hello', 'world', '%s %%{shop}', 'ahoy']: self.assertTrue(key in en_dict) self.assertTrue(key in pt_dict) class TestMessages(unittest.TestCase): def setUp(self): if os.path.isdir('gluon'): self.langpath = 'applications/welcome/languages' else: self.langpath = os.path.realpath( '../../applications/welcome/languages') self.http_accept_language = 'en' def tearDown(self): pass def test_decode(self): T = languages.translator(self.langpath, self.http_accept_language) messages = Messages(T) messages.update({'email_sent':'Email sent', 'test': "ä"}) self.assertEqual(to_unicode(messages.email_sent, 'utf-8'), 'Email sent') class TestHTMLTag(unittest.TestCase): def setUp(self): if os.path.isdir('gluon'): self.langpath = 'applications/welcome/languages' else: self.langpath = os.path.realpath( '../../applications/welcome/languages') self.http_accept_language = 'en' def tearDown(self): pass def test_decode(self): T = languages.translator(self.langpath, self.http_accept_language) elem = SPAN(T("Complete")) self.assertEqual(elem.flatten(), "Complete") elem = SPAN(T("Cannot be empty", language="ru")) self.assertEqual(elem.xml(), to_bytes('Пустое значение недопустимо')) self.assertEqual(elem.flatten(), 'Пустое значение недопустимо')