From a512b8325e029afbde2b374a3908dd3f12937f2e Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Thu, 13 Aug 2015 11:32:49 -0300 Subject: [PATCH] Bug 11229: (regression tests) makepayment and makepartialpayment should log correctly This patch introduces tests for makepayment and makepartialpayment to check they are correctly logging to the statistics table. To test: - Run $ prove t/db_dependent/Accounts.t => FAIL: tests fail because statistics are not correctly logged. Signed-off-by: Tomas Cohen Arazi Signed-off-by: Jonathan Druart --- t/db_dependent/Accounts.t | 393 +++++++++++++++++++++++++++++----------------- 1 file changed, 253 insertions(+), 140 deletions(-) diff --git a/t/db_dependent/Accounts.t b/t/db_dependent/Accounts.t index a167f02..6bf0bb0 100644 --- a/t/db_dependent/Accounts.t +++ b/t/db_dependent/Accounts.t @@ -16,12 +16,14 @@ # You should have received a copy of the GNU General Public License along # with Koha; if not, see . -use strict; -use warnings; +use Modern::Perl; -use Test::More tests => 15; +use Test::More tests => 8; +use Test::MockModule; use Test::Warn; +use t::lib::TestBuilder; + BEGIN { use_ok('C4::Accounts'); use_ok('Koha::Object'); @@ -29,23 +31,25 @@ BEGIN { use_ok('Data::Dumper'); } -can_ok( 'C4::Accounts', - qw( recordpayment - makepayment - getnextacctno - - chargelostitem - manualinvoice - getcharges - ModNote - getcredits - getrefunds - ReversePayment - recordpayment_selectaccts - makepartialpayment - WriteOffFee ) +can_ok( 'C4::Accounts', + qw( recordpayment + makepayment + getnextacctno + chargelostitem + manualinvoice + getcharges + ModNote + getcredits + getrefunds + ReversePayment + recordpayment_selectaccts + makepartialpayment + WriteOffFee ) ); +my $builder = t::lib::TestBuilder->new(); +my $schema = Koha::Database->new()->schema(); + my $dbh = C4::Context->dbh; $dbh->{RaiseError}=1; $dbh->{AutoCommit}=0; @@ -53,131 +57,240 @@ $dbh->do(q|DELETE FROM accountlines|); $dbh->do(q|DELETE FROM borrowers|); $dbh->do(q|DELETE FROM issues|); -# Mock userenv -local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /redefined/ }; -my $userenv; -*C4::Context::userenv = \&Mock_userenv; -$userenv = { flags => 1, id => 'my_userid', branch => 'CPL' }; - -# A Borrower for the tests ---------------------- -my $categorycode = Koha::Database->new()->schema()->resultset('Category')->first()->categorycode(); -my $branchcode = Koha::Database->new()->schema()->resultset('Branch')->first()->branchcode(); - -my $borrower = Koha::Borrower->new( { - cardnumber => '1234567890', - surname => 'McFly', - firstname => 'Marty', -} ); -$borrower->categorycode( $categorycode ); -$borrower->branchcode( $branchcode ); -$borrower->store; - -my $sth = $dbh->prepare( - "INSERT INTO accountlines ( - borrowernumber, - amountoutstanding ) - VALUES ( ?, ? )" -); -$sth->execute($borrower->borrowernumber, '100'); -$sth->execute($borrower->borrowernumber, '200'); - -$sth = $dbh->prepare("SELECT count(*) FROM accountlines"); -$sth->execute; -my $count = $sth->fetchrow_array; -is ($count, 2, 'There is 2 lines as expected'); - -# Testing recordpayment ------------------------- -# There is $100 in the account -$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); -my $amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); -my $amountleft = 0; -for my $line ( @$amountoutstanding ) { - $amountleft += $line; -} -ok($amountleft == 300, 'The account has 300$ as expected' ); - -# We make a $20 payment -my $borrowernumber = $borrower->borrowernumber; -my $data = '20.00'; -my $sys_paytype; -my $payment_note = '$20.00 payment note'; -recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); -# There is now $280 in the account -$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); -$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); -$amountleft = 0; -for my $line ( @$amountoutstanding ) { - $amountleft += $line; -} -ok($amountleft == 280, 'The account has $280 as expected' ); -# Is the payment note well registered -$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); -$sth->execute($borrower->borrowernumber); -my $note = $sth->fetchrow_array; -is($note,'$20.00 payment note', '$20.00 payment note is registered'); - -# We make a -$30 payment (a NEGATIVE payment) -$data = '-30.00'; -$payment_note = '-$30.00 payment note'; -recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); -# There is now $310 in the account -$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); -$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); -$amountleft = 0; -for my $line ( @$amountoutstanding ) { - $amountleft += $line; -} -ok($amountleft == 310, 'The account has $310 as expected' ); -# Is the payment note well registered -$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); -$sth->execute($borrower->borrowernumber); -$note = $sth->fetchrow_array; -is($note,'-$30.00 payment note', '-$30.00 payment note is registered'); - -#We make a $150 payment ( > 1stLine ) -$data = '150.00'; -$payment_note = '$150.00 payment note'; -recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); -# There is now $160 in the account -$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); -$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); -$amountleft = 0; -for my $line ( @$amountoutstanding ) { - $amountleft += $line; -} -ok($amountleft == 160, 'The account has $160 as expected' ); -# Is the payment note well registered -$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); -$sth->execute($borrower->borrowernumber); -$note = $sth->fetchrow_array; -is($note,'$150.00 payment note', '$150.00 payment note is registered'); - -#We make a $200 payment ( > amountleft ) -$data = '200.00'; -$payment_note = '$200.00 payment note'; -recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); -# There is now -$40 in the account -$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); -$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); -$amountleft = 0; -for my $line ( @$amountoutstanding ) { - $amountleft += $line; -} -ok($amountleft == -40, 'The account has -$40 as expected, (credit situation)' ); -# Is the payment note well registered -$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); -$sth->execute($borrower->borrowernumber); -$note = $sth->fetchrow_array; -is($note,'$200.00 payment note', '$200.00 payment note is registered'); +my $branchcode = 'CPL'; +my $borrower_number; +my $context = new Test::MockModule('C4::Context'); +$context->mock( 'userenv', sub { + return { + flags => 1, + id => 'my_userid', + branch => $branchcode, + }; +}); -$dbh->rollback; +subtest "recordpayment() tests" => sub { + + plan tests => 10; + + # Create a borrower + my $categorycode = $builder->build({ source => 'Category' })->{ categorycode }; + my $branchcode = $builder->build({ source => 'Branch' })->{ branchcode }; + + my $borrower = Koha::Borrower->new( { + cardnumber => '1234567890', + surname => 'McFly', + firstname => 'Marty', + } ); + $borrower->categorycode( $categorycode ); + $borrower->branchcode( $branchcode ); + $borrower->store; + + my $sth = $dbh->prepare( + "INSERT INTO accountlines ( + borrowernumber, + amountoutstanding ) + VALUES ( ?, ? )" + ); + $sth->execute($borrower->borrowernumber, '100'); + $sth->execute($borrower->borrowernumber, '200'); + + $sth = $dbh->prepare("SELECT count(*) FROM accountlines"); + $sth->execute; + my $count = $sth->fetchrow_array; + is ($count, 2, 'There is 2 lines as expected'); + + # Testing recordpayment ------------------------- + # There is $100 in the account + $sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); + my $amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); + my $amountleft = 0; + for my $line ( @$amountoutstanding ) { + $amountleft += $line; + } + ok($amountleft == 300, 'The account has 300$ as expected' ); + + # We make a $20 payment + my $borrowernumber = $borrower->borrowernumber; + my $data = '20.00'; + my $sys_paytype; + my $payment_note = '$20.00 payment note'; + recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); + # There is now $280 in the account + $sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); + $amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); + $amountleft = 0; + for my $line ( @$amountoutstanding ) { + $amountleft += $line; + } + ok($amountleft == 280, 'The account has $280 as expected' ); + # Is the payment note well registered + $sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); + $sth->execute($borrower->borrowernumber); + my $note = $sth->fetchrow_array; + is($note,'$20.00 payment note', '$20.00 payment note is registered'); + + # We make a -$30 payment (a NEGATIVE payment) + $data = '-30.00'; + $payment_note = '-$30.00 payment note'; + recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); + # There is now $310 in the account + $sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); + $amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); + $amountleft = 0; + for my $line ( @$amountoutstanding ) { + $amountleft += $line; + } + ok($amountleft == 310, 'The account has $310 as expected' ); + # Is the payment note well registered + $sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); + $sth->execute($borrower->borrowernumber); + $note = $sth->fetchrow_array; + is($note,'-$30.00 payment note', '-$30.00 payment note is registered'); + + #We make a $150 payment ( > 1stLine ) + $data = '150.00'; + $payment_note = '$150.00 payment note'; + recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); + # There is now $160 in the account + $sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); + $amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); + $amountleft = 0; + for my $line ( @$amountoutstanding ) { + $amountleft += $line; + } + ok($amountleft == 160, 'The account has $160 as expected' ); + # Is the payment note well registered + $sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); + $sth->execute($borrower->borrowernumber); + $note = $sth->fetchrow_array; + is($note,'$150.00 payment note', '$150.00 payment note is registered'); + + #We make a $200 payment ( > amountleft ) + $data = '200.00'; + $payment_note = '$200.00 payment note'; + recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); + # There is now -$40 in the account + $sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); + $amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); + $amountleft = 0; + for my $line ( @$amountoutstanding ) { + $amountleft += $line; + } + ok($amountleft == -40, 'The account has -$40 as expected, (credit situation)' ); + # Is the payment note well registered + $sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); + $sth->execute($borrower->borrowernumber); + $note = $sth->fetchrow_array; + is($note,'$200.00 payment note', '$200.00 payment note is registered'); +}; + +subtest "makepayment() tests" => sub { + + plan tests => 6; + + # Create a borrower + my $category = $builder->build({ source => 'Category' })->{ categorycode }; + my $branch = $builder->build({ source => 'Branch' })->{ branchcode }; + $branchcode = $branch; + my $borrowernumber = $builder->build({ + source => 'Borrower', + value => { categorycode => $category, + branchcode => $branch } + })->{ borrowernumber }; + my $amount = 100; + my $accountline = $builder->build({ source => 'Accountline', + value => { borrowernumber => $borrowernumber, + amount => $amount, + amountoutstanding => $amount } + }); -# Sub ------------------------------------------- + my $rs = $schema->resultset('Accountline')->search({ + borrowernumber => $borrowernumber + }); + + is( $rs->count(), 1, 'Accountline created' ); + + # make the full payment + makepayment( + $accountline->{ accountlines_id }, $borrowernumber, + $accountline->{ accountno }, $amount, + $borrowernumber, $branch, 'A payment note' ); + + # TODO: someone should write actual tests for makepayment() + + my $stat = $schema->resultset('Statistic')->search({ + branch => $branch, + type => 'payment' + }, { order_by => { -desc => 'datetime' } })->next(); + + ok( defined $stat, "There's a payment log that matches the branch" ); + + SKIP: { + skip "No statistic logged", 4 unless defined $stat; + + is( $stat->type, 'payment', "Correct statistic type" ); + is( $stat->branch, $branch, "Correct branch logged to statistics" ); + is( $stat->borrowernumber, $borrowernumber, "Correct borrowernumber logged to statistics" ); + is( $stat->value, "$amount" . "\.0000", "Correct amount logged to statistics" ); + } +}; + +subtest "makepartialpayment() tests" => sub { + + plan tests => 6; + + # Create a borrower + my $category = $builder->build({ source => 'Category' })->{ categorycode }; + my $branch = $builder->build({ source => 'Branch' })->{ branchcode }; + $branchcode = $branch; + my $borrowernumber = $builder->build({ + source => 'Borrower', + value => { categorycode => $category, + branchcode => $branch } + })->{ borrowernumber }; + + my $amount = 100; + my $partialamount = 60; + my $accountline = $builder->build({ source => 'Accountline', + value => { borrowernumber => $borrowernumber, + amount => $amount, + amountoutstanding => $amount } + }); + + my $rs = $schema->resultset('Accountline')->search({ + borrowernumber => $borrowernumber + }); + + is( $rs->count(), 1, 'Accountline created' ); + + # make the full payment + makepartialpayment( + $accountline->{ accountlines_id }, $borrowernumber, + $accountline->{ accountno }, $partialamount, + $borrowernumber, $branch, 'A payment note' ); + + # TODO: someone should write actual tests for makepartialpayment() + + my $stat = $schema->resultset('Statistic')->search({ + branch => $branch, + type => 'payment' + }, { order_by => { -desc => 'datetime' } })->next(); + + ok( defined $stat, "There's a payment log that matches the branch" ); + + SKIP: { + skip "No statistic logged", 4 unless defined $stat; + + is( $stat->type, 'payment', "Correct statistic type" ); + is( $stat->branch, $branch, "Correct branch logged to statistics" ); + is( $stat->borrowernumber, $borrowernumber, "Correct borrowernumber logged to statistics" ); + is( $stat->value, "$partialamount" . "\.0000", "Correct amount logged to statistics" ); + } +}; + +$dbh->rollback; -# C4::Context->userenv -sub Mock_userenv { - return $userenv; -} \ No newline at end of file +1; \ No newline at end of file -- 2.1.0