From 0308261de6130f7a930249830f78d7914b842e9b Mon Sep 17 00:00:00 2001 From: Julian Maurice Date: Fri, 15 Dec 2017 15:18:24 +0100 Subject: [PATCH] Bug 19821: Run tests on a separate database Running the tests on the same database as the one used for dev has some drawbacks: - Everybody has different data, so we cannot make any assumptions about data in tests and it can make tests fail for non-obvious reasons. - Tests have to clean up every change to the database using SQL transactions, so we cannot write testable code that use transactions (AFAIK) - Transactions in tests happen to be committed sometimes, resulting in garbage data added to the dev database This patch provides a .proverc file that will load t/lib/Bootstrap.pm before the tests are run. t/lib/Bootstrap.pm is responsible for recreating a fresh database and telling the test scripts to use it. To use it, just run prove normally from the root directory of Koha. By default, the database is 'koha_test' and it's created using MARC21 SQL files, it can be changed by running: prove --norc \ --Mt::lib::Bootstrap=database,koha_test,marcflavour,UNIMARC Test plan: 1. Apply bug 19185 which will also apply these patches 2. In the DBMS run `select count(*) from koha_kohadev.borrowers;` (adapt if your usual koha DB isn't koha_kohadev) 3. Run the test plan of bug 19185 and during execution of the installation test, pay attention to the following: 4. List the databases in the DBMS (show databases;) to ensure that koha_test is created 5. After the test has run, the koha_test database should not be here anymore. 6. In the DBMS run `select count(*) from koha_kohadev.borrowers;` 7. That was to verify that the database you use usually was untouched. The counts should be the same. Signed-off-by: Jon Knight Signed-off-by: Martin Renvoize Signed-off-by: Bouzid Fergani Signed-off-by: Victor Grousset/tuxayo Signed-off-by: Kyle M Hall Signed-off-by: Jonathan Druart --- .proverc | 1 + t/lib/Bootstrap.pm | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 .proverc create mode 100644 t/lib/Bootstrap.pm diff --git a/.proverc b/.proverc new file mode 100644 index 0000000000..c5b8cf5053 --- /dev/null +++ b/.proverc @@ -0,0 +1 @@ +-Mt::lib::Bootstrap=database,koha_test diff --git a/t/lib/Bootstrap.pm b/t/lib/Bootstrap.pm new file mode 100644 index 0000000000..f679d392ff --- /dev/null +++ b/t/lib/Bootstrap.pm @@ -0,0 +1,72 @@ +package t::lib::Bootstrap; + +use Modern::Perl; + +use DBI; +use File::Temp qw( tempfile ); +use XML::LibXML; + +sub import { + my ($self, %args) = @_; + + unless (defined $args{database}) { + die "Test database is not defined"; + } + + $args{marcflavour} //= 'MARC21'; + + my $xml = XML::LibXML->load_xml(location => $ENV{KOHA_CONF}); + my $root = $xml->documentElement(); + my ($databaseElement) = $root->findnodes('//config/database'); + my $currentDatabase = $databaseElement->textContent(); + + if ($currentDatabase eq $args{database}) { + die "Test database is the same as database in KOHA_CONF, abort!"; + } + + $databaseElement->firstChild()->setData($args{database}); + + my ($fh, $filename) = tempfile('koha-conf.XXXXXX', TMPDIR => 1, UNLINK => 1); + $xml->toFH($fh); + + $ENV{KOHA_CONF} = $filename; + + require C4::Context; + C4::Context->import; + + require C4::Installer; + C4::Installer->import; + + require C4::Languages; + + my $host = C4::Context->config('hostname'); + my $port = C4::Context->config('port'); + my $database = C4::Context->config('database'); + my $user = C4::Context->config('user'); + my $pass = C4::Context->config('pass'); + + say "Create test database..."; + + my $dbh = DBI->connect("dbi:mysql:;host=$host;port=$port", $user, $pass, { + RaiseError => 1, + PrintError => 0, + }); + + $dbh->do("DROP DATABASE IF EXISTS $database"); + $dbh->do("CREATE DATABASE $database"); + + my $installer = C4::Installer->new(); + $installer->load_db_schema(); + $installer->set_marcflavour_syspref($args{marcflavour}); + my (undef, $fwklist) = $installer->marc_framework_sql_list('en', $args{marcflavour}); + my @frameworks; + foreach my $fwk (@$fwklist) { + foreach my $framework (@{ $fwk->{frameworks} }) { + push @frameworks, $framework->{fwkfile}; + } + } + my $all_languages = C4::Languages::getAllLanguages(); + $installer->load_sql_in_order($all_languages, @frameworks); +} + +1; -- 2.39.5