Bug 23463: Replace AddItem calls with Koha::Item->store
[koha.git] / t / db_dependent / ShelfBrowser.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4 use Test::More tests => 74;
5 use List::Util qw( shuffle );
6 use MARC::Field;
7 use MARC::Record;
8
9 use C4::Context;
10 use C4::Items;
11 use C4::Biblio;
12 use Koha::Database;
13
14 use t::lib::TestBuilder;
15
16 use_ok('C4::ShelfBrowser');
17
18 my $schema = Koha::Database->schema;
19 $schema->storage->txn_begin;
20 my $builder = t::lib::TestBuilder->new;
21 my $dbh = C4::Context->dbh;
22 $dbh->{RaiseError} = 1;
23
24 $dbh->do(q|DELETE FROM reserves|);
25 $dbh->do(q|DELETE FROM issues|);
26 $dbh->do(q|DELETE FROM items|);
27
28 my $library = $builder->build({
29     source => 'Branch',
30 });
31
32 my $cn;
33
34 # 100.100 150.100 200.100 210.100 300.000 320.000 400.100 410.100 500.100 510.100 520.100 600.000 610.000 700.100 710.100 720.100 730.100 740.100 750.100
35 my @callnumbers = qw(
36     100.100
37     150.100
38     200.100
39     210.100
40     300.000
41     320.000
42     400.100
43     410.100
44     500.100
45     510.100
46     520.100
47     600.000
48     610.000
49     700.100
50     710.100
51     720.100
52     730.100
53     740.100
54     750.100
55 );
56
57 my $record = MARC::Record->new();
58 $record->append_fields(
59     MARC::Field->new('100', ' ', ' ', a => 'Donald E. Knuth.'),
60     MARC::Field->new('245', ' ', ' ', a => 'The art of computer programming'),
61 );
62 my ( $biblionumber ) = C4::Biblio::AddBiblio($record, '');
63
64 for my $callnumber ( shuffle @callnumbers ) {
65     my $itemnumber = $builder->build_sample_item(
66         {
67             biblionumber   => $biblionumber,
68             library        => $library->{branchcode},
69             itemcallnumber => $callnumber,
70         }
71     )->itemnumber;
72     $cn->{$callnumber} = {
73         biblionumber => $biblionumber,
74         itemnumber => $itemnumber,
75         itemcallnumber => $callnumber,
76     }
77 }
78
79 my $nearby;
80
81 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'500.100'}{itemnumber} );
82 # We have
83 # < 320.000 400.100 410.100 500.100 510.100 520.100 600.000 >
84 #      6       7       8      [9]       10      11      12
85 # Clicking on previous, we want a link to 150.100
86 is( $nearby->{prev_item}{itemcallnumber}, '150.100', "Simple case: previous link 1/2" );
87 is( $nearby->{prev_item}{itemnumber}, $cn->{'150.100'}{itemnumber}, "Simple case: previous link 2/2" );
88 # Clicking on next, we want a link to 730.100
89 is( $nearby->{next_item}{itemcallnumber}, '720.100', "Simple case: next link 1/2" );
90 is( $nearby->{next_item}{itemnumber}, $cn->{'720.100'}{itemnumber}, "Simple case: next link 2/2" );
91
92 is( $nearby->{items}[0]{itemcallnumber}, '320.000', "Simple case: item 1");
93 is( $nearby->{items}[1]{itemcallnumber}, '400.100', "Simple case: item 2");
94 is( $nearby->{items}[2]{itemcallnumber}, '410.100', "Simple case: item 3");
95 is( $nearby->{items}[3]{itemcallnumber}, '500.100', "Simple case: item 4");
96 is( $nearby->{items}[4]{itemcallnumber}, '510.100', "Simple case: item 5");
97 is( $nearby->{items}[5]{itemcallnumber}, '520.100', "Simple case: item 6");
98 is( $nearby->{items}[6]{itemcallnumber}, '600.000', "Simple case: item 7");
99
100 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'500.100'}{itemnumber}, 2, 3 );
101 # We have
102 # < 400.100 410.100 500.100 510.100 520.100 >
103 #      7       8      [9]       10      11
104 # Clicking on previous, we want a link to 320.000
105 is( $nearby->{prev_item}{itemcallnumber}, '320.000', "Test gap: previous link 1/2" );
106 is( $nearby->{prev_item}{itemnumber}, $cn->{'320.000'}{itemnumber}, "Test gap: previous link 2/2" );
107 # Clicking on next, we want a link to 600.000
108 is( $nearby->{next_item}{itemcallnumber}, '600.000', "Test gap: next link 1/2" );
109 is( $nearby->{next_item}{itemnumber}, $cn->{'600.000'}{itemnumber}, "Test gap: next link 2/2" );
110
111 is( scalar( @{$nearby->{items}} ), 5, "Test gap: got 5 items" );
112 is( $nearby->{items}[0]{itemcallnumber}, '400.100', "Test gap: item 1");
113 is( $nearby->{items}[1]{itemcallnumber}, '410.100', "Test gap: item 2");
114 is( $nearby->{items}[2]{itemcallnumber}, '500.100', "Test gap: item 3");
115 is( $nearby->{items}[3]{itemcallnumber}, '510.100', "Test gap: item 4");
116 is( $nearby->{items}[4]{itemcallnumber}, '520.100', "Test gap: item 5");
117
118 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'300.000'}{itemnumber} );
119 # We have
120 # < 150.100 200.100 210.100 300.000 320.000 400.100 410.100 >
121 #      2       3       4      [5]      6       7       8
122 # Clicking on previous, we want a link to 100.100
123 is( $nearby->{prev_item}{itemcallnumber}, '100.100', "Test start shelf: previous link 1/2" );
124 is( $nearby->{prev_item}{itemnumber}, $cn->{'100.100'}{itemnumber}, "Test start shelf: previous link 2/2" );
125 # Clicking on next, we want a link to 600.000
126 is( $nearby->{next_item}{itemcallnumber}, '600.000', "Test start shelf: next link 1/2" );
127 is( $nearby->{next_item}{itemnumber}, $cn->{'600.000'}{itemnumber}, "Test start shelf: next link 2/2" );
128
129 is( $nearby->{items}[0]{itemcallnumber}, '150.100', "Test start shelf: item 1");
130 is( $nearby->{items}[1]{itemcallnumber}, '200.100', "Test start shelf: item 2");
131 is( $nearby->{items}[2]{itemcallnumber}, '210.100', "Test start shelf: item 3");
132 is( $nearby->{items}[3]{itemcallnumber}, '300.000', "Test start shelf: item 4");
133 is( $nearby->{items}[4]{itemcallnumber}, '320.000', "Test start shelf: item 5");
134 is( $nearby->{items}[5]{itemcallnumber}, '400.100', "Test start shelf: item 6");
135 is( $nearby->{items}[6]{itemcallnumber}, '410.100', "Test start shelf: item 7");
136
137
138
139 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'100.100'}{itemnumber} );
140 # We have
141 # 100.100 150.100 200.100 210.100 >
142 #   [1]       2       3       4
143 # There is no previous link
144 is( $nearby->{prev_item}, undef, "Test first item on a shelf: no previous link" );
145 # Clicking on next, we want a link to 410.100
146 is( $nearby->{next_item}{itemcallnumber}, '410.100', "Test first item on a shelf: next link 1/2" );
147 is( $nearby->{next_item}{itemnumber}, $cn->{'410.100'}{itemnumber}, "Test first item on a shelf: next link 2/2" );
148
149 is( scalar( @{$nearby->{items}} ), 4, "Test first item on a shelf: There are 4 items displayed" );
150 is( $nearby->{items}[0]{itemcallnumber}, '100.100', "Test first item on a shelf: item 1");
151 is( $nearby->{items}[1]{itemcallnumber}, '150.100', "Test first item on a shelf: item 2");
152 is( $nearby->{items}[2]{itemcallnumber}, '200.100', "Test first item on a shelf: item 3");
153 is( $nearby->{items}[3]{itemcallnumber}, '210.100', "Test first item on a shelf: item 4");
154
155
156 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'150.100'}{itemnumber} );
157 # We have
158 # 100.100 150.100 200.100 210.100 300.000 >
159 #    1      [2]       3       4      5
160 # There is no previous link
161 is( $nearby->{prev_item}, undef, "Test second item on a shelf: no previous link" );
162 # Clicking on next, we want a link to 500.100
163 is( $nearby->{next_item}{itemcallnumber}, '500.100', "Test second item on a shelf: next link 1/2" );
164 is( $nearby->{next_item}{itemnumber}, $cn->{'500.100'}{itemnumber}, "Test second item on a shelf: next link 2/2" );
165
166 is( scalar( @{$nearby->{items}} ), 5, "Test second item on a shelf: got 5 items" );
167 is( $nearby->{items}[0]{itemcallnumber}, '100.100', "Test second item on a shelf: item 1");
168 is( $nearby->{items}[1]{itemcallnumber}, '150.100', "Test second item on a shelf: item 2");
169 is( $nearby->{items}[2]{itemcallnumber}, '200.100', "Test second item on a shelf: item 3");
170 is( $nearby->{items}[3]{itemcallnumber}, '210.100', "Test second item on a shelf: item 4");
171 is( $nearby->{items}[4]{itemcallnumber}, '300.000', "Test second item on a shelf: item 5");
172
173
174 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'710.100'}{itemnumber} );
175 # We have
176 # < 600.000 610.000 700.100 710.100 720.100 730.100 740.100 >
177 #      12      13      14     [15]     16      17      18
178 # Clicking on previous, we want a link to 410.100
179 is( $nearby->{prev_item}{itemcallnumber}, '410.100', "Test end shelf: previous link 1/2" );
180 is( $nearby->{prev_item}{itemnumber}, $cn->{'410.100'}{itemnumber}, "Test end shelf: previous link 2/2" );
181 # Clicking on next, we want a link to 730.100
182 is( $nearby->{next_item}{itemcallnumber}, '750.100', "Test end shelf: next link is a link to the last item 1/2" );
183 is( $nearby->{next_item}{itemnumber}, $cn->{'750.100'}{itemnumber}, "Test end shelf: next link is a link to the last item 2/2" );
184
185 is( $nearby->{items}[0]{itemcallnumber}, '600.000', "Test end shelf: item 1");
186 is( $nearby->{items}[1]{itemcallnumber}, '610.000', "Test end shelf: item 2");
187 is( $nearby->{items}[2]{itemcallnumber}, '700.100', "Test end shelf: item 3");
188 is( $nearby->{items}[3]{itemcallnumber}, '710.100', "Test end shelf: item 4");
189 is( $nearby->{items}[4]{itemcallnumber}, '720.100', "Test end shelf: item 5");
190 is( $nearby->{items}[5]{itemcallnumber}, '730.100', "Test end shelf: item 6");
191 is( $nearby->{items}[6]{itemcallnumber}, '740.100', "Test end shelf: item 7");
192
193
194 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'740.100'}{itemnumber} );
195 # We have
196 # < 710.100 720.100 730.100 740.100 750.100
197 #      15      16      17     [18]     19
198 # Clicking on previous, we want a link to
199 is( $nearby->{prev_item}{itemcallnumber}, '520.100', "Test end of the shelf: previous link 1/2" );
200 is( $nearby->{prev_item}{itemnumber}, $cn->{'520.100'}{itemnumber}, "Test end of the shelf: previous link 2/2" );
201 # No next link
202 is( $nearby->{next_item}, undef, "Test end of the shelf: no next link" );
203
204 is( scalar( @{$nearby->{items}} ), 5, "Test end of the shelf: got 5 items" );
205 is( $nearby->{items}[0]{itemcallnumber}, '710.100', "Test end of the shelf: item 1");
206 is( $nearby->{items}[1]{itemcallnumber}, '720.100', "Test end of the shelf: item 2");
207 is( $nearby->{items}[2]{itemcallnumber}, '730.100', "Test end of the shelf: item 3");
208 is( $nearby->{items}[3]{itemcallnumber}, '740.100', "Test end of the shelf: item 4");
209 is( $nearby->{items}[4]{itemcallnumber}, '750.100', "Test end of the shelf: item 5");
210
211 $nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'750.100'}{itemnumber} );
212 # We have
213 # < 720.100 730.100 740.100 750.100
214 #      16      17      18     [19]
215 # Clicking on previous, we want a link to
216 is( $nearby->{prev_item}{itemcallnumber}, '600.000', "Test last item of the shelf: previous link 1/2" );
217 is( $nearby->{prev_item}{itemnumber}, $cn->{'600.000'}{itemnumber}, "Test last item of the shelf: previous link 2/2" );
218 # No next link
219 is( $nearby->{next_item}, undef, "Test end of the shelf: no next link" );
220
221 is( scalar( @{$nearby->{items}} ), 4, "Test last item of the shelf: got 4 items" );