From 7aa1c1c21d597cbd4f4335bef0b82ab28dacb8a6 Mon Sep 17 00:00:00 2001 From: Ned Batchelder <ned@edx.org> Date: Wed, 18 May 2016 16:31:18 -0400 Subject: [PATCH] Add tests for the new commands --- pavelib/i18n.py | 17 ++-- pavelib/paver_tests/test_i18n.py | 134 +++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 12 deletions(-) create mode 100644 pavelib/paver_tests/test_i18n.py diff --git a/pavelib/i18n.py b/pavelib/i18n.py index b918f4a0ed1..a79b9f79c8e 100644 --- a/pavelib/i18n.py +++ b/pavelib/i18n.py @@ -244,9 +244,6 @@ def i18n_release_push(): Push release-specific resources to Transifex. """ resources = find_release_resources() - if resources is None: - return - sh("i18n_tool transifex push " + " ".join(resources)) @@ -259,9 +256,6 @@ def i18n_release_pull(): Pull release-specific translations from Transifex. """ resources = find_release_resources() - if resources is None: - return - sh("i18n_tool transifex pull " + " ".join(resources)) @@ -273,7 +267,8 @@ def find_release_resources(): two resources defined named "release-*". Check that this is true. If there's a problem, print messages about it. - Returns a list of resource names, or None if the file doesn't validate. + Returns a list of resource names, or raises ValueError if .tx/config + doesn't have two resources. """ # An entry in .tx/config for a release will look like this: @@ -298,9 +293,7 @@ def find_release_resources(): return resources if len(resources) == 0: - print "You need two release-* resources defined to use this command." + raise ValueError("You need two release-* resources defined to use this command.") else: - print "Strange Transifex config! Found these release-* resources:" - print "\n".join(resources) - - return None + msg = "Strange Transifex config! Found these release-* resources:\n" + "\n".join(resources) + raise ValueError(msg) diff --git a/pavelib/paver_tests/test_i18n.py b/pavelib/paver_tests/test_i18n.py new file mode 100644 index 00000000000..bce412ce697 --- /dev/null +++ b/pavelib/paver_tests/test_i18n.py @@ -0,0 +1,134 @@ +""" +Tests for pavelib/i18n.py. +""" + +import textwrap +import unittest + +from mock import mock_open, patch +from paver.easy import task + +import pavelib.i18n +from pavelib.paver_tests.utils import PaverTestCase + + +TX_CONFIG_SIMPLE = """\ +[main] +host = https://www.transifex.com + +[edx-platform.django-partial] +file_filter = conf/locale/<lang>/LC_MESSAGES/django-partial.po +source_file = conf/locale/en/LC_MESSAGES/django-partial.po +source_lang = en +type = PO + +[edx-platform.django-studio] +file_filter = conf/locale/<lang>/LC_MESSAGES/django-studio.po +source_file = conf/locale/en/LC_MESSAGES/django-studio.po +source_lang = en +type = PO + +""" + +TX_CONFIG_RELEASE = TX_CONFIG_SIMPLE + """\ +[edx-platform.release-zebrawood] +file_filter = conf/locale/<lang>/LC_MESSAGES/django.po +source_file = conf/locale/en/LC_MESSAGES/django.po +source_lang = en +type = PO + +[edx-platform.release-zebrawood-js] +file_filter = conf/locale/<lang>/LC_MESSAGES/djangojs.po +source_file = conf/locale/en/LC_MESSAGES/djangojs.po +source_lang = en +type = PO +""" + + +def mocked_i18n_open(*content): + """ + Helper decorator to mock open() in pavelib.i18n. + + Arguments: + content (str): any number of strings, which are dedented, then + concatenated, and then returned as f.read() when pavelib.i18n opens + a file. + + """ + read_data = "".join(textwrap.dedent(c) for c in content) + return patch.object(pavelib.i18n, 'open', create=True, new=mock_open(read_data=read_data)) + + +@task +def do_nothing(): + """ + Don't do anything, for replacing prerequisite tasks we want to skip. + """ + pass + + +class FindReleaseResourcesTest(unittest.TestCase): + """ + Tests of pavelib/i18n.py:find_release_resources. + """ + @mocked_i18n_open(TX_CONFIG_SIMPLE) + def test_no_resources(self): + errmsg = r"You need two release-\* resources defined to use this command." + with self.assertRaisesRegexp(ValueError, errmsg): + pavelib.i18n.find_release_resources() + + @mocked_i18n_open(TX_CONFIG_SIMPLE, """\ + [edx-platform.release-zebrawood] + file_filter = conf/locale/<lang>/LC_MESSAGES/django.po + source_file = conf/locale/en/LC_MESSAGES/django.po + source_lang = en + type = PO + """) + def test_one_resource(self): + errmsg = r"Strange Transifex config! Found these release-\* resources:\nedx-platform.release-zebrawood" + with self.assertRaisesRegexp(ValueError, errmsg): + pavelib.i18n.find_release_resources() + + @mocked_i18n_open(TX_CONFIG_RELEASE) + def test_good_resources(self): + self.assertEqual( + pavelib.i18n.find_release_resources(), + ['edx-platform.release-zebrawood', 'edx-platform.release-zebrawood-js'], + ) + + +class ReleasePushPullTest(PaverTestCase): + """ + Tests of i18n_release_push and i18n_release_pull. + """ + @mocked_i18n_open(TX_CONFIG_SIMPLE) + @patch.object(pavelib.i18n, 'i18n_generate', new=do_nothing) + def test_cant_push_nothing(self): + with self.assertRaises(SystemExit) as sysex: + pavelib.i18n.i18n_release_push() + # Check that we exited with a failure status code. + self.assertEqual(sysex.exception.args, (1,)) + + @mocked_i18n_open(TX_CONFIG_SIMPLE) + def test_cant_pull_nothing(self): + with self.assertRaises(SystemExit) as sysex: + pavelib.i18n.i18n_release_pull() + # Check that we exited with a failure status code. + self.assertEqual(sysex.exception.args, (1,)) + + @mocked_i18n_open(TX_CONFIG_RELEASE) + @patch.object(pavelib.i18n, 'i18n_generate', new=do_nothing) + @patch.object(pavelib.i18n, 'sh') + def test_can_push_release(self, mock_sh): + pavelib.i18n.i18n_release_push() + mock_sh.assert_called_once_with( + 'i18n_tool transifex push edx-platform.release-zebrawood edx-platform.release-zebrawood-js' + ) + + @mocked_i18n_open(TX_CONFIG_RELEASE) + @patch.object(pavelib.i18n, 'sh') + def test_can_pull_release(self, mock_sh): + pavelib.i18n.i18n_release_pull() + mock_sh.assert_called_once_with( + 'i18n_tool transifex pull edx-platform.release-zebrawood edx-platform.release-zebrawood-js' + ) -- GitLab