Bug 22709: Unit tests
authorTomas Cohen Arazi <tomascohen@theke.io>
Fri, 21 Jun 2019 20:09:56 +0000 (17:09 -0300)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 4 Jul 2019 12:49:21 +0000 (13:49 +0100)
This patch introduces tests for new plugin hooks added to
C4::Biblio::{Add|Mod|Del}Biblio and C4::Items::{Add|Mod|Del}Item.

They are tested together as for creating an item you need to first create
a biblio and tests looks basically the same.

The testing strategy is
- Make sure the plugin is passed the right params
- Throw an exception at plugin-level, to be trapped by the C4::Biblio
and C4::Items lib, and converted into a warning. So we test for the
warning.
- Also, the fact that C4::Biblio and C4::Items warns, means the
exception was cought, and then Koha won't break on faulty plugins or
fatal errors from plugins.

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

t/db_dependent/Biblio_and_Items_plugin_hooks.t [new file with mode: 0755]
t/lib/Koha/Plugin/Test.pm

diff --git a/t/db_dependent/Biblio_and_Items_plugin_hooks.t b/t/db_dependent/Biblio_and_Items_plugin_hooks.t
new file mode 100755 (executable)
index 0000000..2d5602a
--- /dev/null
@@ -0,0 +1,83 @@
+#!/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 => 4;
+use Test::Warn;
+
+use File::Basename;
+
+use C4::Items;
+
+use t::lib::Mocks;
+use t::lib::TestBuilder;
+
+BEGIN {
+    # 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');
+    use_ok('Koha::Plugin::Test');
+}
+
+my $schema  = Koha::Database->new->schema;
+my $builder = t::lib::TestBuilder->new;
+
+t::lib::Mocks::mock_preference( 'UseKohaPlugins', 1 );
+
+subtest 'after_biblio_action() and after_item_action() hooks tests' => sub {
+
+    plan tests => 6;
+
+    $schema->storage->txn_begin;
+
+    my $plugins = Koha::Plugins->new;
+    $plugins->InstallPlugins;
+
+    my $plugin = Koha::Plugin::Test->new;
+
+    my $biblio_id;
+
+    warning_like { $biblio_id = C4::Biblio::AddBiblio( MARC::Record->new(), '' ); }
+            qr/after_biblio_action called with action: create, ref: Koha::Biblio/,
+            'AddBiblio calls the hook with action=create';
+
+    warning_like { C4::Biblio::ModBiblio( MARC::Record->new(), $biblio_id, '' ); }
+            qr/after_biblio_action called with action: modify, ref: Koha::Biblio/,
+            'ModBiblio calls the hook with action=modify';
+
+    my $item;
+    warning_like { $item = $builder->build_sample_item({ biblionumber => $biblio_id }); }
+            qr/after_item_action called with action: create, ref: Koha::Item/,
+            'AddItem calls the hook with action=create';
+
+    warning_like { C4::Items::ModItem({ location => 'shelves' }, $biblio_id, $item->itemnumber); }
+            qr/after_item_action called with action: modify, ref: Koha::Item/,
+            'ModItem calls the hook with action=modify';
+
+    warning_like { C4::Items::DelItem({ itemnumber => $item->itemnumber }); }
+            qr/after_item_action called with action: delete/,
+            'DelItem calls the hook with action=delete, item_id passed';
+
+    warning_like { C4::Biblio::DelBiblio( $biblio_id ); }
+            qr/after_biblio_action called with action: delete/,
+            'DelBiblio calls the hook with action=delete biblio_id passed';
+
+    $schema->storage->txn_rollback;
+};
index 764b5a6..e34b61d 100644 (file)
@@ -3,6 +3,7 @@ package Koha::Plugin::Test;
 ## It's good practice to use Modern::Perl
 use Modern::Perl;
 
+use Koha::Exceptions::Exception;
 use Mojo::JSON qw(decode_json);
 
 ## Required for all plugins
@@ -124,6 +125,35 @@ sub api_namespace {
     return "testplugin";
 }
 
+sub after_biblio_action {
+    my ( $self, $params ) = @_;
+    my $action    = $params->{action} // '';
+    my $biblio    = $params->{biblio};
+    my $biblio_id = $params->{biblio_id};
+
+    if ( $action ne 'delete' ) {
+        Koha::Exceptions::Exception->throw("after_biblio_action called with action: $action, ref: " . ref($biblio) );
+    }
+    else {
+        Koha::Exceptions::Exception->throw("after_biblio_action called with action: $action") if $biblio_id;
+    }
+}
+
+
+sub after_item_action {
+    my ( $self, $params ) = @_;
+    my $action  = $params->{action} // '';
+    my $item    = $params->{item};
+    my $item_id = $params->{item_id};
+
+    if ( $action ne 'delete' ) {
+        Koha::Exceptions::Exception->throw("after_item_action called with action: $action, ref: " . ref($item) );
+    }
+    else {
+        Koha::Exceptions::Exception->throw("after_item_action called with action: $action" ) if $item_id;
+    }
+}
+
 sub api_routes {
     my ( $self, $args ) = @_;