Bug 15395: Add unit tests for extract_messages_from_templates
authorJulian Maurice <julian.maurice@biblibre.com>
Thu, 25 Oct 2018 11:44:43 +0000 (13:44 +0200)
committerNick Clemens <nick@bywatersolutions.com>
Thu, 8 Nov 2018 15:55:51 +0000 (15:55 +0000)
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 <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

misc/translator/LangInstaller.pm
t/LangInstaller.t [new file with mode: 0644]
t/LangInstaller/templates/simple.tt [new file with mode: 0644]

index e247ab4..deff3ab 100644 (file)
@@ -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 (file)
index 0000000..4075791
--- /dev/null
@@ -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 (file)
index 0000000..5d8fb10
--- /dev/null
@@ -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 %]