Bug 23230: (RM follow-up) Add rollback to plugin test
[koha-equinox.git] / t / db_dependent / Plugins.t
index 9379f94..d5f78f9 100755 (executable)
@@ -1,22 +1,42 @@
 #!/usr/bin/perl
 
+# 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 3 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, see <http://www.gnu.org/licenses>.
+
 use Modern::Perl;
 
-use Test::More tests => 35;
+use Archive::Extract;
 use CGI;
+use Cwd qw(abs_path);
 use File::Basename;
 use File::Spec;
 use File::Temp qw( tempdir tempfile );
 use FindBin qw($Bin);
-use Archive::Extract;
 use Module::Load::Conditional qw(can_load);
 use Test::MockModule;
+use Test::More tests => 52;
 
 use C4::Context;
+use Koha::Database;
+use Koha::Plugins::Methods;
+
 use t::lib::Mocks;
 
 BEGIN {
-    push( @INC, dirname(__FILE__) . '/../lib' );
+    # Mock pluginsdir before loading Plugins module
+    my $path = dirname(__FILE__) . '/../lib';
+    t::lib::Mocks::mock_config( 'pluginsdir', $path );
 
     use_ok('Koha::Plugins');
     use_ok('Koha::Plugins::Handler');
@@ -24,6 +44,104 @@ BEGIN {
     use_ok('Koha::Plugin::Test');
 }
 
+my $schema = Koha::Database->new->schema;
+
+subtest 'GetPlugins() tests' => sub {
+
+    plan tests => 2;
+
+    $schema->storage->txn_begin;
+    # Temporarily remove any installed plugins data
+    Koha::Plugins::Methods->delete;
+
+    my $plugins = Koha::Plugins->new({ enable_plugins => 1 });
+    $plugins->InstallPlugins;
+
+    my @plugins = $plugins->GetPlugins({ method => 'report', all => 1 });
+
+    my @names = map { $_->get_metadata()->{'name'} } @plugins;
+    is( scalar grep( /^Test Plugin$/, @names), 1, "Koha::Plugins::GetPlugins functions correctly" );
+
+    @plugins = $plugins->GetPlugins({ metadata => { my_example_tag  => 'find_me' }, all => 1 });
+    @names = map { $_->get_metadata()->{'name'} } @plugins;
+    is( scalar @names, 2, "Only two plugins found via a metadata tag" );
+
+    $schema->storage->txn_rollback;
+};
+
+subtest 'Version upgrade tests' => sub {
+
+    plan tests => 1;
+
+    $schema->storage->txn_begin;
+
+    my $plugin = Koha::Plugin::Test->new( { enable_plugins => 1, cgi => CGI->new } );
+
+    # make sure there's no version on the DB
+    $schema->resultset('PluginData')
+        ->search( { plugin_class => $plugin->{class}, plugin_key => '__INSTALLED_VERSION__' } )
+        ->delete;
+
+    $plugin = Koha::Plugin::Test->new( { enable_plugins => 1, cgi => CGI->new } );
+    my $version = $plugin->retrieve_data('__INSTALLED_VERSION__');
+
+    is( $version, $plugin->get_metadata->{version}, 'Version has been populated correctly' );
+
+    $schema->storage->txn_rollback;
+};
+
+subtest 'Version upgrade tests' => sub {
+
+    plan tests => 1;
+
+    $schema->storage->txn_begin;
+
+    my $plugin = Koha::Plugin::Test->new( { enable_plugins => 1, cgi => CGI->new } );
+
+    # make sure there's no version on the DB
+    $schema->resultset('PluginData')
+        ->search( { plugin_class => $plugin->{class}, plugin_key => '__INSTALLED_VERSION__' } )
+        ->delete;
+
+    $plugin = Koha::Plugin::Test->new( { enable_plugins => 1, cgi => CGI->new } );
+    my $version = $plugin->retrieve_data('__INSTALLED_VERSION__');
+
+    is( $version, $plugin->get_metadata->{version}, 'Version has been populated correctly' );
+
+    $schema->storage->txn_rollback;
+};
+
+subtest 'is_enabled() tests' => sub {
+
+    plan tests => 3;
+    $schema->storage->txn_begin;
+
+    # Make sure there's no previous installs or leftovers on DB
+    Koha::Plugins::Methods->delete;
+    $schema->resultset('PluginData')->delete;
+
+    my $plugin = Koha::Plugin::Test->new({ enable_plugins => 1, cgi => CGI->new });
+    ok( $plugin->is_enabled, 'Plugins enabled by default' );
+
+    # disable
+    $plugin->disable;
+    ok( !$plugin->is_enabled, 'Calling ->disable disables the plugin' );
+
+    # enable
+    $plugin->enable;
+    ok( $plugin->is_enabled, 'Calling ->enable enabled the plugin' );
+
+    $schema->storage->txn_rollback;
+};
+
+$schema->storage->txn_begin;
+Koha::Plugins::Methods->delete;
+
+Koha::Plugins->new( { enable_plugins => 1 } )->InstallPlugins();
+
+ok( Koha::Plugins::Methods->search( { plugin_class => 'Koha::Plugin::Test' } )->count, 'Test plugin methods added to database' );
+is( Koha::Plugins::Methods->search({ plugin_class => 'Koha::Plugin::Test', plugin_method => '_private_sub' })->count, 0, 'Private methods are skipped' );
+
 my $mock_plugin = Test::MockModule->new( 'Koha::Plugin::Test' );
 $mock_plugin->mock( 'test_template', sub {
     my ( $self, $file ) = @_;
@@ -42,13 +160,18 @@ isa_ok( $plugin, "Koha::Plugins::Base", 'Test plugin parent class' );
 ok( $plugin->can('report'), 'Test plugin can report' );
 ok( $plugin->can('tool'), 'Test plugin can tool' );
 ok( $plugin->can('to_marc'), 'Test plugin can to_marc' );
+ok( $plugin->can('intranet_catalog_biblio_enhancements'), 'Test plugin can intranet_catalog_biblio_enhancements');
+ok( $plugin->can('intranet_catalog_biblio_enhancements_toolbar_button'), 'Test plugin can intranet_catalog_biblio_enhancements_toolbar_button' );
 ok( $plugin->can('opac_online_payment'), 'Test plugin can opac_online_payment' );
 ok( $plugin->can('opac_online_payment_begin'), 'Test plugin can opac_online_payment_begin' );
 ok( $plugin->can('opac_online_payment_end'), 'Test plugin can opac_online_payment_end' );
 ok( $plugin->can('opac_head'), 'Test plugin can opac_head' );
 ok( $plugin->can('opac_js'), 'Test plugin can opac_js' );
+ok( $plugin->can('intranet_head'), 'Test plugin can intranet_head' );
+ok( $plugin->can('intranet_js'), 'Test plugin can intranet_js' );
 ok( $plugin->can('configure'), 'Test plugin can configure' );
 ok( $plugin->can('install'), 'Test plugin can install' );
+ok( $plugin->can('upgrade'), 'Test plugin can upgrade' );
 ok( $plugin->can('uninstall'), 'Test plugin can install' );
 
 is( Koha::Plugins::Handler->run({ class => "Koha::Plugin::Test", method => 'report', enable_plugins => 1 }), "Koha::Plugin::Test::report", 'Test run plugin report method' );
@@ -62,30 +185,40 @@ is( $plugin->get_plugin_http_path(), '/plugin/Koha/Plugin/Test', 'Test $plugin->
 # test absolute path change in get_template with Koha::Plugin::Test
 # using the mock set before
 # we also add tmpdir as an approved template dir
-t::lib::Mocks::mock_config( 'pluginsdir', [ File::Spec->tmpdir ] );
-my ( $fh, $fn ) = tempfile( SUFFIX => '.tt', UNLINK => 1 );
+t::lib::Mocks::mock_config( 'pluginsdir', [ C4::Context->temporary_directory ] );
+my ( $fh, $fn ) = tempfile( SUFFIX => '.tt', UNLINK => 1, DIR => C4::Context->temporary_directory );
 print $fh 'I am [% filename %]';
 close $fh;
 my $classname = ref($plugin);
 like( $plugin->test_template($fn), qr/^I am $fn/, 'Template works' );
 
+my $result = $plugin->enable;
+is( ref($result), 'Koha::Plugin::Test' );
+
 # testing GetPlugins
 my @plugins = Koha::Plugins->new({ enable_plugins => 1 })->GetPlugins({
     method => 'report'
 });
+
 my @names = map { $_->get_metadata()->{'name'} } @plugins;
 is( scalar grep( /^Test Plugin$/, @names), 1, "Koha::Plugins::GetPlugins functions correctly" );
 @plugins =  Koha::Plugins->new({ enable_plugins => 1 })->GetPlugins({
     metadata => { my_example_tag  => 'find_me' },
 });
+
 @names = map { $_->get_metadata()->{'name'} } @plugins;
 is( scalar grep( /^Test Plugin$/, @names), 1, "GetPlugins also found Test Plugin via a metadata tag" );
-# Test two metadata conditions; one does not exist for Test.pm
-# Since it is a required key, we should not find the same results
-my @plugins2 = Koha::Plugins->new({ enable_plugins => 1 })->GetPlugins({
-    metadata => { my_example_tag  => 'find_me', not_there => '1' },
-});
-isnt( scalar @plugins2, scalar @plugins, 'GetPlugins with two metadata conditions' );
+
+$result = $plugin->disable;
+is( ref($result), 'Koha::Plugin::Test' );
+
+@plugins = Koha::Plugins->new({ enable_plugins => 1 })->GetPlugins();
+@names = map { $_->get_metadata()->{'name'} } @plugins;
+is( scalar grep( /^Test Plugin$/, @names), 0, "GetPlugins does not found disabled Test Plugin" );
+
+@plugins = Koha::Plugins->new({ enable_plugins => 1 })->GetPlugins({ all => 1 });
+@names = map { $_->get_metadata()->{'name'} } @plugins;
+is( scalar grep( /^Test Plugin$/, @names), 1, "With all param, GetPlugins found disabled Test Plugin" );
 
 for my $pass ( 1 .. 2 ) {
     my $plugins_dir;
@@ -117,6 +250,7 @@ for my $pass ( 1 .. 2 ) {
 
     ok( -f $plugins_dir . "/Koha/Plugin/Com/ByWaterSolutions/KitchenSink.pm", "KitchenSink plugin installed successfully" );
     $INC{$pm_path} = $full_pm_path; # FIXME I do not really know why, but if this is moved before the $plugin constructor, it will fail with Can't locate object method "new" via package "Koha::Plugin::Com::ByWaterSolutions::KitchenSink"
+    Koha::Plugins->new( { enable_plugins => 1 } )->InstallPlugins();
     Koha::Plugins::Handler->delete({ class => "Koha::Plugin::Com::ByWaterSolutions::KitchenSink", enable_plugins => 1 });
     my $sth = C4::Context->dbh->table_info( undef, undef, $table, 'TABLE' );
     my $info = $sth->fetchall_arrayref;
@@ -151,3 +285,61 @@ subtest 'output and output_html tests' => sub {
     like($stdout, qr{Content-Type: text/html; charset=UTF-8}, 'Correct content-type');
     like($stdout, qr{¡Hola output_html!}, 'Correct data');
 };
+
+subtest 'Test _version_compare' => sub {
+
+    plan tests => 12;
+
+    t::lib::Mocks::mock_config( 'enable_plugins', 1 );
+
+    is( Koha::Plugins::Base::_version_compare( '1.1.1',    '2.2.2' ), -1, "1.1.1 is less then 2.2.2" );
+    is( Koha::Plugins::Base::_version_compare( '2.2.2',    '1.1.1' ),  1, "1.1.1 is greater then 2.2.2" );
+    is( Koha::Plugins::Base::_version_compare( '1.1.1',    '1.1.1' ),  0, "1.1.1 is equal to 1.1.1" );
+    is( Koha::Plugins::Base::_version_compare( '1.01.001', '1.1.1' ),  0, "1.01.001 is equal to 1.1.1" );
+    is( Koha::Plugins::Base::_version_compare( '1',        '1.0.0' ),  0, "1 is equal to 1.0.0" );
+    is( Koha::Plugins::Base::_version_compare( '1.0',      '1.0.0' ),  0, "1.0 is equal to 1.0.0" );
+
+    # OO tests
+    my $plugin = Koha::Plugin::Test->new;
+    is( $plugin->_version_compare( '1.1.1',    '2.2.2' ), -1, "1.1.1 is less then 2.2.2" );
+    is( $plugin->_version_compare( '2.2.2',    '1.1.1' ),  1, "1.1.1 is greater then 2.2.2" );
+    is( $plugin->_version_compare( '1.1.1',    '1.1.1' ),  0, "1.1.1 is equal to 1.1.1" );
+    is( $plugin->_version_compare( '1.01.001', '1.1.1' ),  0, "1.01.001 is equal to 1.1.1" );
+    is( $plugin->_version_compare( '1',        '1.0.0' ),  0, "1 is equal to 1.0.0" );
+    is( $plugin->_version_compare( '1.0',      '1.0.0' ),  0, "1.0 is equal to 1.0.0" );
+};
+
+subtest 'bundle_path() tests' => sub {
+
+    plan tests => 1;
+
+    t::lib::Mocks::mock_config( 'enable_plugins', 1 );
+
+    my @current_dir = File::Spec->splitdir(abs_path(__FILE__));
+    # remote Plugins.t
+    pop @current_dir;
+    # remove db_dependent
+    pop @current_dir;
+
+    my $plugin = Koha::Plugin::Test->new;
+
+    is( $plugin->bundle_path, File::Spec->catdir(@current_dir) . '/lib/Koha/Plugin/Test' );
+
+};
+
+subtest 'new() tests' => sub {
+
+    plan tests => 2;
+
+    t::lib::Mocks::mock_config( 'pluginsdir', [ C4::Context->temporary_directory ] );
+    t::lib::Mocks::mock_config( 'enable_plugins', 0 );
+
+    my $result = Koha::Plugins->new();
+    is( $result, undef, 'calling new() on disabled plugins returns undef' );
+
+    $result = Koha::Plugins->new({ enable_plugins => 1 });
+    is( ref($result), 'Koha::Plugins', 'calling new with enable_plugins makes it override the config' );
+};
+
+$schema->storage->txn_rollback;
+Koha::Plugins::Methods->delete;