diff --git a/tests/rules/test_cat_dir.py b/tests/rules/test_cat_dir.py index c5332a93..8b492de4 100644 --- a/tests/rules/test_cat_dir.py +++ b/tests/rules/test_cat_dir.py @@ -1,15 +1,63 @@ +import gettext +import os +import warnings + import pytest + from thefuck.rules.cat_dir import match, get_new_command from thefuck.types import Command +# patch this so the libc locale is available in the testing virtualenv +gettext._default_localedir = '/usr/share/locale' -@pytest.mark.parametrize('command', [ - Command('cat foo', 'cat: foo: Is a directory\n'), - Command('cat /foo/bar/', 'cat: /foo/bar/: Is a directory\n'), - Command('cat cat/', 'cat: cat/: Is a directory\n'), -]) -def test_match(command): - assert match(command) +lang_vars = ['LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'] + + +@pytest.fixture(params=['en_US.UTF-8', 'fr_FR.UTF-8', 'en_US.ISO8859-1', 'fr_FR.ISO8859-1']) +def language(request): + return request.param + + +@pytest.fixture(params=[''] + lang_vars) +def environment(request, language): + orig_env = os.environ.copy() + + # empty the locale environment variables + for lang_var in lang_vars: + os.environ.pop(lang_var, None) + + if request.param: + os.environ[request.param] = language + + yield + + os.environ = orig_env + + +@pytest.fixture +def eisdir(environment): + eisdir = gettext.translation('libc', fallback=True).gettext('Is a directory') + return eisdir + + +@pytest.fixture(params=['foo', '/foo/var', 'cat/']) +def cat_command(request, eisdir): + return ( + Command('cat %s' % request.param, 'cat: %s: %s\n' % (request.param, eisdir)), + 'ls %s' % request.param + ) + + +def test_localization_possible(language): + if not language.startswith('en_US'): + try: + gettext.translation('libc', languages=[language]) + except FileNotFoundError as e: + warnings.warn("No '%s' translation file found for language '%s'; the localization tests for `cat_dir` will be ineffective" % (e.filename, language)) + + +def test_match(cat_command): + assert match(cat_command[0]) @pytest.mark.parametrize('command', [ @@ -20,10 +68,5 @@ def test_not_match(command): assert not match(command) -@pytest.mark.parametrize('command, new_command', [ - (Command('cat foo', 'cat: foo: Is a directory\n'), 'ls foo'), - (Command('cat /foo/bar/', 'cat: /foo/bar/: Is a directory\n'), 'ls /foo/bar/'), - (Command('cat cat', 'cat: cat: Is a directory\n'), 'ls cat'), -]) -def test_get_new_command(command, new_command): - assert get_new_command(command) == new_command +def test_get_new_command(cat_command): + assert get_new_command(cat_command[0]) == cat_command[1] diff --git a/thefuck/rules/cat_dir.py b/thefuck/rules/cat_dir.py index 39a158ad..eb8d4cd8 100644 --- a/thefuck/rules/cat_dir.py +++ b/thefuck/rules/cat_dir.py @@ -1,8 +1,12 @@ +import gettext + + def match(command): + eisdir = gettext.translation('libc', fallback=True).gettext('Is a directory') return ( command.script.startswith('cat') and command.output.startswith('cat: ') and - command.output.rstrip().endswith(': Is a directory') + command.output.rstrip().endswith(': %s' % eisdir) )