]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/live_t/20-lp1541559-ebook-api.t
LP#1670407 Add tests for xact_finish close/re-open
[working/Evergreen.git] / Open-ILS / src / perlmods / live_t / 20-lp1541559-ebook-api.t
1 #!perl
2 use strict; use warnings;
3 use Test::More tests => 21; # XXX
4 use OpenILS::Utils::TestUtils;
5
6 diag("Tests Ebook API");
7
8 # ------------------------------------------------------------ 
9 # 1. Set up test environment.
10 # ------------------------------------------------------------ 
11
12 use constant EBOOK_API_VENDOR => 'ebook_test';
13 use constant EBOOK_API_OU => 1;
14
15 # Title IDs:
16 # 001 - checked out to test user
17 # 002 - not available (checked out to another user)
18 # 003 - available
19 # 004 - not found (invalid/does not exist in external system)
20
21 # Patrons.
22 use constant EBOOK_API_PATRON_USERNAME  => '99999359616';
23 use constant EBOOK_API_PATRON_PASSWORD  => 'andreac1234';
24 use constant EBOOK_API_PATRON_NOT_FOUND => 'patron-not-found';
25
26 my $script = OpenILS::Utils::TestUtils->new();
27 $script->bootstrap;
28
29 my $ebook_api = $script->session('open-ils.ebook_api');
30
31 # ------------------------------------------------------------ 
32 # 2. Sessions.
33 # ------------------------------------------------------------ 
34
35 # Initiate a new EbookAPI session and get a session ID.
36 # Returns undef unless a new session was created.
37 my $session_id_req = $ebook_api->request(
38     'open-ils.ebook_api.start_session', EBOOK_API_VENDOR, EBOOK_API_OU);
39 my $session_id = $session_id_req->recv->content;
40 ok($session_id, 'Initiated an EbookAPI session');
41
42 # Check that an EbookAPI session exists matching our session ID.
43 my $ck_session_id_req = $ebook_api->request(
44         'open-ils.ebook_api.check_session', $session_id, EBOOK_API_VENDOR, EBOOK_API_OU);
45 my $ck_session_id = $ck_session_id_req->recv->content;
46 ok($ck_session_id eq $session_id, 'Validated existing EbookAPI session');
47
48 # Given an invalid or expired session ID, fallback to initiating 
49 # a new EbookAPI session, which gives us a new session ID.
50 # Returns undef unless a new session was created.
51 my $new_session_id_req = $ebook_api->request(
52     'open-ils.ebook_api.check_session', '', EBOOK_API_VENDOR, EBOOK_API_OU);
53 my $new_session_id = $new_session_id_req->recv->content;
54 ok($new_session_id, 'Initiated new EbookAPI session when valid session ID not provided');
55
56 # ------------------------------------------------------------ 
57 # 3. Title availability and holdings.
58 # ------------------------------------------------------------ 
59
60 # Title is not available.
61 my $title_001_avail_req = $ebook_api->request(
62     'open-ils.ebook_api.title.availability', $session_id, '001');
63 my $title_001_avail = $title_001_avail_req->recv->content;
64 is($title_001_avail, 0, 'Availability check 1/3 (not available)');
65
66 # Title is available.
67 my $title_003_avail_req = $ebook_api->request(
68     'open-ils.ebook_api.title.availability', $session_id, '003');
69 my $title_003_avail = $title_003_avail_req->recv->content;
70 is($title_003_avail, 1, 'Availability check 2/3 (available)');
71
72 # Title is not found (availability lookup returns undef).
73 my $title_004_avail_req = $ebook_api->request(
74     'open-ils.ebook_api.title.availability', $session_id, '004');
75 my $title_004_avail = (defined $title_004_avail_req && defined $title_004_avail_req->recv) ? $title_004_avail_req->recv->content : undef;
76 is($title_004_avail, undef, 'Availability check 3/3 (not found)');
77
78 # Title has holdings, none available.
79 my $title_001_holdings_req = $ebook_api->request(
80     'open-ils.ebook_api.title.holdings', $session_id, '001');
81 my $title_001_holdings = $title_001_holdings_req->recv->content;
82 ok(ref($title_001_holdings) && $title_001_holdings->{copies_owned} == 1 && $title_001_holdings->{copies_available} == 0 && $title_001_holdings->{formats}->[0] eq 'ebook', 'Holdings check 1/3 (1 owned, 0 available)');
83
84 # Title has holdings, one copy available.
85 my $title_003_holdings_req = $ebook_api->request(
86     'open-ils.ebook_api.title.holdings', $session_id, '003');
87 my $title_003_holdings = $title_003_holdings_req->recv->content;
88 ok(ref($title_003_holdings) && $title_003_holdings->{copies_owned} == 1 && $title_003_holdings->{copies_available} == 1 && $title_003_holdings->{formats}->[0] eq 'ebook', 'Holdings check 2/3 (1 owned, 1 available)');
89
90 # Title not found, no holdings.
91 my $title_004_holdings_req = $ebook_api->request(
92     'open-ils.ebook_api.title.holdings', $session_id, '004');
93 my $title_004_holdings = $title_004_holdings_req->recv->content;
94 ok(ref($title_004_holdings) && $title_004_holdings->{copies_owned} == 0 && $title_004_holdings->{copies_available} == 0 && scalar(@{$title_004_holdings->{formats}}) == 0, 'Holdings check 3/3 (0 owned, 0 available)');
95
96 # ------------------------------------------------------------ 
97 # 4. Patron authentication and caching.
98 # ------------------------------------------------------------ 
99
100 # Authenticate our test patron.
101 $script->authenticate({
102         username => EBOOK_API_PATRON_USERNAME,
103         password => EBOOK_API_PATRON_PASSWORD,
104         type => 'opac'
105     });
106 ok($script->authtoken, 'Have an authtoken');
107 my $authtoken = $script->authtoken;
108
109 # open-ils.ebook_api.patron.cache_password
110 my $updated_cache_id_req = $ebook_api->request(
111     'open-ils.ebook_api.patron.cache_password', $session_id, EBOOK_API_PATRON_PASSWORD);
112 my $updated_cache_id = $updated_cache_id_req->recv->content;
113 ok($updated_cache_id eq $session_id, 'Session cache was updated with patron password');
114
115 # ------------------------------------------------------------ 
116 # 5. Patron transactions.
117 # ------------------------------------------------------------ 
118
119 # open-ils.ebook_api.patron.get_checkouts
120 my $checkouts_req = $ebook_api->request(
121     'open-ils.ebook_api.patron.get_checkouts', $authtoken, $session_id, EBOOK_API_PATRON_USERNAME);
122 my $checkouts = $checkouts_req->recv->content;
123 ok(ref($checkouts) && defined $checkouts->[0]->{title_id}, 'Retrieved ebook checkouts for patron');
124
125 # open-ils.ebook_api.patron.get_holds
126 my $holds_req = $ebook_api->request(
127     'open-ils.ebook_api.patron.get_holds', $authtoken, $session_id, EBOOK_API_PATRON_USERNAME);
128 my $holds = $holds_req->recv->content;
129 ok(ref($holds) && defined $holds->[0]->{title_id}, 'Retrieved ebook holds for patron');
130
131 # open-ils.ebook_api.patron.get_transactions
132 my $xacts_req = $ebook_api->request(
133     'open-ils.ebook_api.patron.get_transactions', $authtoken, $session_id, EBOOK_API_PATRON_USERNAME);
134 my $xacts = $xacts_req->recv->content;
135 ok(ref($xacts) && exists $xacts->{checkouts} && exists $xacts->{holds}, 'Retrieved transactions for patron');
136 ok(defined $xacts->{checkouts}->[0]->{title_id}, 'Retrieved transactions include checkouts');
137 ok(defined $xacts->{holds}->[0]->{title_id}, 'Retrieved transactions include holds');
138
139 # open-ils.ebook_api.checkout
140 my $checkout_req = $ebook_api->request(
141     'open-ils.ebook_api.checkout', $authtoken, $session_id, '003', EBOOK_API_PATRON_USERNAME);
142 my $checkout = $checkout_req->recv->content;
143 ok(exists $checkout->{due_date}, 'Ebook checked out');
144
145 # open-ils.ebook_api.renew
146 my $renew_req = $ebook_api->request(
147     'open-ils.ebook_api.renew', $authtoken, $session_id, '001', EBOOK_API_PATRON_USERNAME);
148 my $renew = $renew_req->recv->content;
149 ok(exists $renew->{due_date}, 'Ebook renewed');
150
151 # open-ils.ebook_api.checkin
152 my $checkin_req = $ebook_api->request(
153     'open-ils.ebook_api.checkin', $authtoken, $session_id, '003', EBOOK_API_PATRON_USERNAME);
154 my $checkin = $checkin_req->recv->content;
155 ok(ref($checkin) && !exists $checkin->{error_msg}, 'Ebook checked in');
156
157 # open-ils.ebook_api.cancel_hold
158 my $cancel_hold_req = $ebook_api->request(
159     'open-ils.ebook_api.cancel_hold', $authtoken, $session_id, '002', EBOOK_API_PATRON_USERNAME);
160 my $cancel_hold = $cancel_hold_req->recv->content;
161 ok(ref($cancel_hold) && !exists $checkin->{error_msg}, 'Ebook hold canceled');
162
163 # open-ils.ebook_api.place_hold
164 my $place_hold_req = $ebook_api->request(
165     'open-ils.ebook_api.place_hold', $authtoken, $session_id, '002', EBOOK_API_PATRON_USERNAME);
166 my $place_hold = $place_hold_req->recv->content;
167 ok(exists $place_hold->{expire_date}, 'Ebook hold placed');
168
169 # TODO: suspend hold
170