Bugzilla – Attachment 186443 Details for
Bug 40808
Consider a link table for accountlines to varying other Koha tables
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 40808: Add REST API unit tests for holds debits embedding
Bug-40808-Add-REST-API-unit-tests-for-holds-debits.patch (text/plain), 10.62 KB, created by
Martin Renvoize (ashimema)
on 2025-09-15 18:00:53 UTC
(
hide
)
Description:
Bug 40808: Add REST API unit tests for holds debits embedding
Filename:
MIME Type:
Creator:
Martin Renvoize (ashimema)
Created:
2025-09-15 18:00:53 UTC
Size:
10.62 KB
patch
obsolete
>From a7a2f602235b4ef938280a3f02eb4144da49be07 Mon Sep 17 00:00:00 2001 >From: Martin Renvoize <martin.renvoize@openfifth.co.uk> >Date: Mon, 15 Sep 2025 16:38:39 +0100 >Subject: [PATCH] Bug 40808: Add REST API unit tests for holds debits embedding > >Adds comprehensive API unit tests for the debits embedding functionality >in the holds REST API endpoints. > >The tests verify: >1. GET /holds without embedding - should not include debits field >2. GET /holds with debits embedding - should include linked charges >3. GET /holds with empty debits - should return empty array when no fees linked > >Note: Currently the API embedding tests fail with 500 errors due to issues >in the REST API framework's automatic embedding mechanism, though the >underlying Hold.debits() method and to_api() functionality works correctly >when tested directly. > >Also improves the Hold.debits() method to properly filter for debit-only >account lines (excluding credits). >--- > Koha/Hold.pm | 7 +- > t/db_dependent/api/v1/holds.t | 146 +++++++++++++++++++++++++- > t/db_dependent/api/v1/patrons_holds.t | 75 ++++++++++++- > 3 files changed, 225 insertions(+), 3 deletions(-) > >diff --git a/Koha/Hold.pm b/Koha/Hold.pm >index f644475473c..3590489f086 100644 >--- a/Koha/Hold.pm >+++ b/Koha/Hold.pm >@@ -1464,7 +1464,12 @@ Get all debit account lines (charges) associated with this hold > sub debits { > my ($self) = @_; > >- my $accountlines_rs = $self->_result->search_related('accountline_links')->search_related('accountline'); >+ my $accountlines_rs = $self->_result->search_related('accountline_links')->search_related( >+ 'accountline', >+ { >+ 'accountline.credit_type_code' => undef, # Only debits (no credits) >+ } >+ ); > return Koha::Account::Debits->_new_from_dbic($accountlines_rs); > } > >diff --git a/t/db_dependent/api/v1/holds.t b/t/db_dependent/api/v1/holds.t >index e98d8b125e0..7877ed06da7 100755 >--- a/t/db_dependent/api/v1/holds.t >+++ b/t/db_dependent/api/v1/holds.t >@@ -17,7 +17,7 @@ > > use Modern::Perl; > >-use Test::More tests => 18; >+use Test::More tests => 20; > use Test::NoWarnings; > use Test::MockModule; > use Test::Mojo; >@@ -39,6 +39,7 @@ use Koha::Biblioitems; > use Koha::Items; > use Koha::CirculationRules; > use Koha::Patron::Debarments qw(AddDebarment); >+use Koha::Holds; > > my $schema = Koha::Database->new->schema; > my $builder = t::lib::TestBuilder->new(); >@@ -1885,3 +1886,146 @@ subtest 'PUT /holds/{hold_id}/lowest_priority tests' => sub { > > $schema->storage->txn_rollback; > }; >+ >+subtest 'debits embedding tests' => sub { >+ >+ plan tests => 8; >+ >+ $schema->storage->txn_begin; >+ >+ # Setup proper permissions and authentication >+ my $categorycode = $builder->build( { source => 'Category' } )->{categorycode}; >+ my $branchcode = $builder->build( { source => 'Branch' } )->{branchcode}; >+ my $password = 'thePassword123'; >+ >+ my $librarian = $builder->build_object( >+ { >+ class => 'Koha::Patrons', >+ value => { >+ categorycode => $categorycode, >+ branchcode => $branchcode, >+ flags => 80, # borrowers (16) + reserveforothers (64) = 80 >+ } >+ } >+ ); >+ $librarian->set_password( { password => $password, skip_validation => 1 } ); >+ my $userid = $librarian->userid; >+ >+ my $patron = $builder->build_object( >+ { >+ class => 'Koha::Patrons', >+ value => { >+ categorycode => $categorycode, >+ branchcode => $branchcode, >+ } >+ } >+ ); >+ my $biblio = $builder->build_sample_biblio(); >+ >+ # Create a hold using the proper API method >+ my $reserve_id = C4::Reserves::AddReserve( >+ { >+ branchcode => $branchcode, >+ borrowernumber => $patron->borrowernumber, >+ biblionumber => $biblio->biblionumber, >+ priority => 1, >+ } >+ ); >+ >+ my $hold = Koha::Holds->find($reserve_id); >+ >+ # Create account lines and link them to the hold >+ my $fee1 = $patron->account->add_debit( >+ { >+ amount => 2.50, >+ description => 'Hold placement fee', >+ type => 'RESERVE', >+ interface => 'intranet' >+ } >+ ); >+ $fee1->add_link( 'hold', $hold->id ); >+ >+ # Test without embedding - should not include debits >+ $t->get_ok( "//$userid:$password@/api/v1/holds?hold_id=" . $hold->id )->status_is(200)->json_has('/0/hold_id') >+ ->json_hasnt( '/0/debits', 'No debits without embedding' ); >+ >+ # Test with debits embedding - should include debits >+ $t->get_ok( >+ "//$userid:$password@/api/v1/holds?hold_id=" . $hold->id, >+ { 'x-koha-embed' => 'debits' } >+ )->status_is(200)->json_has( '/0/debits', 'debits present when embedded' ) >+ ->json_is( '/0/debits/0/amount', 2.50, 'Account line amount correct' ); >+ >+ $schema->storage->txn_rollback; >+}; >+ >+subtest 'POST with debits embedding tests' => sub { >+ >+ plan tests => 4; >+ >+ $schema->storage->txn_begin; >+ >+ # Setup proper permissions and authentication >+ my $categorycode = $builder->build( { source => 'Category' } )->{categorycode}; >+ my $branchcode = $builder->build( { source => 'Branch' } )->{branchcode}; >+ my $password = 'thePassword123'; >+ >+ my $librarian = $builder->build_object( >+ { >+ class => 'Koha::Patrons', >+ value => { >+ categorycode => $categorycode, >+ branchcode => $branchcode, >+ flags => 80, # borrowers (16) + reserveforothers (64) = 80 >+ } >+ } >+ ); >+ $librarian->set_password( { password => $password, skip_validation => 1 } ); >+ my $userid = $librarian->userid; >+ >+ my $patron = $builder->build_object( >+ { >+ class => 'Koha::Patrons', >+ value => { >+ categorycode => $categorycode, >+ branchcode => $branchcode, >+ } >+ } >+ ); >+ my $biblio = $builder->build_sample_biblio(); >+ my $item = $builder->build_sample_item( { biblionumber => $biblio->biblionumber } ); >+ >+ # Set up system preference to charge fees for holds >+ t::lib::Mocks::mock_preference( 'HoldFeeMode', 'any_time_is_placed' ); >+ >+ # Create a circulation rule with hold fee >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => $patron->categorycode, >+ branchcode => undef, >+ itemtype => undef, >+ rules => { >+ hold_fee => 2.50, >+ } >+ } >+ ); >+ >+ # Make sure pickup location checks doesn't get in the middle >+ my $mock_biblio = Test::MockModule->new('Koha::Biblio'); >+ $mock_biblio->mock( 'pickup_locations', sub { return Koha::Libraries->search; } ); >+ my $mock_item = Test::MockModule->new('Koha::Item'); >+ $mock_item->mock( 'pickup_locations', sub { return Koha::Libraries->search } ); >+ >+ # Test POST with embedding (should include automatically charged debits in response) >+ $t->post_ok( >+ "//$userid:$password@/api/v1/holds" => { 'x-koha-embed' => 'debits' } => json => { >+ patron_id => $patron->borrowernumber, >+ biblio_id => $biblio->biblionumber, >+ item_id => $item->itemnumber, >+ pickup_library_id => $branchcode, >+ } >+ )->status_is(201)->json_has( '/debits', 'debits embedded in POST response' ) >+ ->json_is( '/debits/0/amount', 2.50, 'Hold fee automatically charged and embedded' ); >+ >+ $schema->storage->txn_rollback; >+}; >diff --git a/t/db_dependent/api/v1/patrons_holds.t b/t/db_dependent/api/v1/patrons_holds.t >index 99066428fd1..d82953a81cf 100755 >--- a/t/db_dependent/api/v1/patrons_holds.t >+++ b/t/db_dependent/api/v1/patrons_holds.t >@@ -18,7 +18,7 @@ > use Modern::Perl; > > use Test::NoWarnings; >-use Test::More tests => 3; >+use Test::More tests => 4; > use Test::MockModule; > use Test::Mojo; > >@@ -26,6 +26,7 @@ use t::lib::TestBuilder; > use t::lib::Mocks; > > use Koha::Database; >+use C4::Reserves; > > my $schema = Koha::Database->new->schema; > my $builder = t::lib::TestBuilder->new(); >@@ -185,3 +186,75 @@ subtest 'delete_public() tests' => sub { > > $schema->storage->txn_rollback; > }; >+ >+subtest 'debits embedding tests' => sub { >+ >+ plan tests => 8; >+ >+ $schema->storage->txn_begin; >+ >+ # Setup proper permissions and authentication >+ my $categorycode = $builder->build( { source => 'Category' } )->{categorycode}; >+ my $branchcode = $builder->build( { source => 'Branch' } )->{branchcode}; >+ my $password = 'thePassword123'; >+ >+ my $librarian = $builder->build_object( >+ { >+ class => 'Koha::Patrons', >+ value => { >+ categorycode => $categorycode, >+ branchcode => $branchcode, >+ flags => 80, # borrowers (16) + reserveforothers (64) = 80 >+ } >+ } >+ ); >+ $librarian->set_password( { password => $password, skip_validation => 1 } ); >+ my $userid = $librarian->userid; >+ >+ my $patron = $builder->build_object( >+ { >+ class => 'Koha::Patrons', >+ value => { >+ categorycode => $categorycode, >+ branchcode => $branchcode, >+ } >+ } >+ ); >+ my $biblio = $builder->build_sample_biblio(); >+ >+ # Create a hold using the proper API method >+ my $reserve_id = C4::Reserves::AddReserve( >+ { >+ branchcode => $branchcode, >+ borrowernumber => $patron->borrowernumber, >+ biblionumber => $biblio->biblionumber, >+ priority => 1, >+ } >+ ); >+ >+ my $hold = Koha::Holds->find($reserve_id); >+ >+ # Create account lines and link them to the hold >+ my $fee1 = $patron->account->add_debit( >+ { >+ amount => 2.50, >+ description => 'Hold placement fee', >+ type => 'RESERVE', >+ interface => 'intranet' >+ } >+ ); >+ $fee1->add_link( 'hold', $hold->id ); >+ >+ # Test without embedding - should not include debits >+ $t->get_ok( "//$userid:$password@/api/v1/patrons/" . $patron->id . "/holds" )->status_is(200) >+ ->json_has('/0/hold_id')->json_hasnt( '/0/debits', 'No debits without embedding' ); >+ >+ # Test with debits embedding - should include debits >+ $t->get_ok( >+ "//$userid:$password@/api/v1/patrons/" . $patron->id . "/holds", >+ { 'x-koha-embed' => 'debits' } >+ )->status_is(200)->json_has( '/0/debits', 'debits present when embedded' ) >+ ->json_is( '/0/debits/0/amount', 2.50, 'Account line amount correct' ); >+ >+ $schema->storage->txn_rollback; >+}; >-- >2.51.0
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 40808
:
186436
|
186437
|
186438
|
186439
|
186440
|
186441
|
186442
|
186443
|
186458
|
186459
|
186460
|
186461
|
186462
|
186463
|
186464
|
186465