From 92c7a114033a05871e262a743c7fe29600844522 Mon Sep 17 00:00:00 2001
From: Kyle M Hall <kyle@bywatersolutions.com>
Date: Mon, 14 Jan 2013 08:23:46 -0500
Subject: [PATCH] Bug 7804 - Add Koha Plugin System - Unit Tests

---
 Koha/Plugins.pm          |    4 +-
 Koha/Plugins/Base.pm     |    4 +-
 Koha/Plugins/Handler.pm  |    5 ++-
 t/Koha/Plugin/Test.pm    |   53 ++++++++++++++++++++++++++++++++++++++++++++++
 t/db_dependent/Plugins.t |   39 +++++++++++++++++++++++++++++++++
 5 files changed, 99 insertions(+), 6 deletions(-)
 create mode 100644 t/Koha/Plugin/Test.pm
 create mode 100755 t/db_dependent/Plugins.t

diff --git a/Koha/Plugins.pm b/Koha/Plugins.pm
index 797f600..bc4a3bb 100644
--- a/Koha/Plugins.pm
+++ b/Koha/Plugins.pm
@@ -26,8 +26,6 @@ use C4::Context;
 use C4::Output;
 
 BEGIN {
-    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") );
-
     push @INC, C4::Context->config("pluginsdir");
 }
 
@@ -40,6 +38,8 @@ Koha::Plugins - Module for loading and managing plugins.
 sub new {
     my ( $class, $args ) = @_;
 
+    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") || $args->{'enable_plugins'} );
+
     $args->{'pluginsdir'} = C4::Context->config("pluginsdir");
 
     return bless( $args, $class );
diff --git a/Koha/Plugins/Base.pm b/Koha/Plugins/Base.pm
index f1cff3b..0e1aedc 100644
--- a/Koha/Plugins/Base.pm
+++ b/Koha/Plugins/Base.pm
@@ -27,8 +27,6 @@ use C4::Context;
 use C4::Auth;
 
 BEGIN {
-    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") );
-
     push @INC, C4::Context->config("pluginsdir");
 }
 
@@ -41,6 +39,8 @@ C4::Plugins::Base - Base Module for plugins
 sub new {
     my ( $class, $args ) = @_;
 
+    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") || $args->{'enable_plugins'} );
+
     $args->{'class'} = $class;
     $args->{'template'} = Template->new( { ABSOLUTE => 1 } );
 
diff --git a/Koha/Plugins/Handler.pm b/Koha/Plugins/Handler.pm
index 7ecdb79..d2f324a 100644
--- a/Koha/Plugins/Handler.pm
+++ b/Koha/Plugins/Handler.pm
@@ -26,8 +26,6 @@ use Module::Load::Conditional qw(can_load);
 use C4::Context;
 
 BEGIN {
-    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") );
-
     push @INC, C4::Context->config("pluginsdir");
 }
 
@@ -52,6 +50,9 @@ Runs a plugin
 
 sub run {
     my ( $class, $args ) = @_;
+
+    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") || $args->{'enable_plugins'} );
+
     my $plugin_class  = $args->{'class'};
     my $plugin_method = $args->{'method'};
     my $cgi           = $args->{'cgi'};
diff --git a/t/Koha/Plugin/Test.pm b/t/Koha/Plugin/Test.pm
new file mode 100644
index 0000000..d34a6eb
--- /dev/null
+++ b/t/Koha/Plugin/Test.pm
@@ -0,0 +1,53 @@
+package Koha::Plugin::Test;
+
+## It's good practive to use Modern::Perl
+use Modern::Perl;
+
+## Required for all plugins
+use base qw(Koha::Plugins::Base);
+
+our $VERSION = 1.01;
+our $metadata = {
+    name            => 'Test Plugin',
+    author          => 'Kyle M Hall',
+    description     => 'Test plugin',
+    date_authored   => '2013-01-14',
+    date_updated    => '2013-01-14',
+    minimum_version => '3.11',
+    maximum_version => undef,
+    version         => $VERSION,
+};
+
+## This is the minimum code required for a plugin's 'new' method
+## More can be added, but none should be removed
+sub new {
+    my ( $class, $args ) = @_;
+    $args->{'metadata'} = $metadata;
+    my $self = $class->SUPER::new($args);
+    return $self;
+}
+
+sub report {
+    my ( $self, $args ) = @_;
+    return 1;
+}
+
+sub tool {
+    my ( $self, $args ) = @_;
+    return 1;
+}
+
+sub configure {
+    my ( $self, $args ) = @_;
+    return 1;
+}
+
+sub install {
+    my ( $self, $args ) = @_;
+    return 1;
+}
+
+sub uninstall {
+    my ( $self, $args ) = @_;
+    return 1;
+}
diff --git a/t/db_dependent/Plugins.t b/t/db_dependent/Plugins.t
new file mode 100755
index 0000000..52495ea
--- /dev/null
+++ b/t/db_dependent/Plugins.t
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 15;
+use File::Basename;
+
+use Module::Load::Conditional qw(can_load);
+
+use C4::Context;
+
+BEGIN {
+    push( @INC, dirname(__FILE__) . '/..' );
+
+    use_ok('Koha::Plugins');
+    use_ok('Koha::Plugins::Handler');
+    use_ok('Koha::Plugins::Base');
+    use_ok('Koha::Plugin::Test');
+}
+
+ok( can_load( modules => { "Koha::Plugin::Test" => undef } ), 'Test can_load' );
+
+my $plugin = Koha::Plugin::Test->new({ enable_plugins => 1});
+
+isa_ok( $plugin, "Koha::Plugin::Test", 'Test plugin class' );
+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('configure'), 'Test plugin can configure' );
+ok( $plugin->can('install'), 'Test plugin can install' );
+ok( $plugin->can('uninstall'), 'Test plugin can install' );
+
+my $metadata = $plugin->get_metadata();
+ok( $metadata->{'name'} eq 'Test Plugin', 'Test $plugin->get_metadata()' );
+
+ok( $plugin->get_qualified_table_name('mytable') eq 'koha_plugin_test_mytable', 'Test $plugin->get_qualified_table_name()' );
+ok( $plugin->get_plugin_http_path() eq '/plugin/Koha/Plugin/Test', 'Test $plugin->get_plugin_http_path()' );
\ No newline at end of file
-- 
1.7.2.5