From 5cb63d617d10c4b58dafde2460cb857d9f662d6b Mon Sep 17 00:00:00 2001
From: Agustin Moyano <agustinmoyano@theke.io>
Date: Fri, 9 Oct 2020 09:59:46 -0300
Subject: [PATCH] Bug 26635: Add tests

Add tests in t/db_dependent/Koha/Object.t and
t/db_dependent/Koha/REST/Plugin/Objects.t

Sponsored-by: Virginia Polytechnic Institute and State University

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Andrew Fuerste-Henry <andrew@bywatersolutions.com>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
---
 t/db_dependent/Koha/Object.t              |  43 ++++-
 t/db_dependent/Koha/REST/Plugin/Objects.t | 206 +++++++++++++++++++++-
 2 files changed, 241 insertions(+), 8 deletions(-)

diff --git a/t/db_dependent/Koha/Object.t b/t/db_dependent/Koha/Object.t
index b78283ce25..b9c27665d4 100755
--- a/t/db_dependent/Koha/Object.t
+++ b/t/db_dependent/Koha/Object.t
@@ -17,7 +17,7 @@
 
 use Modern::Perl;
 
-use Test::More tests => 21;
+use Test::More tests => 22;
 use Test::Exception;
 use Test::Warn;
 use DateTime;
@@ -33,6 +33,8 @@ use Koha::DateUtils qw( dt_from_string );
 use Koha::Libraries;
 use Koha::Patrons;
 use Koha::ApiKeys;
+use Koha::AuthorisedValueCategories;
+use Koha::AuthorisedValues;
 
 use JSON;
 use Scalar::Util qw( isvstring );
@@ -896,5 +898,44 @@ subtest 'messages() and add_message() tests' => sub {
     isnt( $patron->messages, undef, '->messages initializes the array if required' );
     is( scalar @{ $patron->messages }, 0, '->messages returns an empty arrayref' );
 
+    $schema->storage->txn_rollback;
+};
+
+subtest 'Authorised values expansion' => sub {
+    plan tests => 4;
+
+    $schema->storage->txn_begin;
+
+    Koha::AuthorisedValues->search({category => 'Countries'})->delete;
+    Koha::AuthorisedValueCategories->search({category_name =>'Countries'})->delete;
+
+    my $cat = $builder->build_object({ class => 'Koha::AuthorisedValueCategories', value => {category_name =>'Countries'} });
+    my $fr = $builder->build_object({ class => 'Koha::AuthorisedValues', value => {authorised_value => 'FR', lib=>'France', category=>$cat->category_name} });
+    my $us = $builder->build_object({ class => 'Koha::AuthorisedValues', value => {authorised_value => 'US', lib=>'United States of America', category=>$cat->category_name} });
+    my $ar = $builder->build_object({ class => 'Koha::AuthorisedValues', value => {authorised_value => 'AR', lib=>'Argentina', category=>$cat->category_name} });
+
+    my $city_class = Test::MockModule->new('Koha::City');
+    $city_class->mock( '_fetch_authorised_values',
+        sub {
+            my ($self) = @_;
+            use Koha::AuthorisedValues;
+            my $av = Koha::AuthorisedValues->find({authorised_value => $self->city_country, category => 'Countries'});
+            return {country => $av->unblessed};
+        }
+    );
+
+    my $marseille = $builder->build_object({ class => 'Koha::Cities', value => {city_country => 'FR', city_name => 'Marseille'} });
+    my $cordoba = $builder->build_object({ class => 'Koha::Cities', value => {city_country => 'AR', city_name => 'Córdoba'} });
+
+    my $mobj = $marseille->to_api({av_expand => 1});
+    my $cobj = $cordoba->to_api({av_expand => 1});
+
+    isnt($mobj->{_authorised_values}, undef, '_authorised_values exists for Marseille');
+    isnt($cobj->{_authorised_values}, undef, '_authorised_values exists for Córdoba');
+
+    is($mobj->{_authorised_values}->{country}->{lib}, $fr->lib, 'Authorised value for country expanded');
+    is($cobj->{_authorised_values}->{country}->{lib}, $ar->lib, 'Authorised value for country expanded');
+
+
     $schema->storage->txn_rollback;
 };
diff --git a/t/db_dependent/Koha/REST/Plugin/Objects.t b/t/db_dependent/Koha/REST/Plugin/Objects.t
index e85a57f78d..8e7b5d569d 100755
--- a/t/db_dependent/Koha/REST/Plugin/Objects.t
+++ b/t/db_dependent/Koha/REST/Plugin/Objects.t
@@ -20,6 +20,8 @@ use Modern::Perl;
 use Koha::Acquisition::Orders;
 use Koha::Cities;
 use Koha::Biblios;
+use Koha::AuthorisedValueCategories;
+use Koha::AuthorisedValues;
 
 # Dummy app for testing the plugin
 use Mojolicious::Lite;
@@ -80,7 +82,7 @@ get '/biblios' => sub {
 };
 
 # The tests
-use Test::More tests => 12;
+use Test::More tests => 14;
 use Test::Mojo;
 
 use t::lib::Mocks;
@@ -348,7 +350,7 @@ subtest 'objects.search helper, embed' => sub {
     $schema->storage->txn_rollback;
 };
 
-subtest 'object.search helper with query parameter' => sub {
+subtest 'objects.search helper with query parameter' => sub {
     plan tests => 4;
 
     $schema->storage->txn_begin;
@@ -372,7 +374,7 @@ subtest 'object.search helper with query parameter' => sub {
     $schema->storage->txn_rollback;
 };
 
-subtest 'object.search helper with q parameter' => sub {
+subtest 'objects.search helper with q parameter' => sub {
     plan tests => 4;
 
     $schema->storage->txn_begin;
@@ -396,7 +398,7 @@ subtest 'object.search helper with q parameter' => sub {
     $schema->storage->txn_rollback;
 };
 
-subtest 'object.search helper with x-koha-query header' => sub {
+subtest 'objects.search helper with x-koha-query header' => sub {
     plan tests => 4;
 
     $schema->storage->txn_begin;
@@ -420,7 +422,7 @@ subtest 'object.search helper with x-koha-query header' => sub {
     $schema->storage->txn_rollback;
 };
 
-subtest 'object.search helper with all query methods' => sub {
+subtest 'objects.search helper with all query methods' => sub {
     plan tests => 6;
 
     $schema->storage->txn_begin;
@@ -447,8 +449,7 @@ subtest 'object.search helper with all query methods' => sub {
     $schema->storage->txn_rollback;
 };
 
-subtest 'object.search helper order by embedded columns' => sub {
-
+subtest 'objects.search helper order by embedded columns' => sub {
     plan tests => 3;
 
     $schema->storage->txn_begin;
@@ -512,3 +513,194 @@ subtest 'objects.find helper, embed' => sub {
 
     $schema->storage->txn_rollback;
 };
+
+subtest 'objects.find helper with expanded authorised values' => sub {
+    plan tests => 10;
+
+    $schema->storage->txn_begin;
+
+    my $t = Test::Mojo->new;
+
+    Koha::AuthorisedValues->search( { category => 'Countries' } )->delete;
+    Koha::AuthorisedValueCategories->search( { category_name => 'Countries' } )
+      ->delete;
+
+    my $cat = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValueCategories',
+            value => { category_name => 'Countries' }
+        }
+    );
+    my $fr = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValues',
+            value => {
+                authorised_value => 'FR',
+                lib              => 'France',
+                category         => $cat->category_name
+            }
+        }
+    );
+    my $us = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValues',
+            value => {
+                authorised_value => 'US',
+                lib              => 'United States of America',
+                category         => $cat->category_name
+            }
+        }
+    );
+    my $ar = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValues',
+            value => {
+                authorised_value => 'AR',
+                lib              => 'Argentina',
+                category         => $cat->category_name
+            }
+        }
+    );
+
+    my $city_class = Test::MockModule->new('Koha::City');
+    $city_class->mock(
+        '_fetch_authorised_values',
+        sub {
+            my ($self) = @_;
+            use Koha::AuthorisedValues;
+            my $av = Koha::AuthorisedValues->find(
+                {
+                    authorised_value => $self->city_country,
+                    category         => 'Countries'
+                }
+            );
+            return { country => $av->unblessed };
+        }
+    );
+
+    my $manuel = $builder->build_object(
+        {
+            class => 'Koha::Cities',
+            value => {
+                city_name    => 'Manuel',
+                city_country => 'AR'
+            }
+        }
+    );
+    my $manuela = $builder->build_object(
+        {
+            class => 'Koha::Cities',
+            value => {
+                city_name    => 'Manuela',
+                city_country => 'US'
+            }
+        }
+    );
+
+    $t->get_ok( '/cities/' . $manuel->cityid => { 'x-koha-av-expand' => 1 } )
+      ->status_is(200)->json_is( '/name' => 'Manuel' )
+      ->json_has('/_authorised_values')
+      ->json_is( '/_authorised_values/country/lib' => $ar->lib );
+
+    $t->get_ok( '/cities/' . $manuela->cityid => { 'x-koha-av-expand' => 1 } )
+      ->status_is(200)->json_is( '/name' => 'Manuela' )
+      ->json_has('/_authorised_values')
+      ->json_is( '/_authorised_values/country/lib' => $us->lib );
+
+    $schema->storage->txn_rollback;
+};
+
+subtest 'objects.search helper with expanded authorised values' => sub {
+
+    plan tests => 11;
+
+    my $t = Test::Mojo->new;
+
+    $schema->storage->txn_begin;
+
+    Koha::AuthorisedValues->search( { category => 'Countries' } )->delete;
+    Koha::AuthorisedValueCategories->search( { category_name => 'Countries' } )
+      ->delete;
+
+    my $cat = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValueCategories',
+            value => { category_name => 'Countries' }
+        }
+    );
+    my $fr = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValues',
+            value => {
+                authorised_value => 'FR',
+                lib              => 'France',
+                category         => $cat->category_name
+            }
+        }
+    );
+    my $us = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValues',
+            value => {
+                authorised_value => 'US',
+                lib              => 'United States of America',
+                category         => $cat->category_name
+            }
+        }
+    );
+    my $ar = $builder->build_object(
+        {
+            class => 'Koha::AuthorisedValues',
+            value => {
+                authorised_value => 'AR',
+                lib              => 'Argentina',
+                category         => $cat->category_name
+            }
+        }
+    );
+
+    my $city_class = Test::MockModule->new('Koha::City');
+    $city_class->mock(
+        '_fetch_authorised_values',
+        sub {
+            my ($self) = @_;
+            use Koha::AuthorisedValues;
+            my $av = Koha::AuthorisedValues->find(
+                {
+                    authorised_value => $self->city_country,
+                    category         => 'Countries'
+                }
+            );
+            return { country => $av->unblessed };
+        }
+    );
+
+    $builder->build_object(
+        {
+            class => 'Koha::Cities',
+            value => {
+                city_name    => 'Manuel',
+                city_country => 'AR'
+            }
+        }
+    );
+    $builder->build_object(
+        {
+            class => 'Koha::Cities',
+            value => {
+                city_name    => 'Manuela',
+                city_country => 'US'
+            }
+        }
+    );
+
+    $t->get_ok( '/cities?name=manuel&_per_page=4&_page=1&_match=starts_with' =>
+          { 'x-koha-av-expand' => 1 } )->status_is(200)->json_has('/0')
+      ->json_has('/1')->json_hasnt('/2')->json_is( '/0/name' => 'Manuel' )
+      ->json_has('/0/_authorised_values')
+      ->json_is( '/0/_authorised_values/country/lib' => $ar->lib )
+      ->json_is( '/1/name' => 'Manuela' )->json_has('/1/_authorised_values')
+      ->json_is( '/1/_authorised_values/country/lib' => $us->lib );
+
+    $schema->storage->txn_rollback;
+};
-- 
2.24.3 (Apple Git-128)