]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/live_t/20-lp1541559-ebook-api.t
LP 1780660: Add more workstation functions to OpenILS::Utils::TestUtils.
[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 => 24; # 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 details for valid title ID.
61 my $title_001_details_req = $ebook_api->request(
62     'open-ils.ebook_api.title.details', $session_id, '001');
63 my $title_001_details = $title_001_details_req->recv->content;
64 ok(ref($title_001_details) && $title_001_details->{title}, 'Title details check 1/2 (valid title)');
65
66 # Title details for invalid title ID.
67 my $title_004_details_req = $ebook_api->request(
68     'open-ils.ebook_api.title.details', $session_id, '004');
69 my $title_004_details = $title_004_details_req->recv->content;
70 ok(ref($title_004_details) && $title_004_details->{error}, 'Title details check 1/2 (invalid title returns error message)');
71
72 # Title is not available.
73 my $title_001_avail_req = $ebook_api->request(
74     'open-ils.ebook_api.title.availability', $session_id, '001');
75 my $title_001_avail = $title_001_avail_req->recv->content;
76 is($title_001_avail, 0, 'Availability check 1/3 (not available)');
77
78 # Title is available.
79 my $title_003_avail_req = $ebook_api->request(
80     'open-ils.ebook_api.title.availability', $session_id, '003');
81 my $title_003_avail = $title_003_avail_req->recv->content;
82 is($title_003_avail, 1, 'Availability check 2/3 (available)');
83
84 # Title is not found (availability lookup returns undef).
85 my $title_004_avail_req = $ebook_api->request(
86     'open-ils.ebook_api.title.availability', $session_id, '004');
87 my $title_004_avail = (defined $title_004_avail_req && defined $title_004_avail_req->recv) ? $title_004_avail_req->recv->content : undef;
88 is($title_004_avail, undef, 'Availability check 3/3 (not found)');
89
90 # Title has holdings, none available.
91 my $title_001_holdings_req = $ebook_api->request(
92     'open-ils.ebook_api.title.holdings', $session_id, '001');
93 my $title_001_holdings = $title_001_holdings_req->recv->content;
94 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)');
95
96 # Title has holdings, one copy available.
97 my $title_003_holdings_req = $ebook_api->request(
98     'open-ils.ebook_api.title.holdings', $session_id, '003');
99 my $title_003_holdings = $title_003_holdings_req->recv->content;
100 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)');
101
102 # Title not found, no holdings.
103 my $title_004_holdings_req = $ebook_api->request(
104     'open-ils.ebook_api.title.holdings', $session_id, '004');
105 my $title_004_holdings = $title_004_holdings_req->recv->content;
106 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)');
107
108 # ------------------------------------------------------------ 
109 # 4. Patron authentication and caching.
110 # ------------------------------------------------------------ 
111
112 # Authenticate our test patron.
113 $script->authenticate({
114         username => EBOOK_API_PATRON_USERNAME,
115         password => EBOOK_API_PATRON_PASSWORD,
116         type => 'opac'
117     });
118 ok($script->authtoken, 'Have an authtoken');
119 my $authtoken = $script->authtoken;
120
121 # open-ils.ebook_api.patron.cache_password
122 my $updated_cache_id_req = $ebook_api->request(
123     'open-ils.ebook_api.patron.cache_password', $session_id, EBOOK_API_PATRON_PASSWORD);
124 my $updated_cache_id = $updated_cache_id_req->recv->content;
125 ok($updated_cache_id eq $session_id, 'Session cache was updated with patron password');
126
127 # ------------------------------------------------------------ 
128 # 5. Patron transactions.
129 # ------------------------------------------------------------ 
130
131 # open-ils.ebook_api.patron.get_checkouts
132 my $checkouts_req = $ebook_api->request(
133     'open-ils.ebook_api.patron.get_checkouts', $authtoken, $session_id, EBOOK_API_PATRON_USERNAME);
134 my $checkouts = $checkouts_req->recv->content;
135 ok(ref($checkouts) && defined $checkouts->[0]->{title_id}, 'Retrieved ebook checkouts for patron');
136
137 # open-ils.ebook_api.patron.get_holds
138 my $holds_req = $ebook_api->request(
139     'open-ils.ebook_api.patron.get_holds', $authtoken, $session_id, EBOOK_API_PATRON_USERNAME);
140 my $holds = $holds_req->recv->content;
141 ok(ref($holds) && defined $holds->[0]->{title_id}, 'Retrieved ebook holds for patron');
142
143 # open-ils.ebook_api.patron.get_transactions
144 my $xacts_req = $ebook_api->request(
145     'open-ils.ebook_api.patron.get_transactions', $authtoken, $session_id, EBOOK_API_PATRON_USERNAME);
146 my $xacts = $xacts_req->recv->content;
147 ok(ref($xacts) && exists $xacts->{checkouts} && exists $xacts->{holds}, 'Retrieved transactions for patron');
148 ok(defined $xacts->{checkouts}->[0]->{title_id}, 'Retrieved transactions include checkouts');
149 ok(defined $xacts->{holds}->[0]->{title_id}, 'Retrieved transactions include holds');
150
151 # open-ils.ebook_api.checkout
152 my $checkout_req = $ebook_api->request(
153     'open-ils.ebook_api.checkout', $authtoken, $session_id, '003', EBOOK_API_PATRON_USERNAME);
154 my $checkout = $checkout_req->recv->content;
155 ok(exists $checkout->{due_date}, 'Ebook checked out');
156
157 # open-ils.ebook_api.title.get_download_link
158 my $request_link = 'http://example.com/ebookapi/t/003';
159 my $download_link_req = $ebook_api->request(
160     'open-ils.ebook_api.title.get_download_link', $authtoken, $session_id, $request_link);
161 my $download_link = $download_link_req->recv->content;
162 # Test module just returns the original request_link as the response.
163 ok($download_link eq $request_link, 'Received download link for ebook');
164
165 # open-ils.ebook_api.renew
166 my $renew_req = $ebook_api->request(
167     'open-ils.ebook_api.renew', $authtoken, $session_id, '001', EBOOK_API_PATRON_USERNAME);
168 my $renew = $renew_req->recv->content;
169 ok(exists $renew->{due_date}, 'Ebook renewed');
170
171 # open-ils.ebook_api.checkin
172 my $checkin_req = $ebook_api->request(
173     'open-ils.ebook_api.checkin', $authtoken, $session_id, '003', EBOOK_API_PATRON_USERNAME);
174 my $checkin = $checkin_req->recv->content;
175 ok(ref($checkin) && !exists $checkin->{error_msg}, 'Ebook checked in');
176
177 # open-ils.ebook_api.cancel_hold
178 my $cancel_hold_req = $ebook_api->request(
179     'open-ils.ebook_api.cancel_hold', $authtoken, $session_id, '002', EBOOK_API_PATRON_USERNAME);
180 my $cancel_hold = $cancel_hold_req->recv->content;
181 ok(ref($cancel_hold) && !exists $checkin->{error_msg}, 'Ebook hold canceled');
182
183 # open-ils.ebook_api.place_hold
184 my $place_hold_req = $ebook_api->request(
185     'open-ils.ebook_api.place_hold', $authtoken, $session_id, '002', EBOOK_API_PATRON_USERNAME);
186 my $place_hold = $place_hold_req->recv->content;
187 ok(exists $place_hold->{expire_date}, 'Ebook hold placed');
188
189 # TODO: suspend hold
190