test_i18n.py 4.11 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 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'
        )