From 07dd7a5d885cf9a15db01e62200457bc9a2b93b7 Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Sun, 26 Jul 2015 02:05:16 -0300 Subject: [PATCH] Bug 14598: (regression tests) AddReturn should store itemtype on 'statistics' table This patch adds tests for C4::Circulation::AddReturn(). Both tests are wrapped inside a subtest, and look for AddReturn storing the right itemtype on the 'statistics' table. Note: It also refactors the file a bit, to avoid side effects. And uses TestBuilder to make it independent on already-present db data. It also removes warnings by mocking C4::Context::userenv To test: - Apply the patch - Run the tests: $ prove t/db_dependent/Circulation/Returns.t => FAIL: Tests fail bacause AddReturn is not storing the itemtype - Sign off :-D Sponsored-by: Universidad Empresarial Siglo 21 Signed-off-by: Kyle M Hall Signed-off-by: Tomas Cohen Arazi --- t/db_dependent/Circulation/Returns.t | 279 ++++++++++++++++++++++++++++++----- 1 file changed, 238 insertions(+), 41 deletions(-) diff --git a/t/db_dependent/Circulation/Returns.t b/t/db_dependent/Circulation/Returns.t index bbc96a4..75cf63b 100644 --- a/t/db_dependent/Circulation/Returns.t +++ b/t/db_dependent/Circulation/Returns.t @@ -1,58 +1,255 @@ +#!/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 => 2; + +use Test::More tests => 3; +use Test::MockModule; +use t::lib::TestBuilder; use t::lib::Mocks; use C4::Biblio; use C4::Circulation; use C4::Items; +use C4::ItemType; use C4::Members; use Koha::Database; use Koha::DateUtils; - -use t::lib::TestBuilder; +use Koha::Items; use MARC::Record; +use MARC::Field; -*C4::Context::userenv = \&Mock_userenv; +# Mock userenv, used by AddIssue +my $branch; +my $context = Test::MockModule->new('C4::Context'); +$context->mock( 'userenv', sub { + return { branch => $branch } +}); my $schema = Koha::Database->schema; $schema->storage->txn_begin; -my $builder = t::lib::TestBuilder->new; -my $library = $builder->build({ - source => 'Branch', -}); +my $builder = t::lib::TestBuilder->new(); + +subtest "InProcessingToShelvingCart tests" => sub { + + plan tests => 2; + + $branch = $builder->build({ source => 'Branch' })->{ branchcode }; + my $permanent_location = 'TEST'; + my $location = 'PROC'; + + # Create a biblio record with biblio-level itemtype + my $record = MARC::Record->new(); + my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $record, '' ); + my $built_item = $builder->build({ + source => 'Item', + value => { + biblionumber => $biblionumber, + homebranch => $branch, + holdingbranch => $branch, + location => $location, + permanent_location => $permanent_location + } + }); + my $barcode = $built_item->{ barcode }; + my $itemnumber = $built_item->{ itemnumber }; + my $item; + + C4::Context->set_preference( "InProcessingToShelvingCart", 1 ); + AddReturn( $barcode, $branch ); + $item = GetItem( $itemnumber ); + is( $item->{location}, 'CART', + "InProcessingToShelvingCart functions as intended" ); + + $item->{location} = $location; + ModItem( $item, undef, $itemnumber ); + + C4::Context->set_preference( "InProcessingToShelvingCart", 0 ); + AddReturn( $barcode, $branch ); + $item = GetItem( $itemnumber ); + is( $item->{location}, $permanent_location, + "InProcessingToShelvingCart functions as intended" ); +}; + + +subtest "AddReturn logging on statistics table (item-level_itypes=1)" => sub { + + plan tests => 2; + + # Set item-level item types + C4::Context->set_preference( "item-level_itypes", 1 ); + + # Make sure logging is enabled + C4::Context->set_preference( "IssueLog", 1 ); + C4::Context->set_preference( "ReturnLog", 1 ); + + # Create an itemtype for biblio-level item type + my $blevel_itemtype = $builder->build({ source => 'Itemtype' })->{ itemtype }; + # Create an itemtype for item-level item type + my $ilevel_itemtype = $builder->build({ source => 'Itemtype' })->{ itemtype }; + # Create a branch + $branch = $builder->build({ source => 'Branch' })->{ branchcode }; + # Create a borrower + my $borrowernumber = $builder->build({ + source => 'Borrower', + value => { branchcode => $branch } + })->{ borrowernumber }; + # Look for the defined MARC field for biblio-level itemtype + my $rs = $schema->resultset('MarcSubfieldStructure')->search({ + frameworkcode => '', + kohafield => 'biblioitems.itemtype' + }); + my $tagfield = $rs->first->tagfield; + my $tagsubfield = $rs->first->tagsubfield; + + # Create a biblio record with biblio-level itemtype + my $record = MARC::Record->new(); + $record->append_fields( + MARC::Field->new($tagfield,'','', $tagsubfield => $blevel_itemtype ) + ); + my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $record, '' ); + my $item_with_itemtype = $builder->build({ + source => 'Item', + value => { + biblionumber => $biblionumber, + homebranch => $branch, + holdingbranch => $branch, + itype => $ilevel_itemtype + } + }); + my $item_without_itemtype = $builder->build({ + source => 'Item', + value => { + biblionumber => $biblionumber, + homebranch => $branch, + holdingbranch => $branch, + itype => undef + } + }); + + my $borrower = GetMember( borrowernumber => $borrowernumber ); + AddIssue( $borrower, $item_with_itemtype->{ barcode } ); + AddReturn( $item_with_itemtype->{ barcode }, $branch ); + # Test item-level itemtype was recorded on the 'statistics' table + my $stat = $schema->resultset('Statistic')->search({ + branch => $branch, + type => 'return', + itemnumber => $item_with_itemtype->{ itemnumber } + }, { order_by => { -asc => 'datetime' } })->next(); + + is( $stat->itemtype, $ilevel_itemtype, + "item-level itype recorded on statistics for return"); + + AddIssue( $borrower, $item_without_itemtype->{ barcode } ); + AddReturn( $item_without_itemtype->{ barcode }, $branch ); + # Test biblio-level itemtype was recorded on the 'statistics' table + $stat = $schema->resultset('Statistic')->search({ + branch => $branch, + type => 'return', + itemnumber => $item_without_itemtype->{ itemnumber } + }, { order_by => { -asc => 'datetime' } })->next(); + + is( $stat->itemtype, $blevel_itemtype, + "biblio-level itype recorded on statistics for return as a fallback for null item-level itype"); + +}; + +subtest "AddReturn logging on statistics table (item-level_itypes=0)" => sub { + + plan tests => 2; + + # Make sure logging is enabled + C4::Context->set_preference( "IssueLog", 1 ); + C4::Context->set_preference( "ReturnLog", 1 ); + + # Set item-level item types + C4::Context->set_preference( "item-level_itypes", 0 ); + + # Create an itemtype for biblio-level item type + my $blevel_itemtype = $builder->build({ source => 'Itemtype' })->{ itemtype }; + # Create an itemtype for item-level item type + my $ilevel_itemtype = $builder->build({ source => 'Itemtype' })->{ itemtype }; + # Create a branch + $branch = $builder->build({ source => 'Branch' })->{ branchcode }; + # Create a borrower + my $borrowernumber = $builder->build({ + source => 'Borrower', + value => { branchcode => $branch } + })->{ borrowernumber }; + # Look for the defined MARC field for biblio-level itemtype + my $rs = $schema->resultset('MarcSubfieldStructure')->search({ + frameworkcode => '', + kohafield => 'biblioitems.itemtype' + }); + my $tagfield = $rs->first->tagfield; + my $tagsubfield = $rs->first->tagsubfield; + + # Create a biblio record with biblio-level itemtype + my $record = MARC::Record->new(); + $record->append_fields( + MARC::Field->new($tagfield,'','', $tagsubfield => $blevel_itemtype ) + ); + my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $record, '' ); + my $item_with_itemtype = $builder->build({ + source => 'Item', + value => { + biblionumber => $biblionumber, + homebranch => $branch, + holdingbranch => $branch, + itype => $ilevel_itemtype + } + }); + my $item_without_itemtype = $builder->build({ + source => 'Item', + value => { + biblionumber => $biblionumber, + homebranch => $branch, + holdingbranch => $branch, + itype => undef + } + }); + + my $borrower = GetMember( borrowernumber => $borrowernumber ); + + AddIssue( $borrower, $item_with_itemtype->{ barcode } ); + AddReturn( $item_with_itemtype->{ barcode }, $branch ); + # Test item-level itemtype was recorded on the 'statistics' table + my $stat = $schema->resultset('Statistic')->search({ + branch => $branch, + type => 'return', + itemnumber => $item_with_itemtype->{ itemnumber } + }, { order_by => { -asc => 'datetime' } })->next(); + + is( $stat->itemtype, $blevel_itemtype, + "biblio-level itype recorded on statistics for return"); + + AddIssue( $borrower, $item_without_itemtype->{ barcode } ); + AddReturn( $item_without_itemtype->{ barcode }, $branch ); + # Test biblio-level itemtype was recorded on the 'statistics' table + $stat = $schema->resultset('Statistic')->search({ + branch => $branch, + type => 'return', + itemnumber => $item_without_itemtype->{ itemnumber } + }, { order_by => { -asc => 'datetime' } })->next(); + + is( $stat->itemtype, $blevel_itemtype, + "biblio-level itype recorded on statistics for return"); +}; -my $record = MARC::Record->new(); -my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $record, '' ); - -my ( undef, undef, $itemnumber ) = AddItem( - { - homebranch => $library->{branchcode}, - holdingbranch => $library->{branchcode}, - barcode => 'i_dont_exist', - location => 'PROC', - permanent_location => 'TEST' - }, - $biblionumber -); - -my $item; - -t::lib::Mocks::mock_preference( "InProcessingToShelvingCart", 1 ); -AddReturn( 'i_dont_exist', $library->{branchcode} ); -$item = GetItem($itemnumber); -is( $item->{location}, 'CART', "InProcessingToShelvingCart functions as intended" ); - -$item->{location} = 'PROC'; -ModItem( $item, undef, $itemnumber ); - -t::lib::Mocks::mock_preference( "InProcessingToShelvingCart", 0 ); -AddReturn( 'i_dont_exist', $library->{branchcode} ); -$item = GetItem($itemnumber); -is( $item->{location}, 'TEST', "InProcessingToShelvingCart functions as intended" ); - -# C4::Context->userenv -sub Mock_userenv { - return { branch => $library->{branchcode} }; -} +1; -- 2.7.4