2 use strict; use warnings;
3 use Test::More tests => 24; # XXX
4 use OpenILS::Utils::TestUtils;
6 diag("Tests Ebook API");
8 # ------------------------------------------------------------
9 # 1. Set up test environment.
10 # ------------------------------------------------------------
12 use constant EBOOK_API_VENDOR => 'ebook_test';
13 use constant EBOOK_API_OU => 1;
16 # 001 - checked out to test user
17 # 002 - not available (checked out to another user)
19 # 004 - not found (invalid/does not exist in external system)
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';
26 my $script = OpenILS::Utils::TestUtils->new();
29 my $ebook_api = $script->session('open-ils.ebook_api');
31 # ------------------------------------------------------------
33 # ------------------------------------------------------------
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');
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');
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');
56 # ------------------------------------------------------------
57 # 3. Title availability and holdings.
58 # ------------------------------------------------------------
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)');
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)');
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)');
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)');
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)');
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)');
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)');
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)');
108 # ------------------------------------------------------------
109 # 4. Patron authentication and caching.
110 # ------------------------------------------------------------
112 # Authenticate our test patron.
113 $script->authenticate({
114 username => EBOOK_API_PATRON_USERNAME,
115 password => EBOOK_API_PATRON_PASSWORD,
118 ok($script->authtoken, 'Have an authtoken');
119 my $authtoken = $script->authtoken;
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');
127 # ------------------------------------------------------------
128 # 5. Patron transactions.
129 # ------------------------------------------------------------
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');
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');
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');
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');
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');
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');
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');
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');
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');