Bug 13941: [1/2] Test <body> tag with id/class attributes
authorFrédéric Demians <f.demians@tamil.fr>
Tue, 14 Apr 2015 14:26:50 +0000 (16:26 +0200)
committerTomas Cohen Arazi <tomascohen@gmail.com>
Fri, 24 Apr 2015 12:47:28 +0000 (09:47 -0300)
Test:

- Apply the first patch [1/2] containing a new test checking <body> tags in all
  templates
- Run the test: prove xt/tt_valid.t
- You get a list of templates with invalid <body> tags.
- Apply the second patch [2/2] fixing all invalid <body> tags.
- Re-run the test: It passes.

Folowed test plan, works as expected
Signed-off-by: Marc Véron <veron@veron.ch>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>

xt/tt_valid.t

index 507210f..90da343 100755 (executable)
@@ -17,9 +17,8 @@
 # You should have received a copy of the GNU General Public License
 # along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-use warnings;
-use strict;
-use Test::More tests => 2;
+use Modern::Perl;
+use Test::More tests => 3;
 use File::Find;
 use Cwd;
 use C4::TTParser;
@@ -42,35 +41,57 @@ for my $theme ( grep { not /^\.|lib|js/ } readdir($dh) ) {
 }
 close $dh;
 
-my @files_with_directive_in_tag = do {
-    my @files;
-    find( sub {
-        my $dir = getcwd();
-        return if $dir =~ /blib/;
-        return unless /\.(tt|inc)$/;
-        my $name = $_;
-        my $parser = C4::TTParser->new;
-        $parser->build_tokens( $name );  
-        my @lines;
-        while ( my $token = $parser->next_token ) {
+my $checkers = [
+    {
+        description => 'TT syntax: not using TT directive within HTML tag',
+        check => sub {
+            my ($self, $name, $token) = @_;
             my $attr = $token->{_attr};
             next unless $attr;
-            push @lines, $token->{_lc} if $attr->{'[%'} or $attr->{'[%-'};
+            push @{$self->{errors}->{$name}}, $token->{_lc} if $attr->{'[%'} or $attr->{'[%-'};
+        },
+        errors => {},
+    },
+    {
+        description => '<body> tag with id and class attributes',
+        check => sub {
+            my ($self, $name, $token) = @_;
+            return if $name =~ /bodytag\.inc/;
+            my $tag = $token->{_string};
+            push @{$self->{errors}->{$name}}, $token->{_lc}
+              if $tag =~ /^<body/ &&
+                 ($tag !~ /id=".+"/ || $tag !~ /class=".+"/);
+        },
+        errors => {},
+    },
+];
+find( sub {
+    my $dir = getcwd();
+    return if $dir =~ /blib/;
+    return unless /\.(tt|inc)$/;
+    ($dir) = $dir =~ /koha-tmpl\/(.*)$/;
+    my $name = $_;
+    my $parser = C4::TTParser->new;
+    $parser->build_tokens( $name );
+    while ( my $token = $parser->next_token ) {
+        my $attr = $token->{_attr};
+        next unless $attr;
+        for my $checker (@$checkers) {
+            $checker->{check}->($checker, "$dir/$name", $token);
         }
-        ($dir) = $dir =~ /koha-tmpl\/(.*)$/;
-        push @files, { name => "$dir/$name", lines => \@lines } if @lines;
-      }, @themes
-    );
-    @files;
-};
-
-
-ok( !@files_with_directive_in_tag, "TT syntax: not using TT directive within HTML tag" )
-    or diag(
-          "Files list: \n",
-          join( "\n", map { $_->{name} . ': ' . join(', ', @{$_->{lines}})
-              } @files_with_directive_in_tag )
-       );
+    }
+  }, @themes
+);
+
+for my $check (@$checkers) {
+  my @files = sort keys %{$check->{errors}};
+  ok( !@files, $check->{description} )
+      or diag(
+            "Files list: \n",
+            join( "\n", map { "$_: " . join(', ', @{$check->{errors}->{$_}})
+                } @files )
+         );
+}
 
 my $testtoken = 0;
 my $ttparser = C4::TTParser->new();
@@ -87,14 +108,17 @@ tt_valid.t
 
 This test validate Template Toolkit (TT) Koha files.
 
-For the time being an unique validation is done: Test if TT files contain TT
-directive within HTML tag. For example:
+For the time being, two validations are done:
+
+[1] Test if TT files contain TT directive within HTML tag. For example:
 
   <li[% IF
 
 This kind of constuction MUST be avoided because it break Koha translation
 process.
 
+[2] Test tag <body> tags have both attibutes 'id' and 'class'
+
 =head1 USAGE
 
 From Koha root directory: