Merge remote branch 'kc/new/enh/bug_5432' into kcmaster
[koha.git] / C4 / SIP / t / 07hold.t
1 #!/usr/bin/perl
2 # patron_enable: test  Patron Enable Response
3
4 use strict;
5 use warnings;
6 use Clone qw(clone);
7
8 use Sip::Constants qw(:all);
9
10 use SIPtest qw(:basic :user1 :user2 :item1 :item2);
11
12 my $hold_test_template = {
13     id => "Place Hold: valid item ($item_barcode), valid patron ($user_barcode)",        #BS could be another branch
14     msg => "15+20060415    110158BW20060815    110158|BS$instid|BY2|AO$instid|AA$user_barcode|AB$item_barcode|",
15     pat => qr/^161Y$datepat/,
16     fields => [
17                $SIPtest::field_specs{(FID_INST_ID)},
18                $SIPtest::field_specs{(FID_SCREEN_MSG)},
19                $SIPtest::field_specs{(FID_PRINT_LINE)},
20                { field    => FID_PATRON_ID,
21                  pat      => qr/^$user_barcode$/,
22                  required => 1, },
23                { field    => FID_EXPIRATION,
24                  pat      => $datepat,
25                  required => 0, },
26                { field    => FID_QUEUE_POS,
27                  pat      => qr/^1$/,
28                  required => 0, },
29                { field    => FID_PICKUP_LOCN,
30                  pat      => qr/^$item_owner$/,
31                  required => 0, },
32                { field    => FID_TITLE_ID,
33                  pat      => qr/^$item_title$/,
34                  required => 0, },
35                { field    => FID_ITEM_ID,
36                  pat      => qr/^$item_barcode$/,
37                  required => 0, },
38                ],};
39
40 my $tmp_msg = "6300020060329    201700          AO$instid|AA$user_barcode|";
41 my $hold_count_test_template0 = {
42     id => "Confirm patron ($user_barcode) has 0 holds",
43     msg => $tmp_msg,
44     pat => qr/^64 [ Y]{13}\d{3}${datepat}0000(\d{4}){5}/,
45     fields => [],
46 };
47 my $hold_count_test_template1 = {
48     id => "Confirm patron ($user_barcode) has 1 hold",
49     msg => $tmp_msg,
50     pat => qr/^64 [ Y]{13}\d{3}${datepat}((0001(\d{4}){4}0000)|(0000(\d{4}){4}0001))/,
51                 # The tricky part at the end here is because we don't know whether
52                 # the hold will count as "waiting" or unavailable.
53                 # But it will be one or the other!
54     fields => [],
55 };
56
57 my @tests = (
58              $SIPtest::login_test,                                                              # 1
59              $SIPtest::sc_status_test,                                                  # 2
60              $hold_test_template, $hold_count_test_template1,   # 3,4
61              );
62
63 my $test;
64
65 # Hold Queue: second hold placed on item
66 $test = clone($hold_test_template);
67 $test->{id} = "Place 2nd hold on item ($item_barcode) for user ($user2_barcode)";
68 $test->{msg} =~ s/AA$user_barcode\|/AA$user2_barcode|/;
69 $test->{pat} = qr/^161N$datepat/;
70 foreach my $i (0 .. (scalar @{$test->{fields}})-1) {
71         my $field =  $test->{fields}[$i];
72         if ($field->{field} eq FID_PATRON_ID) {
73                 $field->{pat} = qr/^$user2_barcode$/;
74         } elsif ($field->{field} eq FID_QUEUE_POS) {
75                 $field->{pat} = qr/^2$/;
76         }
77 }
78
79 push @tests, $test;                                                                                     # 5
80
81 # Cancel hold: valid hold
82 $test = clone($hold_test_template);
83 $test->{id} = "Cancel Hold: valid hold for user ($user_barcode)";
84 $test->{msg} =~ s/\+/-/;
85 $test->{pat} = qr/^161[NY]$datepat/;
86 delete $test->{fields};
87 $test->{fields} = [
88                    $SIPtest::field_specs{(FID_INST_ID)},
89                    $SIPtest::field_specs{(FID_SCREEN_MSG)},
90                    $SIPtest::field_specs{(FID_PRINT_LINE)},
91                    { field    => FID_PATRON_ID,
92                      pat      => qr/^$user_barcode$/,
93                      required => 1, },
94                    ];
95
96 push @tests, $test, $hold_count_test_template0;                         # 6,7
97
98 # Cancel Hold: no hold on item
99 # $test is already set up to cancel a hold, just change
100 # the field tests
101 $test = clone($test);
102 $test->{id} = 'Cancel Hold: no hold on specified item';
103 $test->{pat} = qr/^160N$datepat/;
104
105 push @tests, $test, $hold_count_test_template0;                         # 8,9
106
107 # Cleanup: cancel 2nd user's hold too.
108 $test = clone($hold_test_template);
109 $test->{id} = "Cancel hold: cleanup hold for 2nd patron ($user2_barcode)";
110 $test->{msg} =~ s/\+/-/;
111 $test->{msg} =~ s/$user_barcode/$user2_barcode/;
112 $test->{pat} = qr/^161[NY]$datepat/;
113 delete $test->{fields};
114 $test->{fields} = [
115                    $SIPtest::field_specs{(FID_INST_ID)},
116                    $SIPtest::field_specs{(FID_SCREEN_MSG)},
117                    $SIPtest::field_specs{(FID_PRINT_LINE)},
118                    { field    => FID_PATRON_ID,
119                      pat      => qr/^$user2_barcode$/,
120                      required => 1, },
121                    ];
122
123 push @tests, $test;                                                                                     # 11
124
125 # Place hold: valid patron, item, invalid patron pwd
126 $test = clone($hold_test_template);
127 $test->{id} = 'Place hold: invalid patron password';
128 $test->{msg} .= FID_PATRON_PWD . 'bad password|';
129 $test->{pat} = qr/^160N$datepat/;
130 delete $test->{fields};
131 $test->{fields} = [
132                    $SIPtest::field_specs{(FID_INST_ID)},
133                    $SIPtest::field_specs{(FID_SCREEN_MSG)},
134                    $SIPtest::field_specs{(FID_PRINT_LINE)},
135                    { field    => FID_PATRON_ID,
136                      pat      => qr/^$user_barcode$/,
137                      required => 1, },
138                    ];
139
140 push @tests, $test, $hold_count_test_template0;                         # 12,13
141
142 # Place hold: invalid patron
143 $test = clone($hold_test_template);
144 $test->{id} = 'Place hold: invalid patron';
145 $test->{msg} =~ s/AA$user_barcode\|/AAbad_barcode|/;
146 $test->{pat} = qr/^160N$datepat/;
147 delete $test->{fields};
148 $test->{fields} = [
149                    $SIPtest::field_specs{(FID_INST_ID)},
150                    $SIPtest::field_specs{(FID_SCREEN_MSG)},
151                    $SIPtest::field_specs{(FID_PRINT_LINE)},
152                    { field    => FID_PATRON_ID,
153                      pat      => qr/^bad_barcode$/,
154                      required => 1, },
155                    ];
156
157 # There's no patron to check the number of holds against
158 push @tests, $test;                                                                                     # 14
159
160 # Place hold: invalid item
161 $test = clone($hold_test_template);
162 $test->{id} = 'Place hold: invalid item';
163 $test->{msg} =~ s/AB$item_barcode\|/ABnosuchitem|/;
164 $test->{pat} = qr/^160N$datepat/;
165 delete $test->{fields};
166 $test->{fields} = [
167                    $SIPtest::field_specs{(FID_INST_ID)},
168                    $SIPtest::field_specs{(FID_SCREEN_MSG)},
169                    $SIPtest::field_specs{(FID_PRINT_LINE)},
170                    { field    => FID_PATRON_ID,
171                      pat      => qr/^$user_barcode$/,
172                      required => 1, },
173                    { field    => FID_ITEM_ID,
174                      pat      => qr/^nosuchitem$/,
175                      required => 0, },
176                    ];
177
178 push @tests, $test, $hold_count_test_template0;                         # 15
179
180 # Still need tests for:
181 #     - valid patron not permitted to place holds
182 #     - valid item, not allowed to hold item
183 #     - multiple holds on item: correct queue position management
184 #     - setting and verifying hold expiry dates (requires ILS support)
185 #     - 3M checkin extensions for hold/ILL routing
186
187 SIPtest::run_sip_tests(@tests);
188
189 1;