From eae72c6712d1eec517afb428ca0c013aada4c706 Mon Sep 17 00:00:00 2001 From: Julian Maurice Date: Thu, 25 Oct 2018 13:44:43 +0200 Subject: [PATCH] Bug 15395: Add unit tests for extract_messages_from_templates Because LangInstaller use FindBin to define some paths, the test produces warnings about a missing directory. I'm not sure how we can avoid that. Test plan: 1. prove t/LangInstaller.t Signed-off-by: Jonathan Druart Signed-off-by: Nick Clemens --- misc/translator/LangInstaller.pm | 7 +- t/LangInstaller.t | 108 ++++++++++++++++++++++++++++ t/LangInstaller/templates/simple.tt | 34 +++++++++ 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 t/LangInstaller.t create mode 100644 t/LangInstaller/templates/simple.tt diff --git a/misc/translator/LangInstaller.pm b/misc/translator/LangInstaller.pm index e247ab4e23..deff3abf2d 100644 --- a/misc/translator/LangInstaller.pm +++ b/misc/translator/LangInstaller.pm @@ -579,7 +579,12 @@ sub extract_messages_from_templates { my $keyword = $node->content; $keyword =~ s/^'t(.*)'$/__$1/; - say $fh "$keyword(" . join(', ', @args) . ");"; + # Only keep required args to have a clean output + my @required_args = shift @args; + push @required_args, shift @args if $keyword =~ /n/; + push @required_args, shift @args if $keyword =~ /p/; + + say $fh "$keyword(" . join(', ', @required_args) . ");"; } } diff --git a/t/LangInstaller.t b/t/LangInstaller.t new file mode 100644 index 0000000000..4075791c1a --- /dev/null +++ b/t/LangInstaller.t @@ -0,0 +1,108 @@ +use Modern::Perl; + +use FindBin '$Bin'; +use lib "$Bin/../misc/translator"; + +use Test::More tests => 39; +use File::Temp qw(tempdir); +use File::Slurp; +use Locale::PO; + +use t::lib::Mocks; + +use_ok('LangInstaller'); + +my $installer = LangInstaller->new(); + +my $tempdir = tempdir(CLEANUP => 0); +t::lib::Mocks::mock_config('intranetdir', "$Bin/LangInstaller/templates"); +my @files = ('simple.tt'); +$installer->extract_messages_from_templates($tempdir, @files); + +ok(-e "$tempdir/simple.tt", 'it has created a temporary file simple.tt'); +SKIP: { + skip "simple.tt does not exist", 37 unless -e "$tempdir/simple.tt"; + + my $output = read_file("$tempdir/simple.tt"); + my $expected_output = <<'EOF'; +__('hello'); +__x('hello {name}'); +__n('item', 'items'); +__nx('{count} item', '{count} items'); +__p('context', 'hello'); +__px('context', 'hello {name}'); +__np('context', 'item', 'items'); +__npx('context', '{count} item', '{count} items'); +__npx('context', '{count} item', '{count} items'); +__x('status is {status}'); +__('active'); +__('inactive'); +__('Inside block'); +EOF + + is($output, $expected_output, "Output of extract_messages_from_templates is as expected"); + + my $xgettext_cmd = "xgettext -L Perl --from-code=UTF-8 " + . "--package-name=Koha --package-version='' " + . "-k -k__ -k__x -k__n:1,2 -k__nx:1,2 -k__xn:1,2 -k__p:1c,2 " + . "-k__px:1c,2 -k__np:1c,2,3 -k__npx:1c,2,3 " + . "-o $tempdir/Koha.pot -D $tempdir simple.tt"; + + system($xgettext_cmd); + my $pot = Locale::PO->load_file_asarray("$tempdir/Koha.pot"); + + my @expected = ( + { + msgid => '"hello"', + }, + { + msgid => '"hello {name}"', + }, + { + msgid => '"item"', + msgid_plural => '"items"', + }, + { + msgid => '"{count} item"', + msgid_plural => '"{count} items"', + }, + { + msgid => '"hello"', + msgctxt => '"context"', + }, + { + msgid => '"hello {name}"', + msgctxt => '"context"', + }, + { + msgid => '"item"', + msgid_plural => '"items"', + msgctxt => '"context"', + }, + { + msgid => '"{count} item"', + msgid_plural => '"{count} items"', + msgctxt => '"context"', + }, + { + msgid => '"status is {status}"', + }, + { + msgid => '"active"', + }, + { + msgid => '"inactive"', + }, + { + msgid => '"Inside block"', + }, + ); + + for (my $i = 0; $i < @expected; $i++) { + for my $key (qw(msgid msgid_plural msgctxt)) { + my $expected = $expected[$i]->{$key}; + my $expected_str = defined $expected ? $expected : 'not defined'; + is($pot->[$i + 1]->$key, $expected, "$i: $key is $expected_str"); + } + } +} diff --git a/t/LangInstaller/templates/simple.tt b/t/LangInstaller/templates/simple.tt new file mode 100644 index 0000000000..5d8fb1084b --- /dev/null +++ b/t/LangInstaller/templates/simple.tt @@ -0,0 +1,34 @@ +[% t('hello') %] +[% tx('hello {name}', { name = 'Bob' }) %] +[% tn('item', 'items', count) %] +[% tnx('{count} item', '{count} items', count, { count = count }) %] +[% tp('context', 'hello') %] +[% tpx('context', 'hello {name}', { name = 'Bob' }) %] +[% tnp('context', 'item', 'items', count) %] +[% tnpx('context', '{count} item', '{count} items', count, { count = count }) %] + +[% # it also works on multiple lines + tnpx ( + 'context', + '{count} item', + '{count} items', + count, + { + count = count, + } + ) +%] + +[% # and t* calls can be nested + tx('status is {status}', { + status = active ? t('active') : t('inactive') + }) +%] + +[%# but a TT comment won't get picked + t('not translatable') +%] + +[% BLOCK %] + [% t('Inside block') %] +[% END %] -- 2.39.5