Koha-clms/t/db_dependent/Koha/Database/Commenter.t

124 lines
4.9 KiB
Perl
Executable File

#!/usr/bin/perl
use Modern::Perl;
use File::Temp qw();
use Test::NoWarnings;
use Test::More tests => 3;
use Test::Exception;
use C4::Context;
use Koha::Database;
use Koha::Database::Commenter;
our $schema = Koha::Database->new->schema;
our $dbh = C4::Context->dbh;
our $mgr;
subtest '->new, dry_run' => sub {
plan tests => 9;
$schema->storage->txn_begin; # just cosmetic, no changes expected in a dry run
# Two exceptions on dbh parameter
throws_ok { Koha::Database::Commenter->new } 'Koha::Exceptions::MissingParameter', 'No dbh';
throws_ok { Koha::Database::Commenter->new( { dbh => 'dbh' } ) } 'Koha::Exceptions::WrongParameter',
'dbh no string';
# Another exception: delete schema file and reset should raise exception
my $filename = create_schema_file();
$mgr = Koha::Database::Commenter->new( { dbh => $dbh, schema_file => $filename } );
unlink $filename;
throws_ok { $mgr->reset_to_schema( { dry_run => 1, table => 'biblio' } ) } 'Koha::Exceptions::FileNotFound',
'Schema deleted';
# Check case of columns from information_schema (MySQL8 defaults to uppercase)
my $columns = $mgr->_fetch_stored_comments( { table => 'article_requests' } );
ok( exists $columns->[0]->{table_name}, 'Check table_name column' );
ok( exists $columns->[0]->{column_name}, 'Check column_name column' );
ok( exists $columns->[0]->{column_comment}, 'Check column_comment column' );
# Clear comments for article_requests in dry run mode
my $messages = [];
$mgr->clear( { table => 'article_requests', dry_run => 1 }, $messages );
is( grep( { /COLUMN `toc_request`.*DEFAULT 0;$/m } @$messages ), 1, 'No comment for toc_request' );
# Renumber this field in dry run mode
$messages = [];
$mgr->renumber( { table => 'article_requests', dry_run => 1 }, $messages );
is( grep( { /COLUMN `toc_request`.*COMMENT 'Column_\d+';$/m } @$messages ), 1, 'Numbered comment for toc_request' );
# Reset in dry run mode, first fix schema file again
# Our fake schema contains only one column for article_requests now.
$filename = create_schema_file();
$mgr = Koha::Database::Commenter->new( { dbh => $dbh, schema_file => $filename } );
$messages = [];
$mgr->reset_to_schema( { table => 'article_requests', dry_run => 1 }, $messages );
# We expect an ALTER clearing toc_request first, followed by an ALTER adding comment.
# Note: This is based on the fair assumption that toc_request had a comment! This test could fail if it had not.
like(
join( "\n", @$messages ), qr/ALTER.*toc_request.*DEFAULT 0;(.*\n)+ALTER.*toc_request.*COMMENT.*$/m,
'Reset for one-columned article_requests'
);
$schema->storage->txn_rollback;
};
subtest '->clear, ->reset, ->renumber' => sub {
plan tests => 6;
#$schema->storage->txn_begin; # commented: DDL statements implicitly commit; we are testing only 1 new table here btw
create_test_table1($dbh);
$mgr->clear( { table => 'database_commenter_1' } );
my $info = $mgr->_columns_info('database_commenter_1');
is( $info->{sometext}->{Comment}, q{}, 'Found no comment for sometext' );
is( $info->{anotherint}->{Comment}, q{}, 'Found no comment for anotherint' );
# Created temporary file serves as schema/kohastructure.sql now
$mgr->reset_to_schema( { table => 'database_commenter_1' } );
$info = $mgr->_columns_info('database_commenter_1');
is( $info->{sometext}->{Comment}, 'some nice quote\'s', 'Found comment for sometext' );
is( $info->{anotherint}->{Comment}, 'my int', 'Found comment for anotherint' );
# Renumber follows alphabetical order
$mgr->renumber( { table => 'database_commenter_1' } );
$info = $mgr->_columns_info('database_commenter_1');
is( $info->{anotherint}->{Comment}, 'Column_1', 'Found Column_1' );
is( $info->{timestamp2}->{Comment}, 'Column_5', 'Found Column_5' );
eval { $dbh->do('DROP TABLE database_commenter_1') };
#$schema->storage->txn_rollback; # commented: DDL statements implicitly commit
};
sub create_schema_file {
my ( $fh, $filename ) = File::Temp::tempfile();
print $fh schema_table1();
print $fh "\n";
print $fh schema_table2(); # fragment of Koha table
close $fh;
return $filename;
}
sub schema_table1 {
return q|CREATE TABLE database_commenter_1 (
id int AUTO_INCREMENT,
sometext varchar(80) NOT NULL DEFAULT '' COMMENT 'some nice quote''s',
anotherint int NULL COMMENT 'my int',
date1 DATE NOT NULL,
timestamp2 timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (id) );|;
}
sub schema_table2 { # only a fragment
return q|CREATE TABLE article_requests (
`toc_request` tinyint(4) NOT NULL DEFAULT 0 COMMENT 'borrower requested table of contents')|;
}
sub create_test_table1 {
my ($dbh) = @_;
eval { $dbh->do('DROP TABLE database_commenter_1') };
$dbh->do( schema_table1() );
}