MT2637, Follow-up : Adds a test to check for missing sysprefs in the database
authorHenri-Damien LAURENT <henridamien.laurent@biblibre.com>
Tue, 19 Jan 2010 11:26:24 +0000 (12:26 +0100)
committerHenri-Damien LAURENT <henridamien.laurent@biblibre.com>
Thu, 28 Jan 2010 14:11:56 +0000 (15:11 +0100)
Adds a non-test mode (--showsql option) that displays the missing sysprefs as sql inserts.
Some sysprefs were missed from the syspref file due to extra spaces in the insert : fixed.
The test now checks if there are at least as many sysprefs in the database as in the syspref file (instead of checking for the exact number)

xt/check_sysprefs.t [new file with mode: 0755]

diff --git a/xt/check_sysprefs.t b/xt/check_sysprefs.t
new file mode 100755 (executable)
index 0000000..bc37740
--- /dev/null
@@ -0,0 +1,131 @@
+#!/usr/bin/perl 
+
+# Copyright (C) 2010 BibLibre
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use strict;
+use warnings;
+
+use Getopt::Long;
+use C4::Context;
+
+
+# When this option is set, no tests are performed.
+# The missing sysprefs are displayed as sql inserts instead.
+our $showsql = 0;
+GetOptions ('showsql' => \$showsql);
+
+
+use Test::More qw(no_plan); 
+our $dbh     = C4::Context->dbh;
+my $root_dir = C4::Context->config( 'intranetdir' ) . '/installer/data/mysql';
+my $base_syspref_file = "en/mandatory/sysprefs.sql";
+
+
+open( my $ref_fh, "<$root_dir/$base_syspref_file" );
+my $ref_syspref = get_syspref_from_file( $ref_fh );
+my @ref_sysprefs = sort { lc $a cmp lc $b } keys %$ref_syspref;
+if (!$showsql) {
+    cmp_ok(
+       $#ref_sysprefs, '>=', 0,
+       "Found " . ($#ref_sysprefs + 1) . " sysprefs"
+    );
+}
+
+check_db($ref_syspref);
+
+
+#
+# Get sysprefs from SQL file populating sysprefs table with INSERT statement.
+#
+# Exemple:
+# INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
+# VALUES('AmazonLocale','US','Use to set the Locale of your Amazon.com Web Services',
+# 'US|CA|DE|FR|JP|UK','Choice')
+#
+sub get_syspref_from_file {
+    my $fh = shift;
+    my %syspref;
+    while ( <$fh> ) {
+        next if /^--/; # Comment line
+        my $query = $_;
+        if ($_ =~ /\([\s]*\'([\w\-:]+)\'/) {
+            my $variable = $1;
+            if ($variable) {
+                $syspref{$variable} = $query;
+            }
+        }
+    }
+    return \%syspref;
+}
+
+
+sub check_db {
+    my $sysprefs = shift;
+
+    # Checking the number of sysprefs in the database
+    my $query = "SELECT COUNT(*) FROM systempreferences";
+    my $sth = $dbh->prepare($query);
+    $sth->execute;
+    my $res = $sth->fetchrow_arrayref;
+    my $dbcount = $res->[0];
+    if (!$showsql) {
+       cmp_ok (
+           $dbcount, ">=", scalar(keys %$sysprefs), "There are at least as many sysprefs in the database as in the sysprefs.sql"
+       );
+    }
+
+    # Checking for missing sysprefs in the database
+    $query = "SELECT COUNT(*) FROM systempreferences WHERE variable=?";
+    $sth = $dbh->prepare($query);
+    foreach (keys %$sysprefs) {
+       $sth->execute($_);
+       my $res = $sth->fetchrow_arrayref;
+       my $count = $res->[0];
+       if (!$showsql) {
+           is(
+               $count, 1, "Syspref $_ exists in the database"
+           );
+       } else {
+           if ($count != 1) {
+               print $sysprefs->{$_};
+           }
+       }
+    }
+}
+
+
+=head1 NAME
+
+syspref.t
+
+=head1 DESCRIPTION
+
+This test checks for missing sysprefs in the database.
+
+Sysprefs are gathered from the installation file. The database is 
+then queried to check if all the sysprefs are in it.
+
+=head1 USAGE
+
+prove -v check_sysprefs.t
+
+If you want to display the missing sysprefs as sql inserts : 
+perl check_sysprefs.t --showsql
+
+=cut
+