2 use strict; use warnings;
3 use Test::More tests => 21; # 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 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)');
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)');
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)');
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)');
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)');
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)');
96 # ------------------------------------------------------------
97 # 4. Patron authentication and caching.
98 # ------------------------------------------------------------
100 # Authenticate our test patron.
101 $script->authenticate({
102 username => EBOOK_API_PATRON_USERNAME,
103 password => EBOOK_API_PATRON_PASSWORD,
106 ok($script->authtoken, 'Have an authtoken');
107 my $authtoken = $script->authtoken;
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');
115 # ------------------------------------------------------------
116 # 5. Patron transactions.
117 # ------------------------------------------------------------
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');
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');
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');
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');
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');
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');
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');
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');