From ed84970fa429e5cf2d5aecbf01d9f093e7bb71ac Mon Sep 17 00:00:00 2001 From: Matt Blenkinsop Date: Thu, 19 Dec 2024 16:16:31 +0000 Subject: [PATCH] Bug 38290: Add unit tests prove t/db_dependent/Koha/*/Limit/LibraryGroup.t --- Koha/Object/Limit/LibraryGroup.pm | 9 +- .../Koha/Object/Limit/LibraryGroup.t | 103 +++++++++++ .../Koha/Objects/Limit/LibraryGroup.t | 169 ++++++++++++++++++ 3 files changed, 279 insertions(+), 2 deletions(-) create mode 100755 t/db_dependent/Koha/Object/Limit/LibraryGroup.t create mode 100755 t/db_dependent/Koha/Objects/Limit/LibraryGroup.t diff --git a/Koha/Object/Limit/LibraryGroup.pm b/Koha/Object/Limit/LibraryGroup.pm index ad3f15e67cf..3e366d315d2 100644 --- a/Koha/Object/Limit/LibraryGroup.pm +++ b/Koha/Object/Limit/LibraryGroup.pm @@ -53,7 +53,7 @@ A method that can be used to embed or simply retrieve the library group limits f sub lib_group_limits { my ($self) = @_; - my $lib_group_visibility_parameters = $self->object_class()->_library_group_visibility_parameters; + my $lib_group_visibility_parameters = $self->_library_group_visibility_parameters; my $visibility_column = $lib_group_visibility_parameters->{visibility_column}; my $lib_group_visibility = $self->$visibility_column; @@ -78,9 +78,14 @@ sub set_lib_group_visibility { my ( $self, $args ) = @_; my $new_visibility = $args->{new_visibility} || $self->lib_group_visibility; - my $lib_group_visibility_parameters = $self->object_class()->_library_group_visibility_parameters; + my $lib_group_visibility_parameters = $self->_library_group_visibility_parameters; my $visibility_column = $lib_group_visibility_parameters->{visibility_column}; + if ( !$new_visibility ) { + $self->$visibility_column(undef); + return $self; + } + if ( ref $new_visibility eq 'ARRAY' ) { if ( scalar( @{$new_visibility} ) == 0 ) { $self->$visibility_column(undef); diff --git a/t/db_dependent/Koha/Object/Limit/LibraryGroup.t b/t/db_dependent/Koha/Object/Limit/LibraryGroup.t new file mode 100755 index 00000000000..cec76df19ec --- /dev/null +++ b/t/db_dependent/Koha/Object/Limit/LibraryGroup.t @@ -0,0 +1,103 @@ +#!/usr/bin/perl + +# This file is part of Koha. +# +# Copyright PTFS Europe 2024 +# +# 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 => 2; +use t::lib::TestBuilder; + +my $builder = t::lib::TestBuilder->new; +my $schema = Koha::Database->schema; + +subtest 'set_lib_group_visibility' => sub { + plan tests => 3; + + $schema->txn_begin; + + my $root_group1 = Koha::Library::Group->new( + { + title => "LibGroup1", + } + )->store(); + + my $lg1groupA = + Koha::Library::Group->new( { parent_id => $root_group1->id, title => 'LibGroup1 SubGroupA' } )->store(); + my $lg1groupA1 = + Koha::Library::Group->new( { parent_id => $lg1groupA->id, title => 'LibGroup1 SubGroupA SubGroup1' } )->store(); + my $lg1groupB = + Koha::Library::Group->new( { parent_id => $root_group1->id, title => 'LibGroup1 SubGroupB' } )->store(); + + my $vendor = $builder->build_object( + { class => 'Koha::Acquisition::Booksellers', value => { lib_group_visibility => undef } } ); + + # Pass in an array + my @vendor_lib_groups = ( $lg1groupA->id, $lg1groupB->id ); + $vendor->set_lib_group_visibility( { new_visibility => \@vendor_lib_groups } ); + is( + $vendor->lib_group_visibility, "|" . join( '|', @vendor_lib_groups ) . "|", + 'Got correct lib group visibility' + ); + + # Update with another array + @vendor_lib_groups = ( $lg1groupA1->id, $lg1groupB->id ); + $vendor->set_lib_group_visibility( { new_visibility => \@vendor_lib_groups } ); + is( + $vendor->lib_group_visibility, "|" . join( '|', @vendor_lib_groups ) . "|", + 'Got correct lib group visibility' + ); + + # Use the call in the object's "store" method + $vendor->lib_group_visibility( "|" . $lg1groupA->id . "|" )->store; + is( + $vendor->lib_group_visibility, "|" . $lg1groupA->id . "|", + 'Lib group visibility has been overridden correctly' + ); + + $schema->txn_rollback; +}; + +subtest 'lib_group_limits' => sub { + plan tests => 2; + + $schema->txn_begin; + + my $root_group1 = Koha::Library::Group->new( + { + title => "LibGroup1", + } + )->store(); + + my $lg1groupA = + Koha::Library::Group->new( { parent_id => $root_group1->id, title => 'LibGroup1 SubGroupA' } )->store(); + my $lg1groupB = + Koha::Library::Group->new( { parent_id => $root_group1->id, title => 'LibGroup1 SubGroupB' } )->store(); + + my $vendor = $builder->build_object( + { class => 'Koha::Acquisition::Booksellers', value => { lib_group_visibility => undef } } ); + + my @vendor_lib_groups = ( $lg1groupA->id, $lg1groupB->id ); + $vendor->set_lib_group_visibility( { new_visibility => \@vendor_lib_groups } ); + + my $lib_groups = $vendor->lib_group_limits; + + is( scalar(@$lib_groups), 2, 'Got correct number of lib groups' ); + my @ids = sort { $a <=> $b } map { $_->id } @$lib_groups; + is( join( '|', @ids ), join( '|', @vendor_lib_groups ), 'Got correct lib groups' ); + + $schema->txn_rollback; +}; diff --git a/t/db_dependent/Koha/Objects/Limit/LibraryGroup.t b/t/db_dependent/Koha/Objects/Limit/LibraryGroup.t new file mode 100755 index 00000000000..9156f747318 --- /dev/null +++ b/t/db_dependent/Koha/Objects/Limit/LibraryGroup.t @@ -0,0 +1,169 @@ +#!/usr/bin/perl + +# This file is part of Koha. +# +# Copyright PTFS Europe 2024 +# +# 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 t::lib::TestBuilder; +use t::lib::Mocks; + +my $builder = t::lib::TestBuilder->new; +my $schema = Koha::Database->schema; + +subtest 'define_library_group_limits' => sub { + plan tests => 8; + + $schema->txn_begin; + + Koha::Acquisition::Baskets->delete; + Koha::Acquisition::Booksellers->delete; + + my $library1 = $builder->build_object( { class => 'Koha::Libraries' } ); + my $library2 = $builder->build_object( { class => 'Koha::Libraries' } ); + my $library3 = $builder->build_object( { class => 'Koha::Libraries' } ); + my $library4 = $builder->build_object( { class => 'Koha::Libraries' } ); + + # Group 1 - two sub groups: A, B. Sub group A then has two sub groups: A1, A2 + my $root_group1 = Koha::Library::Group->new( + { + title => "LibGroup1", + } + )->store(); + + my $lg1groupA = + Koha::Library::Group->new( { parent_id => $root_group1->id, title => 'LibGroup1 SubGroupA' } )->store(); + my $lg1groupA1 = + Koha::Library::Group->new( { parent_id => $lg1groupA->id, title => 'LibGroup1 SubGroupA SubGroup1' } )->store(); + my $lg1groupA2 = + Koha::Library::Group->new( { parent_id => $lg1groupA->id, title => 'LibGroup1 SubGroupA SubGroup2' } )->store(); + my $lg1groupB = + Koha::Library::Group->new( { parent_id => $root_group1->id, title => 'LibGroup1 SubGroupB' } )->store(); + + my $lg1groupA_library1 = + Koha::Library::Group->new( { parent_id => $lg1groupA->id, branchcode => $library1->branchcode } )->store(); + my $lg1groupA_library2 = + Koha::Library::Group->new( { parent_id => $lg1groupA->id, branchcode => $library2->branchcode } )->store(); + my $lg1groupB_library1 = + Koha::Library::Group->new( { parent_id => $lg1groupB->id, branchcode => $library1->branchcode } )->store(); + my $lg1groupA1_library1 = + Koha::Library::Group->new( { parent_id => $lg1groupA1->id, branchcode => $library2->branchcode } )->store(); + my $lg1groupA2_library1 = + Koha::Library::Group->new( { parent_id => $lg1groupA2->id, branchcode => $library1->branchcode } )->store(); + + # Group 2 - three sub groups: A, B, C. Sub group A then has two sub groups: A1, A2 and sub group C has two: C1, C2 + my $root_group2 = Koha::Library::Group->new( + { + title => "LibGroup2", + } + )->store(); + + my $lg2groupA = + Koha::Library::Group->new( { parent_id => $root_group2->id, title => 'LibGroup2 SubGroupA' } )->store(); + my $lg2groupA1 = + Koha::Library::Group->new( { parent_id => $lg2groupA->id, title => 'LibGroup2 SubGroupA SubGroup1' } )->store(); + my $lg2groupA2 = + Koha::Library::Group->new( { parent_id => $lg2groupA->id, title => 'LibGroup2 SubGroupA SubGroup2' } )->store(); + my $lg2groupB = + Koha::Library::Group->new( { parent_id => $root_group2->id, title => 'LibGroup2 SubGroupB' } )->store(); + my $lg2groupC = + Koha::Library::Group->new( { parent_id => $root_group2->id, title => 'LibGroup2 SubGroupC' } )->store(); + my $lg2groupC1 = + Koha::Library::Group->new( { parent_id => $lg2groupC->id, title => 'LibGroup2 SubGroupC SubGroup1' } )->store(); + my $lg2groupC2 = + Koha::Library::Group->new( { parent_id => $lg2groupC->id, title => 'LibGroup2 SubGroupC SubGroup2' } )->store(); + + my $lg2groupA_library1 = + Koha::Library::Group->new( { parent_id => $lg2groupA->id, branchcode => $library1->branchcode } )->store(); + my $lg2groupA_library2 = + Koha::Library::Group->new( { parent_id => $lg2groupA->id, branchcode => $library3->branchcode } )->store(); + my $lg2groupB_library1 = + Koha::Library::Group->new( { parent_id => $lg2groupB->id, branchcode => $library1->branchcode } )->store(); + my $lg2groupC_library1 = + Koha::Library::Group->new( { parent_id => $lg2groupC->id, branchcode => $library1->branchcode } )->store(); + my $lg2groupC_library2 = + Koha::Library::Group->new( { parent_id => $lg2groupC->id, branchcode => $library3->branchcode } )->store(); + my $lg2groupC_library3 = + Koha::Library::Group->new( { parent_id => $lg2groupC->id, branchcode => $library4->branchcode } )->store(); + my $lg2groupA1_library1 = + Koha::Library::Group->new( { parent_id => $lg2groupA1->id, branchcode => $library3->branchcode } )->store(); + my $lg2groupA2_library1 = + Koha::Library::Group->new( { parent_id => $lg2groupA2->id, branchcode => $library1->branchcode } )->store(); + my $lg2groupC1_library1 = + Koha::Library::Group->new( { parent_id => $lg2groupC1->id, branchcode => $library3->branchcode } )->store(); + my $lg2groupC2_library1 = + Koha::Library::Group->new( { parent_id => $lg2groupC2->id, branchcode => $library1->branchcode } )->store(); + my $lg2groupC2_library2 = + Koha::Library::Group->new( { parent_id => $lg2groupC2->id, branchcode => $library4->branchcode } )->store(); + + my $vendor1 = $builder->build_object( + { + class => 'Koha::Acquisition::Booksellers', value => { lib_group_visibility => "|" . $root_group1->id . "|" } + } + ); + my $vendor2 = $builder->build_object( + { + class => 'Koha::Acquisition::Booksellers', value => { lib_group_visibility => "|" . $root_group2->id . "|" } + } + ); + + t::lib::Mocks::mock_userenv( { branchcode => $library1->branchcode } ); + my $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( scalar(@$vendors), 2, "Two vendors returned" ); + + t::lib::Mocks::mock_userenv( { branchcode => $library2->branchcode } ); + $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( scalar(@$vendors), 1, "One vendor returned as library2 is not in root_group2" ); + + my $vendor3 = $builder->build_object( + { class => 'Koha::Acquisition::Booksellers', value => { lib_group_visibility => "|" . $lg2groupA->id . "|" } } + ); + $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( scalar(@$vendors), 1, "Still only one vendor returned as library2 is not in root_group2 or lg2groupA" ); + + t::lib::Mocks::mock_userenv( { branchcode => $library3->branchcode } ); + $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( scalar(@$vendors), 2, "Two vendors now returned as library3 is in lg2groupA and root_group2" ); + + my $vendor4 = $builder->build_object( + { class => 'Koha::Acquisition::Booksellers', value => { lib_group_visibility => "|" . $lg2groupB->id . "|" } } + ); + $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( + scalar(@$vendors), 2, + "Still two vendors returned as library3 is in lg2groupA and root_group2 but not lg2groupB" + ); + + t::lib::Mocks::mock_userenv( { branchcode => $library4->branchcode } ); + $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( + scalar(@$vendors), 1, + "One vendor returned as library2 is only in root_group2 but not the previously assigned sub groups" + ); + $vendor2->lib_group_visibility( "|" . $root_group1->id . "|" )->store; + $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( scalar(@$vendors), 0, "No vendors returned as none are visible to this branch code" ); + + $vendor2->lib_group_visibility(undef)->store; + $vendors = Koha::Acquisition::Booksellers->search()->as_list; + is( + scalar(@$vendors), 1, + "One vendor returned as its lib_group_visibility is now undefined and so is visible to all" + ); + + $schema->txn_rollback; +}; -- 2.39.5 (Apple Git-154)