cubicweb/devtools/test/unittest_i18n.py
changeset 11057 0b59724cb3f2
parent 10964 bf381a894cd3
child 11099 5fdbf6f2db88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cubicweb/devtools/test/unittest_i18n.py	Sat Jan 16 13:48:51 2016 +0100
@@ -0,0 +1,77 @@
+# -*- coding: iso-8859-1 -*-
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of CubicWeb.
+#
+# CubicWeb is free software: you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# CubicWeb 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 Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
+"""unit tests for i18n messages generator"""
+
+import os, os.path as osp
+import sys
+import subprocess
+
+from unittest import TestCase, main
+
+from cubicweb.cwconfig import CubicWebNoAppConfiguration
+
+DATADIR = osp.join(osp.abspath(osp.dirname(__file__)), 'data')
+
+def load_po(fname):
+    """load a po file and  return a set of encountered (msgid, msgctx)"""
+    msgs = set()
+    msgid = msgctxt = None
+    with open(fname) as fobj:
+        for line in fobj:
+            if line.strip() in ('', '#'):
+                continue
+            if line.startswith('msgstr'):
+                assert not (msgid, msgctxt) in msgs
+                msgs.add( (msgid, msgctxt) )
+                msgid = msgctxt = None
+            elif line.startswith('msgid'):
+                msgid = line.split(' ', 1)[1][1:-1]
+            elif line.startswith('msgctx'):
+                msgctxt = line.split(' ', 1)[1][1: -1]
+            elif msgid is not None:
+                msgid += line[1:-1]
+            elif msgctxt is not None:
+                msgctxt += line[1:-1]
+    return msgs
+
+
+class cubePotGeneratorTC(TestCase):
+    """test case for i18n pot file generator"""
+
+    def test_i18ncube(self):
+        env = os.environ.copy()
+        env['CW_CUBES_PATH'] = osp.join(DATADIR, 'cubes')
+        if 'PYTHONPATH' in env:
+            env['PYTHONPATH'] += os.pathsep
+        else:
+            env['PYTHONPATH'] = ''
+        env['PYTHONPATH'] += DATADIR
+        cwctl = osp.abspath(osp.join(osp.dirname(__file__),
+                                     '../../../bin/cubicweb-ctl'))
+        with open(os.devnull, 'w') as devnull:
+            subprocess.check_call([sys.executable, cwctl, 'i18ncube', 'i18ntestcube'],
+                                  env=env, stdout=devnull)
+        cube = osp.join(DATADIR, 'cubes', 'i18ntestcube')
+        msgs = load_po(osp.join(cube, 'i18n', 'en.po.ref'))
+        newmsgs = load_po(osp.join(cube, 'i18n', 'en.po'))
+        self.assertEqual(msgs, newmsgs)
+
+
+if __name__ == '__main__':
+    main()