3 # This Koha test module is a stub!
4 # Add more tests here!!!
7 use POSIX qw(strftime);
9 use C4::Bookseller qw( GetBookSellerFromId );
11 use Test::More tests => 64;
14 use_ok('C4::Acquisition');
15 use_ok('C4::Bookseller');
17 use_ok('C4::Budgets');
18 use_ok('C4::Bookseller');
21 # Sub used for testing C4::Acquisition subs returning order(s) : GetOrdersByStatus,GetOrders, GetDeletedOrders, GetOrder etc.
22 # (\@test_missing_fields,\@test_extra_fields,\@test_different_fields,$test_nbr_fields) = _check_fields_of_order ($exp_fields, $original_order_content, $order_to_check);
24 # $exp_fields : arrayref whose elements are the keys we expect to find
25 # $original_order_content : hashref whose 2 keys str and num contains hashrefs containing content fields of the order created with NewOrder
26 # $order_to_check : hashref whose keys/values are the content of an order returned by the C4::Acquisition sub we are testing
28 # \@test_missing_fields : arrayref void if ok ; otherwise contains the list of fields missing in $order_to_check
29 # \@test_extra_fields : arrayref void if ok ; otherwise contains the list of fields unexpected in $order_to_check
30 # \@test_different_fields : arrayref void if ok ; otherwise contains the list of fields which value is not the same in between $order_to_check and
31 # $test_nbr_fields : contains the number of fields of $order_to_check
33 sub _check_fields_of_order {
34 my ($exp_fields, $original_order_content, $order_to_check) = @_;
35 my @test_missing_fields = ();
36 my @test_extra_fields = ();
37 my @test_different_fields = ();
38 my $test_nbr_fields = scalar (keys %$order_to_check);
39 foreach my $field ( @$exp_fields ) {
40 push @test_missing_fields, $field unless exists( $order_to_check->{ $field });
42 foreach my $field ( keys %$order_to_check) {
43 push @test_extra_fields, $field unless grep (/^$field$/, @$exp_fields);
45 foreach my $field ( keys %{$original_order_content->{str}}) {
46 push @test_different_fields, $field unless (! exists $order_to_check->{ $field }) or ($original_order_content->{str}->{$field} eq $order_to_check->{ $field });
48 foreach my $field ( keys %{$original_order_content->{num}}) {
49 push @test_different_fields, $field unless (! exists $order_to_check->{ $field }) or ($original_order_content->{num}->{$field} == $order_to_check->{ $field });
51 return ( \@test_missing_fields,\@test_extra_fields,\@test_different_fields,$test_nbr_fields);
54 # Sub used for testing C4::Acquisition subs returning several orders
55 # (\@test_missing_fields,\@test_extra_fields,\@test_different_fields,\@test_nbr_fields) = _check_fields_of_orders ($exp_fields, $original_orders_content, $orders_to_check)
56 sub _check_fields_of_orders {
57 my ($exp_fields, $original_orders_content, $orders_to_check) = @_;
58 my @test_missing_fields = ();
59 my @test_extra_fields = ();
60 my @test_different_fields = ();
61 my @test_nbr_fields = ();
62 foreach my $order_to_check (@$orders_to_check ) {
63 my $original_order_content = (grep {$_->{str}->{ordernumber} eq $order_to_check-> {ordernumber}} @$original_orders_content)[0];
64 my ($t_missing_fields,$t_extra_fields,$t_different_fields,$t_nbr_fields) = _check_fields_of_order ($exp_fields,$original_order_content,$order_to_check);
65 push @test_missing_fields, @$t_missing_fields;
66 push @test_extra_fields, @$t_extra_fields;
67 push @test_different_fields, @$t_different_fields;
68 push @test_nbr_fields, $t_nbr_fields;
70 @test_missing_fields = keys %{{map {$_ => 1} @test_missing_fields}};
71 @test_extra_fields = keys %{{map {$_ => 1} @test_extra_fields}};
72 @test_different_fields = keys %{{map {$_ => 1} @test_different_fields}};
73 return (\@test_missing_fields,\@test_extra_fields,\@test_different_fields,\@test_nbr_fields);
76 my $dbh = C4::Context->dbh;
77 $dbh->{AutoCommit} = 0;
78 $dbh->{RaiseError} = 1;
80 # Creating some orders
81 my $booksellerid = C4::Bookseller::AddBookseller(
84 address1 => "bookseller's address",
91 my $booksellerinfo = C4::Bookseller::GetBookSellerFromId( $booksellerid );
93 is($booksellerinfo->{deliverytime}, 5, 'set deliverytime when creating vendor (Bug 10556)');
95 my ($basket, $basketno);
96 ok($basketno = NewBasket($booksellerid, 1), "NewBasket( $booksellerid , 1 ) returns $basketno");
97 ok($basket = GetBasket($basketno), "GetBasket($basketno) returns $basket");
99 my $budgetid = C4::Budgets::AddBudget(
101 budget_code => "budget_code_test_getordersbybib",
102 budget_name => "budget_name_test_getordersbybib",
105 my $budget = C4::Budgets::GetBudget( $budgetid );
108 my ($biblionumber1, $biblioitemnumber1) = AddBiblio(MARC::Record->new, '');
109 my ($biblionumber2, $biblioitemnumber2) = AddBiblio(MARC::Record->new, '');
110 my ($biblionumber3, $biblioitemnumber3) = AddBiblio(MARC::Record->new, '');
111 my ($biblionumber4, $biblioitemnumber4) = AddBiblio(MARC::Record->new, '');
118 my ($mandatoryparams, $return_error,$basketnum);
120 # returns undef and croaks if basketno, quantity, biblionumber or budget_id is missing
121 eval {($basketnum, $ordernumbers[0] ) = C4::Acquisition::NewOrder()};
123 ok ((!(defined $basketnum || defined $ordernumbers[0])) && (defined $return_error),"NewOrder with no params returns undef and croaks");
126 basketno => $basketno,
128 biblionumber => $biblionumber1,
129 budget_id => $budget->{budget_id},
131 my @mandatoryparams_keys = keys %$mandatoryparams;
132 foreach my $mandatoryparams_key (@mandatoryparams_keys) {
133 my %test_missing_mandatoryparams = %$mandatoryparams;
134 delete $test_missing_mandatoryparams {$mandatoryparams_key};
135 eval {($basketnum, $ordernumbers[0] ) = C4::Acquisition::NewOrder(\%test_missing_mandatoryparams)};
137 my $expected_error = "Mandatory parameter $mandatoryparams_key missing";
138 ok ((!(defined $basketnum || defined $ordernumbers[0])) && ( index ($return_error, $expected_error) >=0 ),"NewOrder with no $mandatoryparams_key returns undef and croaks with expected error message");
141 # FIXME to do : test the other features of NewOrder
143 # Prepare 5 orders, and make distinction beween fields to be tested with eq and with ==
144 # Ex : a price of 50.1 will be stored internally as 5.100000
146 my @order_content = (
148 basketno => $basketno,
149 biblionumber => $biblionumber1,
150 budget_id => $budget->{budget_id},
156 listprice=>50.121111,
163 basketno => $basketno,
164 biblionumber => $biblionumber2,
165 budget_id => $budget->{budget_id}
171 basketno => $basketno,
172 biblionumber => $biblionumber2,
173 budget_id => $budget->{budget_id},
188 basketno => $basketno,
189 biblionumber => $biblionumber3,
190 budget_id => $budget->{budget_id},
205 basketno => $basketno,
206 biblionumber => $biblionumber4,
207 budget_id => $budget->{budget_id},
223 # Create 4 orders in database
226 @ocontent { keys %{$order_content[$_]->{num}} } = values %{$order_content[$_]->{num}};
227 @ocontent { keys %{$order_content[$_]->{str}} } = values %{$order_content[$_]->{str}};
228 ( undef, $ordernumbers[$_] ) = C4::Acquisition::NewOrder(\%ocontent);
229 $order_content[$_]->{str}->{ordernumber} = $ordernumbers[$_];
233 # Test UT sub _check_fields_of_order
235 my ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_order ([qw /a b c d e/], {str=>{a=>"bla",b=>"105"},num=>{c=>15.12}}, {a=>"blabla",f=>"f",b=>"105",c=>15.1200,g=>''});
236 ok ((($test_nbr_fields == 5) and (join (" ",sort @$test_missing_fields) eq 'd e') and (join (" ",sort @$test_extra_fields) eq 'f g') and (join(" ",@$test_different_fields) eq 'a')), "_check_fields_of_order can check an order (test 1)");
237 ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_order ([qw /a b c /], {str=>{a=>"bla",b=>"105"},num=>{c=>15.00}}, {a=>"bla",b=>"105",c=>15});
238 ok ((($test_nbr_fields == 3) and (scalar @$test_missing_fields == 0) and (scalar @$test_extra_fields == 0) and (scalar @$test_different_fields == 0)) , "_check_fields_of_order can check an order (test 2)");
239 ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_order ([qw /a b c d e/], {str=>{a=>"bla",b=>"105"},num=>{c=>15.12}}, {a=>"blabla",b=>"105",c=>15,d=>"error"});
240 ok ((($test_nbr_fields == 4) and (join (" ",sort @$test_missing_fields) eq 'e') and (scalar @$test_extra_fields == 0) and (join(" ",@$test_different_fields) eq 'a c')) , "_check_fields_of_order can check an order (test 3)");
247 my @expectedfields = qw(
261 datecancellationprinted
301 estimateddeliverydate
307 ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_order (\@expectedfields , $order_content[0], GetOrder($ordernumbers[0]));
308 is($test_nbr_fields,scalar @expectedfields , "GetOrder gets an order with the right number of fields" );
309 is(join (" ",@$test_missing_fields),'', "GetOrder gets an order with no missing fields" );
310 is(join (" ",@$test_extra_fields),'', "GetOrder gets an order with no unexpected fields" );
311 is(join (" ",@$test_different_fields),'', "GetOrder gets an order with the right content in every fields" );
317 my @base_expectedfields = qw(
357 editionresponsibility
404 datecancellationprinted
406 @expectedfields = (@base_expectedfields, ('transferred_from_timestamp','transferred_from'));
407 is(GetOrders(),undef,"GetOrders with no params returns undef");
408 DelOrder ($order_content[3]->{str}->{biblionumber},$ordernumbers[3]);
409 my @get_orders = GetOrders($basketno);
410 ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_orders (\@expectedfields , \@order_content, \@get_orders);
411 is($$test_nbr_fields [0],scalar @expectedfields , "GetOrders gets orders with the right number of fields" );
412 is(join (" ",@$test_missing_fields),'', "GetOrders gets orders with no missing fields" );
413 is(join (" ",@$test_extra_fields),'', "GetOrders gets orders with no unexpected fields" );
414 is(join (" ",@$test_different_fields),'', "GetOrders gets orders with the right content in every fields" );
415 ok(((scalar @get_orders == 4) and !grep ($_->{ordernumber} eq $ordernumbers[3], @get_orders)),"GetOrders only gets non-cancelled orders" );
418 # Test GetCancelledOrders
421 @expectedfields = (@base_expectedfields, ('transferred_to_timestamp','transferred_to'));
422 is(GetCancelledOrders(),undef,"GetCancelledOrders with no params returns undef");
423 @get_orders = GetCancelledOrders($basketno);
424 ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_orders (\@expectedfields , \@order_content, \@get_orders);
425 is($$test_nbr_fields [0],scalar @expectedfields , "GetCancelledOrders gets orders with the right number of fields" );
426 is(join (" ",@$test_missing_fields),'', "GetCancelledOrders gets orders with no missing fields" );
427 is(join (" ",@$test_extra_fields),'', "GetCancelledOrders gets orders with no unexpected fields" );
428 is(join (" ",@$test_different_fields),'', "GetCancelledOrders gets orders with the right content in every fields" );
429 ok(((scalar @get_orders == 1) and grep ($_->{ordernumber} eq $ordernumbers[3], @get_orders)),"GetCancelledOrders only gets cancelled orders" );
435 @expectedfields = qw (
488 datecancellationprinted
492 my $invoiceid = AddInvoice(
493 invoicenumber => 'invoice',
494 booksellerid => $booksellerid,
498 my ($datereceived, $new_ordernumber) = ModReceiveOrder(
507 $order_content[4]->{str}->{budget_id}
510 my $search_orders = SearchOrders({
511 booksellerid => $booksellerid,
512 basketno => $basketno
514 isa_ok( $search_orders, 'ARRAY' );
515 ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_orders (\@expectedfields , \@order_content, $search_orders );
516 is($$test_nbr_fields [0],scalar @expectedfields , "SearchOrders gets orders with the right number of fields" );
517 is(join (" ",@$test_missing_fields),'', "SearchOrders gets orders with no missing fields" );
518 is(join (" ",@$test_extra_fields),'', "SearchOrders gets orders with no unexpected fields" );
519 is(join (" ",@$test_different_fields),'', "SearchOrders gets orders with the right content in every fields" );
520 ok(((scalar @$search_orders == 4) and !grep ($_->{ordernumber} eq $ordernumbers[3], @$search_orders)),"SearchOrders only gets non-cancelled orders" );
522 $search_orders = SearchOrders({
523 booksellerid => $booksellerid,
524 basketno => $basketno,
527 ok(((scalar @$search_orders == 3) and !grep ((($_->{ordernumber} eq $ordernumbers[3]) or ($_->{ordernumber} eq $ordernumbers[4])), @$search_orders)),"SearchOrders with pending params gets only pending orders" );
530 # Test GetBudgetByOrderNumber
533 ok( GetBudgetByOrderNumber($ordernumbers[0])->{'budget_id'} eq $budgetid, "GetBudgetByOrderNumber returns expected budget" );
540 @expectedfields = qw (
553 estimateddeliverydate
561 my @lateorders = GetLateOrders(0);
562 is(scalar grep ($_->{basketno} eq $basketno, @lateorders),0, "GetLateOrders does not get orders from opened baskets" );
563 C4::Acquisition::CloseBasket( $basketno );
564 @lateorders = GetLateOrders(0);
565 isnt(scalar grep ($_->{basketno} eq $basketno, @lateorders),0, "GetLateOrders gets orders from closed baskets" );
566 ok(!grep ($_->{ordernumber} eq $ordernumbers[3], @lateorders),"GetLateOrders does not gets cancelled orders" );
567 ok(!grep ($_->{ordernumber} eq $ordernumbers[4], @lateorders),"GetLateOrders does not gets reveived orders" );
568 ($test_missing_fields,$test_extra_fields,$test_different_fields,$test_nbr_fields) = _check_fields_of_orders (\@expectedfields , \@order_content, \@lateorders );
569 is($$test_nbr_fields [0],scalar @expectedfields , "GetLateOrders gets orders with the right number of fields" );
570 is(join (" ",@$test_missing_fields),'', "GetLateOrders gets orders with no missing fields" );
571 is(join (" ",@$test_extra_fields),'', "GetLateOrders gets orders with no unexpected fields" );
572 is(join (" ",@$test_different_fields),'', "GetLateOrders gets orders with the right content in every fields" );
578 my $order = $lateorders[0];
579 AddClaim( $order->{ordernumber} );
580 my $neworder = GetOrder( $order->{ordernumber} );
581 is( $neworder->{claimed_date}, strftime( "%Y-%m-%d", localtime(time) ), "AddClaim : Check claimed_date" );
583 my $firstorder = $search_orders->[0];
585 # fake receiving the order
587 ordernumber => $firstorder->{ordernumber},
588 biblionumber => $firstorder->{biblionumber},
589 quantityreceived => $firstorder->{quantity},
592 ($datereceived, $new_ordernumber) = ModReceiveOrder(
602 my $order2 = GetOrder( $ordernumbers[1] );
603 is($order2->{'quantityreceived'}, 0, 'Splitting up order did not receive any on original order');
604 is($order2->{'quantity'}, 40, '40 items on original order');
605 is($order2->{'budget_id'}, $budgetid, 'Budget on original order is unchanged');
607 $neworder = GetOrder( $new_ordernumber );
608 is($neworder->{'quantity'}, 2, '2 items on new order');
609 is($neworder->{'quantityreceived'}, 2, 'Splitting up order received items on new order');
610 is($neworder->{'budget_id'}, $budgetid, 'Budget on new order is unchanged');
612 my $budgetid2 = C4::Budgets::AddBudget(
614 budget_code => "budget_code_test_modrecv",
615 budget_name => "budget_name_test_modrecv",
619 ($datereceived, $new_ordernumber) = ModReceiveOrder(
631 my $order3 = GetOrder( $ordernumbers[2] );
632 is($order3->{'quantityreceived'}, 0, 'Splitting up order did not receive any on original order');
633 is($order3->{'quantity'}, 2, '2 items on original order');
634 is($order3->{'budget_id'}, $budgetid, 'Budget on original order is unchanged');
636 $neworder = GetOrder( $new_ordernumber );
637 is($neworder->{'quantity'}, 2, '2 items on new order');
638 is($neworder->{'quantityreceived'}, 2, 'Splitting up order received items on new order');
639 is($neworder->{'budget_id'}, $budgetid2, 'Budget on new order is changed');
641 ($datereceived, $new_ordernumber) = ModReceiveOrder(
653 $order3 = GetOrder( $ordernumbers[2] );
654 is($order3->{'quantityreceived'}, 2, 'Order not split up');
655 is($order3->{'quantity'}, 2, '2 items on order');
656 is($order3->{'budget_id'}, $budgetid2, 'Budget has changed');