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