Bugzilla – Attachment 95054 Details for
Bug 18731
Add routes for acquisition orders
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 18731: Unit tests
Bug-18731-Unit-tests.patch (text/plain), 11.94 KB, created by
Tomás Cohen Arazi (tcohen)
on 2019-11-05 14:43:48 UTC
(
hide
)
Description:
Bug 18731: Unit tests
Filename:
MIME Type:
Creator:
Tomás Cohen Arazi (tcohen)
Created:
2019-11-05 14:43:48 UTC
Size:
11.94 KB
patch
obsolete
>From 70a9357c8eacccf33d75c3e89994a8c654324959 Mon Sep 17 00:00:00 2001 >From: Tomas Cohen Arazi <tomascohen@theke.io> >Date: Tue, 5 Nov 2019 11:37:57 -0300 >Subject: [PATCH] Bug 18731: Unit tests > >This patch implements unit tests for the orders endpoint. > >Sponsored-by: Camden County >--- > t/db_dependent/api/v1/acquisitions_orders.t | 324 ++++++++++++++++++++ > 1 file changed, 324 insertions(+) > create mode 100644 t/db_dependent/api/v1/acquisitions_orders.t > >diff --git a/t/db_dependent/api/v1/acquisitions_orders.t b/t/db_dependent/api/v1/acquisitions_orders.t >new file mode 100644 >index 0000000000..2da5ab265a >--- /dev/null >+++ b/t/db_dependent/api/v1/acquisitions_orders.t >@@ -0,0 +1,324 @@ >+#!/usr/bin/env 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, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use Modern::Perl; >+ >+use Test::More tests => 5; >+use Test::Mojo; >+use Test::Warn; >+ >+use t::lib::TestBuilder; >+use t::lib::Mocks; >+ >+use Koha::Acquisition::Orders; >+use Koha::Database; >+ >+my $schema = Koha::Database->new->schema; >+my $builder = t::lib::TestBuilder->new; >+ >+t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 ); >+ >+my $t = Test::Mojo->new('Koha::REST::V1'); >+ >+subtest 'list() tests' => sub { >+ plan tests => 8; >+ >+ $schema->storage->txn_begin; >+ >+ my $patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 1 } >+ }); >+ my $password = 'thePassword123'; >+ $patron->set_password({ password => $password, skip_validation => 1 }); >+ my $userid = $patron->userid; >+ >+ my $basket = $builder->build_object({ class => 'Koha::Acquisition::Baskets' }); >+ # Create test context >+ my $order = $builder->build_object( >+ { >+ class => 'Koha::Acquisition::Orders', >+ value => { basketno => $basket->basketno, orderstatus => 'new' } >+ } >+ ); >+ my $another_order = $order->unblessed; # create a copy of $order but make >+ delete $another_order->{ordernumber}; # sure ordernumber will be regenerated >+ $another_order = $builder->build_object({ class => 'Koha::Acquisition::Orders', value => $another_order }); >+ >+ ## Authorized user tests >+ my $count_of_orders = Koha::Acquisition::Orders->search->count; >+ # Make sure we are returned with the correct amount of orders >+ $t->get_ok( "//$userid:$password@/api/v1/acquisitions/orders" ) >+ ->status_is( 200, 'SWAGGER3.2.2' ) >+ ->json_has('/'.($count_of_orders-1).'/order_id') >+ ->json_hasnt('/'.($count_of_orders).'/order_id'); >+ >+ subtest 'query parameters' => sub { >+ >+ my $fields = { >+ biblio_id => 'biblionumber', >+ basket_id => 'basketno', >+ budget_id => 'budget_id', >+ }; >+ >+ my $size = keys %{$fields}; >+ >+ plan tests => $size * 3; >+ >+ foreach my $field ( keys %{$fields} ) { >+ my $model_field = $fields->{ $field }; >+ my $result = >+ $t->get_ok("//$userid:$password@/api/v1/acquisitions/orders?$field=" . $order->$model_field) >+ ->status_is(200) >+ ->json_has( [ $order, $another_order ] ); >+ } >+ }; >+ >+ # Warn on unsupported query parameter >+ $t->get_ok( "//$userid:$password@/api/v1/acquisitions/orders?order_blah=blah" ) >+ ->status_is(400) >+ ->json_is( [{ path => '/query/order_blah', message => 'Malformed query string'}] ); >+ >+ $schema->storage->txn_rollback; >+}; >+ >+subtest 'get() tests' => sub { >+ >+ plan tests => 6; >+ >+ $schema->storage->txn_begin; >+ >+ my $order = $builder->build_object( >+ { >+ class => 'Koha::Acquisition::Orders', >+ value => { orderstatus => 'new' } >+ } >+ ); >+ my $patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 2048 } >+ }); >+ my $password = 'thePassword123'; >+ $patron->set_password({ password => $password, skip_validation => 1 }); >+ my $userid = $patron->userid; >+ >+ $t->get_ok( "//$userid:$password@/api/v1/acquisitions/orders/" . $order->ordernumber ) >+ ->status_is( 200, 'SWAGGER3.2.2' ) >+ ->json_is( '' => $order->to_api, 'SWAGGER3.3.2' ); >+ >+ my $non_existent_order_id = $order->ordernumber; >+ $order->delete; >+ >+ $t->get_ok( "//$userid:$password@/api/v1/acquisitions/orders/" . $non_existent_order_id ) >+ ->status_is(404) >+ ->json_is( '/error' => 'Order not found' ); >+ >+ $schema->storage->txn_rollback; >+}; >+ >+subtest 'add() tests' => sub { >+ >+ plan tests => 17; >+ >+ $schema->storage->txn_begin; >+ >+ my $authorized_patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 1 } >+ }); >+ my $password = 'thePassword123'; >+ $authorized_patron->set_password({ password => $password, skip_validation => 1 }); >+ my $auth_userid = $authorized_patron->userid; >+ >+ my $unauthorized_patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 4 } >+ }); >+ $unauthorized_patron->set_password({ password => $password, skip_validation => 1 }); >+ my $unauth_userid = $unauthorized_patron->userid; >+ >+ my $order_obj = $builder->build_object( >+ { >+ class => 'Koha::Acquisition::Orders', >+ value => { >+ orderstatus => 'new', >+ unitprice => 10, >+ replacementprice => 10, >+ quantity => 2, >+ quantityreceived => 0, >+ datecancellationprinted => undef, >+ order_internalnote => 'This is a dummy note for testing' >+ } >+ } >+ ); >+ my $order = $order_obj->to_api; >+ $order_obj->delete; >+ delete $order->{ordernumber}; >+ $order->{uncertain_price} = Mojo::JSON->false; >+ >+ # Unauthorized attempt to write >+ $t->post_ok( "//$unauth_userid:$password@/api/v1/acquisitions/orders" => json => $order ) >+ ->status_is(403); >+ >+ # Authorized attempt to write invalid data >+ my $order_with_invalid_field = { %$order }; >+ $order_with_invalid_field->{'orderinvalid'} = 'Order invalid'; >+ >+ $t->post_ok( "//$auth_userid:$password@/api/v1/acquisitions/orders" => json => $order_with_invalid_field ) >+ ->status_is(400) >+ ->json_is( >+ "/errors" => [ >+ { >+ message => "Properties not allowed: orderinvalid.", >+ path => "/body" >+ } >+ ] >+ ); >+ >+ # Authorized attempt to write >+ $t->post_ok( "//$auth_userid:$password@/api/v1/acquisitions/orders" => json => $order ) >+ ->status_is( 201, 'SWAGGER3.2.1' ) >+ ->json_is( '/internal_note' => $order->{internal_note}, 'SWAGGER3.3.1' ) >+ ->header_like( Location => qr/\/api\/v1\/acquisitions\/orders\/\d*/, 'SWAGGER3.4.1' ); >+ >+ # save the order_id >+ my $order_id = $order->{order_id}; >+ # Authorized attempt to create with null id >+ $order->{order_id} = undef; >+ >+ $t->post_ok( "//$auth_userid:$password@/api/v1/acquisitions/orders" => json => $order ) >+ ->status_is(400) >+ ->json_has('/errors'); >+ >+ # Authorized attempt to create with existing id >+ $order->{order_id} = $order_id; >+ >+ warning_like { >+ $t->post_ok( "//$auth_userid:$password@/api/v1/acquisitions/orders" => json => $order ) >+ ->status_is(409) >+ ->json_has( '/error' => "Fails when trying to add an existing order_id") >+ ->json_is( '/conflict', 'PRIMARY' ); } # WTF >+ qr/^DBD::mysql::st execute failed: Duplicate entry '(.*)' for key 'PRIMARY'/; >+ >+ $schema->storage->txn_rollback; >+}; >+ >+subtest 'update() tests' => sub { >+ plan tests => 13; >+ >+ $schema->storage->txn_begin; >+ >+ my $authorized_patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 1 } >+ }); >+ my $password = 'thePassword123'; >+ $authorized_patron->set_password({ password => $password, skip_validation => 1 }); >+ my $auth_userid = $authorized_patron->userid; >+ >+ my $unauthorized_patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 4 } >+ }); >+ $unauthorized_patron->set_password({ password => $password, skip_validation => 1 }); >+ my $unauth_userid = $unauthorized_patron->userid; >+ >+ my $library = $builder->build_object({ class => 'Koha::Libraries' }); >+ my $library_id = $library->branchcode; >+ >+ # Unauthorized attempt to update >+ $t->put_ok( "//$unauth_userid:$password@/api/v1/libraries/$library_id" >+ => json => { name => 'New unauthorized name change' } ) >+ ->status_is(403); >+ >+ # Attempt partial update on a PUT >+ my $library_with_missing_field = { >+ address1 => "New library address", >+ }; >+ >+ $t->put_ok( "//$auth_userid:$password@/api/v1/libraries/$library_id" => json => $library_with_missing_field ) >+ ->status_is(400) >+ ->json_has( "/errors" => >+ [ { message => "Missing property.", path => "/body/address2" } ] >+ ); >+ >+ my $deleted_library = $builder->build_object( { class => 'Koha::Libraries' } ); >+ my $library_with_updated_field = Koha::REST::V1::Library::_to_api( $deleted_library->TO_JSON ); >+ $library_with_updated_field->{library_id} = $library_id; >+ $deleted_library->delete; >+ >+ $t->put_ok( "//$auth_userid:$password@/api/v1/libraries/$library_id" => json => $library_with_updated_field ) >+ ->status_is(200, 'SWAGGER3.2.1') >+ ->json_is( '' => $library_with_updated_field, 'SWAGGER3.3.3' ); >+ >+ # Authorized attempt to write invalid data >+ my $library_with_invalid_field = { %$library_with_updated_field }; >+ $library_with_invalid_field->{'branchinvalid'} = 'Library invalid'; >+ >+ $t->put_ok( "//$auth_userid:$password@/api/v1/libraries/$library_id" => json => $library_with_invalid_field ) >+ ->status_is(400) >+ ->json_is( >+ "/errors" => [ >+ { >+ message => "Properties not allowed: branchinvalid.", >+ path => "/body" >+ } >+ ] >+ ); >+ >+ my $non_existent_code = 'nope'.int(rand(10000)); >+ $t->put_ok("//$auth_userid:$password@/api/v1/libraries/$non_existent_code" => json => $library_with_updated_field) >+ ->status_is(404); >+ >+ $schema->storage->txn_rollback; >+}; >+ >+subtest 'delete() tests' => sub { >+ plan tests => 7; >+ >+ $schema->storage->txn_begin; >+ >+ my $authorized_patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 1 } >+ }); >+ my $password = 'thePassword123'; >+ $authorized_patron->set_password({ password => $password, skip_validation => 1 }); >+ my $auth_userid = $authorized_patron->userid; >+ >+ my $unauthorized_patron = $builder->build_object({ >+ class => 'Koha::Patrons', >+ value => { flags => 4 } >+ }); >+ $unauthorized_patron->set_password({ password => $password, skip_validation => 1 }); >+ my $unauth_userid = $unauthorized_patron->userid; >+ >+ my $order = $builder->build_object( { class => 'Koha::Acquisition::Orders' } ); >+ >+ # Unauthorized attempt to delete >+ $t->delete_ok( "//$unauth_userid:$password@/api/v1/acquisitions/orders/" . $order->ordernumber ) >+ ->status_is(403); >+ >+ $t->delete_ok( "//$auth_userid:$password@/api/v1/acquisitions/orders/" . $order->ordernumber ) >+ ->status_is(204, 'SWAGGER3.2.4') >+ ->content_is('', 'SWAGGER3.3.4'); >+ >+ $t->delete_ok( "//$auth_userid:$password@/api/v1/acquisitions/orders/" . $order->ordernumber ) >+ ->status_is(404); >+ >+ $schema->storage->txn_rollback; >+}; >-- >2.24.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 18731
:
69184
|
69185
|
69309
|
69310
|
69544
|
73959
|
73960
|
78435
|
78436
|
84133
|
84134
|
95054
|
95055
|
95056
|
96853
|
96854
|
96855
|
96856
|
96857
|
96858
|
96916
|
96917
|
96918
|
96938
|
96961
|
96962
|
96963
|
96964
|
96965
|
96966
|
97107
|
97108
|
97109
|
97110
|
97111
|
97112
|
97113
|
97331