Bug 7317: Interlibrary loans framework for Koha.
[koha.git] / t / db_dependent / api / v1 / illrequests.t
1 #!/usr/bin/env perl
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 3 of the License, or (at your option) any later
8 # version.
9 #
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License along
15 # with Koha; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18 use Modern::Perl;
19
20 use Test::More tests => 1;
21 use Test::Mojo;
22 use Test::Warn;
23
24 use t::lib::TestBuilder;
25 use t::lib::Mocks;
26
27 use C4::Auth;
28 use Koha::Illrequests;
29
30 my $schema  = Koha::Database->new->schema;
31 my $builder = t::lib::TestBuilder->new;
32
33 # FIXME: sessionStorage defaults to mysql, but it seems to break transaction handling
34 # this affects the other REST api tests
35 t::lib::Mocks::mock_preference( 'SessionStorage', 'tmp' );
36
37 my $remote_address = '127.0.0.1';
38 my $t              = Test::Mojo->new('Koha::REST::V1');
39
40 subtest 'list() tests' => sub {
41
42     plan tests => 6;
43
44     $schema->storage->txn_begin;
45
46     Koha::Illrequests->search->delete;
47     my ( $borrowernumber, $session_id ) =
48       create_user_and_session( { authorized => 1 } );
49
50     ## Authorized user tests
51     # No requests, so empty array should be returned
52     my $tx = $t->ua->build_tx( GET => '/api/v1/illrequests' );
53     $tx->req->cookies( { name => 'CGISESSID', value => $session_id } );
54     $tx->req->env( { REMOTE_ADDR => $remote_address } );
55     $t->request_ok($tx)->status_is(200)->json_is( [] );
56
57 #    my $city_country = 'France';
58 #    my $city         = $builder->build(
59 #        { source => 'City', value => { city_country => $city_country } } );
60 #
61 #    # One city created, should get returned
62 #    $tx = $t->ua->build_tx( GET => '/api/v1/cities' );
63 #    $tx->req->cookies( { name => 'CGISESSID', value => $session_id } );
64 #    $tx->req->env( { REMOTE_ADDR => $remote_address } );
65 #    $t->request_ok($tx)->status_is(200)->json_is( [$city] );
66 #
67 #    my $another_city = $builder->build(
68 #        { source => 'City', value => { city_country => $city_country } } );
69 #    my $city_with_another_country = $builder->build( { source => 'City' } );
70 #
71 #    # Two cities created, they should both be returned
72 #    $tx = $t->ua->build_tx( GET => '/api/v1/cities' );
73 #    $tx->req->cookies( { name => 'CGISESSID', value => $session_id } );
74 #    $tx->req->env( { REMOTE_ADDR => $remote_address } );
75 #    $t->request_ok($tx)->status_is(200)
76 #      ->json_is( [ $city, $another_city, $city_with_another_country ] );
77 #
78 #    # Filtering works, two cities sharing city_country
79 #    $tx =
80 #      $t->ua->build_tx( GET => "/api/v1/cities?city_country=" . $city_country );
81 #    $tx->req->cookies( { name => 'CGISESSID', value => $session_id } );
82 #    $tx->req->env( { REMOTE_ADDR => $remote_address } );
83 #    my $result =
84 #      $t->request_ok($tx)->status_is(200)->json_is( [ $city, $another_city ] );
85 #
86 #    $tx = $t->ua->build_tx(
87 #        GET => "/api/v1/cities?city_name=" . $city->{city_name} );
88 #    $tx->req->cookies( { name => 'CGISESSID', value => $session_id } );
89 #    $tx->req->env( { REMOTE_ADDR => $remote_address } );
90 #    $t->request_ok($tx)->status_is(200)->json_is( [$city] );
91
92     # Warn on unsupported query parameter
93     $tx = $t->ua->build_tx( GET => '/api/v1/illrequests?request_blah=blah' );
94     $tx->req->cookies( { name => 'CGISESSID', value => $session_id } );
95     $tx->req->env( { REMOTE_ADDR => $remote_address } );
96     $t->request_ok($tx)->status_is(400)->json_is(
97         [{ path => '/query/request_blah', message => 'Malformed query string'}]
98     );
99
100     $schema->storage->txn_rollback;
101 };
102
103 sub create_user_and_session {
104
105     my $args  = shift;
106     my $flags = ( $args->{authorized} ) ? $args->{authorized} : 0;
107     my $dbh   = C4::Context->dbh;
108
109     my $user = $builder->build(
110         {
111             source => 'Borrower',
112             value  => {
113                 flags => $flags
114             }
115         }
116     );
117
118     # Create a session for the authorized user
119     my $session = C4::Auth::get_session('');
120     $session->param( 'number',   $user->{borrowernumber} );
121     $session->param( 'id',       $user->{userid} );
122     $session->param( 'ip',       '127.0.0.1' );
123     $session->param( 'lasttime', time() );
124     $session->flush;
125
126     if ( $args->{authorized} ) {
127         $dbh->do( "
128             INSERT INTO user_permissions (borrowernumber,module_bit,code)
129             VALUES (?,3,'parameters_remaining_permissions')", undef,
130             $user->{borrowernumber} );
131     }
132
133     return ( $user->{borrowernumber}, $session->id );
134 }
135
136 1;