From 3d09c4051cc2d8b50200fc150d0209918b25d8e9 Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Mon, 4 Nov 2019 11:52:33 -0300 Subject: [PATCH] Bug 23050: (QA follow-up) Add Koha::Plugins::Tab class This minimal class encapsulates the tabs to be passed around to the templates, so error checking on missing bits is done in a single place. It throws exceptions on errors Signed-off-by: Tomas Cohen Arazi --- Koha/Plugins/Tab.pm | 72 +++++++++++++++++++++++++++++++++++++++ catalogue/detail.pl | 18 +++++++--- t/Koha/Plugins/Tab.t | 62 +++++++++++++++++++++++++++++++++ t/lib/Koha/Plugin/Test.pm | 24 ++++++++++++- 4 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 Koha/Plugins/Tab.pm create mode 100644 t/Koha/Plugins/Tab.t diff --git a/Koha/Plugins/Tab.pm b/Koha/Plugins/Tab.pm new file mode 100644 index 0000000000..ec3c2eefa1 --- /dev/null +++ b/Koha/Plugins/Tab.pm @@ -0,0 +1,72 @@ +package Koha::Plugins::Tab; + +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +use Modern::Perl; + +use Koha::Exceptions; + +use base qw(Class::Accessor); + +__PACKAGE__->mk_accessors(qw( title content id )); + +=head1 NAME + +Koha::Plugins::Tab - Simple base to abstract tabs to be generated by plugins + +=head1 DESCRIPTION + +Object-oriented class that represents tabs generated by plugins. Error handling on +mandatory fields is handled here. + +=head1 API + +=head2 Class methods + +=head3 new + + my $tab = Koha::Plugins::Tab->new( + { + title => 'A title', + content => 'Some content' + } + ); + +Returns a Koha::Plugins::Tab object representing a plugin-generated tab. + +=cut + +sub new { + + my ( $class, $params ) = @_; + + Koha::Exceptions::MissingParameter->throw( "Mandatory parameter 'title' missing" ) + unless defined $params->{ title }; + + Koha::Exceptions::MissingParameter->throw( "Mandatory parameter 'content' missing") + unless defined $params->{content}; + + my $self = { + title => $params->{title}, + content => $params->{content} + }; + + bless $self, $class; + return $self; +} + +1; diff --git a/catalogue/detail.pl b/catalogue/detail.pl index d176f1088e..ee0cb8240d 100755 --- a/catalogue/detail.pl +++ b/catalogue/detail.pl @@ -75,12 +75,20 @@ if ( C4::Context->preference('UseKohaPlugins') && }); my @tabs; foreach my $tab_plugin (@tab_plugins) { - my @biblio_tabs = $tab_plugin->intranet_catalog_biblio_tab(); - foreach my $tab (@biblio_tabs) { - $tab->{id} = 'tab-' . $tab->{title}; - $tab->{id} =~ s/[^0-9A-Za-z]+/-/g; - push @tabs, $tab, + my @biblio_tabs; + + try { + @biblio_tabs = $tab_plugin->intranet_catalog_biblio_tab(); + foreach my $tab (@biblio_tabs) { + my $tab_id = 'tab-' . $tab->title; + $tab_id =~ s/[^0-9A-Za-z]+/-/g; + $tab->id( $tab_id ); + push @tabs, $tab, + } } + catch { + warn "Error calling 'intranet_catalog_biblio_tab' on the " . $tab_plugin->{class} . "plugin ($_)"; + }; } $template->param( diff --git a/t/Koha/Plugins/Tab.t b/t/Koha/Plugins/Tab.t new file mode 100644 index 0000000000..94b7097f23 --- /dev/null +++ b/t/Koha/Plugins/Tab.t @@ -0,0 +1,62 @@ +#!/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 . + +use Modern::Perl; + +use Test::More tests => 1; +use Test::Exception; + +use Koha::Plugins::Tab; + +subtest 'new() tests' => sub { + plan tests => 7; + + throws_ok { Koha::Plugins::Tab->new( { title => 'A title' } ); } + 'Koha::Exceptions::MissingParameter', + 'Exception is thrown on missing content'; + + is( + "$@", + "Mandatory parameter 'content' missing", + 'Exception message is correct' + ); + + throws_ok { Koha::Plugins::Tab->new( { content => 'Some content' } ); } + 'Koha::Exceptions::MissingParameter', + 'Exception is thrown on missing title'; + + is( + "$@", + "Mandatory parameter 'title' missing", + 'Exception message is correct' + ); + + my $tab = Koha::Plugins::Tab->new( + { + title => 'A title', + content => 'Some content' + } + ); + + is( $tab->title, 'A title', 'title accessor is correct' ); + is( $tab->content, 'Some content', 'content accessor is correct' ); + + my $id = 'calculated-id'; + $tab->id($id); + + is( $tab->id, $id, 'The id can be calculated and set on runtime' ); +}; diff --git a/t/lib/Koha/Plugin/Test.pm b/t/lib/Koha/Plugin/Test.pm index 7a963d9565..3c2896b726 100644 --- a/t/lib/Koha/Plugin/Test.pm +++ b/t/lib/Koha/Plugin/Test.pm @@ -4,6 +4,8 @@ package Koha::Plugin::Test; use Modern::Perl; use Koha::Exceptions::Exception; +use Koha::Plugins::Tab; + use Mojo::JSON qw(decode_json); ## Required for all plugins @@ -139,7 +141,6 @@ sub after_biblio_action { } } - sub after_item_action { my ( $self, $params ) = @_; my $action = $params->{action} // ''; @@ -228,6 +229,27 @@ sub check_password { } } +sub intranet_catalog_biblio_tab { + my @tabs; + push @tabs, + Koha::Plugins::Tab->new( + { + title => 'Tab 1', + content => 'This is content for tab 1' + } + ); + + push @tabs, + Koha::Plugins::Tab->new( + { + title => 'Tab 2', + content => 'This is content for tab 2' + } + ); + + return @tabs; +} + sub _private_sub { return ""; } -- 2.24.0