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