3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20 use Test::More tests => 2;
27 use JSON::Validator::OpenAPI::Mojolicious;
29 # Dummy app for testing the plugin
30 use Mojolicious::Lite;
33 # Mock pluginsdir before loading Plugins module
34 my $path = dirname(__FILE__) . '/../../../../lib';
35 t::lib::Mocks::mock_config( 'pluginsdir', $path );
41 my $schema = Koha::Database->new->schema;
43 subtest 'Bad plugins tests' => sub {
47 $schema->storage->txn_begin;
50 t::lib::Mocks::mock_config( 'enable_plugins', 1 );
51 t::lib::Mocks::mock_preference( 'UseKohaPlugins', 1 );
53 # remove any existing plugins that might interfere
54 Koha::Plugins::Methods->search->delete;
55 my $plugins = Koha::Plugins->new;
56 $plugins->InstallPlugins;
58 my @plugins = $plugins->GetPlugins( { all => 1 } );
59 foreach my $plugin (@plugins) {
63 # initialize Koha::REST::V1 after mocking
66 { $t = Test::Mojo->new('Koha::REST::V1'); }
67 'The resulting spec is invalid. Skipping Bad API Route Plugin',
68 'Bad plugins raise warning';
70 my $routes = get_defined_routes($t);
71 # Support placeholders () and <> (latter style used starting with Mojolicious::Plugin::OpenAPI@1.28)
72 # TODO: remove () if minimum version is bumped to at least 1.28.
73 ok( !exists $routes->{'/contrib/badass/patrons/(:patron_id)/bother_wrong'} && !exists $routes->{'/contrib/badass/patrons/<:patron_id>/bother_wrong'}, 'Route doesn\'t exist' );
74 ok( exists $routes->{'/contrib/testplugin/patrons/(:patron_id)/bother'} || exists $routes->{'/contrib/testplugin/patrons/<:patron_id>/bother'}, 'Route exists' );
76 $schema->storage->txn_rollback;
79 subtest 'Disabled plugins tests' => sub {
83 $schema->storage->txn_begin;
86 t::lib::Mocks::mock_config( 'enable_plugins', 1 );
87 t::lib::Mocks::mock_preference( 'UseKohaPlugins', 1 );
91 my $plugins = Koha::Plugins->new;
92 $plugins->InstallPlugins;
94 my @plugins = $plugins->GetPlugins( { all => 1 } );
95 foreach my $plugin (@plugins) {
97 $good_plugin = $plugin
98 if $plugin->{metadata}->{description} eq 'Test plugin';
101 # initialize Koha::REST::V1 after mocking
102 my $t = Test::Mojo->new('Koha::REST::V1');
104 my $routes = get_defined_routes($t);
105 # Support placeholders () and <> (latter style used starting with Mojolicious::Plugin::OpenAPI@1.28)
106 # TODO: remove () if minimum version is bumped to at least 1.28.
107 ok( !exists $routes->{'/contrib/testplugin/patrons/(:patron_id)/bother'} && !exists $routes->{'/contrib/testplugin/patrons/<:patron_id>/bother'},
108 'Plugin disabled, route not defined' );
110 $good_plugin->enable;
112 $t = Test::Mojo->new('Koha::REST::V1');
113 $routes = get_defined_routes($t);
115 # Support placeholders () and <> (latter style used starting with Mojolicious::Plugin::OpenAPI@1.28)
116 # TODO: remove () if minimum version is bumped to at least 1.28.
117 ok( exists $routes->{'/contrib/testplugin/patrons/(:patron_id)/bother'} || exists $routes->{'/contrib/testplugin/patrons/<:patron_id>/bother'},
118 'Plugin enabled, route defined' );
120 $schema->storage->txn_rollback;
123 sub get_defined_routes {
126 traverse_routes( $_, 0, $routes ) for @{ $t->app->routes->children };
131 sub traverse_routes {
132 my ( $route, $depth, $routes ) = @_;
135 my $path = $route->pattern->unparsed || '/';
138 my $via = $route->via;
139 my $verb = !$via ? '*' : uc join ',', @$via;
140 $routes->{$path}->{$verb} = 1;
143 traverse_routes( $_, $depth, $routes ) for @{ $route->children };