Bug 11006: Drop column aqorders.totalamount
[koha.git] / t / db_dependent / Search / History.t
1 #!/usr/bin/env perl
2
3 use Modern::Perl;
4
5 use Test::More tests => 19;
6 use Test::Warn;
7 use URI::Escape;
8 use List::Util qw( shuffle );
9
10 use C4::Context;
11 my $dbh = C4::Context->dbh;
12 $dbh->{AutoCommit} = 0;
13 $dbh->{RaiseError} = 1;
14
15 use_ok('Koha::DateUtils');
16 use_ok('C4::Search::History');
17
18 my $userid = 123;
19 my $previous_sessionid = "PREVIOUS_SESSIONID";
20 my $current_sessionid = "CURRENT_SESSIONID";
21 my $total = 42;
22 my $query_cgi_b = q{idx=kw&idx=ti&idx=au%2Cwrdl&q=word1é&q=word2è&q=word3à&do=Search&sort_by=author_az};
23 my $query_cgi_a = q{op=do_search&type=opac&authtypecode=NP&operator=start&value=Harry&marclist=match&and_or=and&orderby=HeadingAsc};
24
25 # add
26 my $added = add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
27 is ( $added, 9, '9 searches are added' );
28
29 # get
30 my $searches_for_userid = C4::Search::History::get({
31     userid => $userid,
32 });
33 is( scalar(@$searches_for_userid), 9, 'There are 9 searches in all' );
34
35 my $searches_for_current_session = C4::Search::History::get({
36     userid => $userid,
37     sessionid => $current_sessionid,
38 });
39 is( scalar(@$searches_for_current_session), 5, 'There are 5 searches for the current session' );
40
41 my $searches_for_previous_sessions = C4::Search::History::get({
42     userid => $userid,
43     sessionid => $current_sessionid,
44     previous => 1,
45 });
46 is( scalar(@$searches_for_previous_sessions), 4, 'There are 4 searches for previous sessions' );
47
48 my $authority_searches_for_current_session = C4::Search::History::get({
49     userid => $userid,
50     sessionid => $current_sessionid,
51     type => 'authority',
52 });
53 is( scalar(@$authority_searches_for_current_session), 3, 'There are 3 authority searches for the current session' );
54
55 my $authority_searches_for_previous_session = C4::Search::History::get({
56     userid => $userid,
57     sessionid => $current_sessionid,
58     type => 'authority',
59     previous => 1,
60 });
61 is( scalar(@$authority_searches_for_previous_session), 2, 'There are 2 authority searches for previous sessions' );
62
63 my $biblio_searches_for_userid = C4::Search::History::get({
64     userid => $userid,
65     type => 'biblio',
66 });
67 is( scalar(@$biblio_searches_for_userid), 4, 'There are 5 searches for the current session' );
68
69 my $authority_searches_for_userid = C4::Search::History::get({
70     userid => $userid,
71     type => 'authority',
72 });
73 is( scalar(@$authority_searches_for_userid), 5, 'There are 4 searches for previous sessions' );
74
75 delete_all( $userid );
76
77 # delete
78 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
79 C4::Search::History::delete({
80     userid => $userid,
81     sessionid => $current_sessionid,
82     type => 'authority',
83 });
84 my $all = C4::Search::History::get({userid => $userid});
85 is( scalar(@$all), 6, 'There are 6 searches in all after deleting current biblio searches' );
86 delete_all( $userid );
87
88 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
89 C4::Search::History::delete({
90     userid => $userid,
91     sessionid => $current_sessionid,
92     type => 'biblio',
93     previous => 1,
94 });
95 $all = C4::Search::History::get({userid => $userid});
96 is( scalar(@$all), 7, 'There are 7 searches in all after deleting previous authority searches' );
97 delete_all( $userid );
98
99 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
100 C4::Search::History::delete({
101     userid => $userid,
102     sessionid => $current_sessionid,
103     previous => 1,
104 });
105 $all = C4::Search::History::get({userid => $userid});
106 is( scalar(@$all), 5, 'There are 5 searches in all after deleting all previous searches' );
107 delete_all( $userid );
108
109 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
110 C4::Search::History::delete({
111     userid => $userid,
112     sessionid => $current_sessionid,
113 });
114 $all = C4::Search::History::get({userid => $userid});
115 is( scalar(@$all), 4, 'There are 5 searches in all after deleting all searches for a sessionid' );
116 delete_all( $userid );
117
118 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
119 C4::Search::History::delete({
120     userid => $userid,
121 });
122 $all = C4::Search::History::get({userid => $userid});
123 is( scalar(@$all), 0, 'There are 0 search after deleting all searches for a userid' );
124 delete_all( $userid );
125
126 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
127 warning_like { C4::Search::History::delete({}) }
128           qr/^ERROR: userid or id is required for history deletion/,
129           'Calling delete without userid raises warning';
130 $all = C4::Search::History::get({userid => $userid});
131 is( scalar(@$all), 9, 'There are still 9 searches after calling delete without userid' );
132 delete_all( $userid );
133
134 # Delete (with a given id)
135 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
136 $all = C4::Search::History::get({ userid => $userid });
137 # Delete 5 searches
138 my $ids = [ shuffle map { $_->{id} } @$all ];
139 for my $id ( @$ids[ 0 .. 4 ] ) {
140     C4::Search::History::delete({ id => $id });
141 }
142 $all = C4::Search::History::get({ userid => $userid });
143 is( scalar(@$all), 4, 'There are 4 searches after calling 5 times delete with id' );
144 delete_all( $userid );
145
146 add( $userid, $current_sessionid, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a );
147 $all = C4::Search::History::get({ userid => $userid });
148 # Delete 5 searches
149 $ids = [ shuffle map { $_->{id} } @$all ];
150 C4::Search::History::delete({ id => [ @$ids[0..4] ] });
151 $all = C4::Search::History::get({ userid => $userid });
152 is( scalar(@$all), 4, 'There are 4 searches after calling delete with 5 ids' );
153 delete_all( $userid );
154
155 sub add {
156     my ( $userid, $current_session_id, $previous_sessionid, $total, $query_cgi_b, $query_cgi_a ) = @_;
157
158     my $query_desc_b1_p = q{first previous biblio search};
159     my $first_previous_biblio_search = {
160         userid => $userid,
161         sessionid => $previous_sessionid,
162         query_desc => $query_desc_b1_p,
163         query_cgi => $query_cgi_b,
164         total => $total,
165         type => 'biblio',
166     };
167
168     my $query_desc_a1_p = q{first previous authority search};
169     my $first_previous_authority_search = {
170         userid => $userid,
171         sessionid => $previous_sessionid,
172         query_desc => $query_desc_a1_p,
173         query_cgi => $query_cgi_a,
174         total => $total,
175         type => 'authority',
176     };
177
178     my $query_desc_b2_p = q{second previous biblio search};
179     my $second_previous_biblio_search = {
180         userid => $userid,
181         sessionid => $previous_sessionid,
182         query_desc => $query_desc_b2_p,
183         query_cgi => $query_cgi_b,
184         total => $total,
185         type => 'biblio',
186     };
187
188     my $query_desc_a2_p = q{second previous authority search};
189     my $second_previous_authority_search = {
190         userid => $userid,
191         sessionid => $previous_sessionid,
192         query_desc => $query_desc_a2_p,
193         query_cgi => $query_cgi_a,
194         total => $total,
195         type => 'authority',
196     };
197
198
199     my $query_desc_b1_c = q{first current biblio search};
200
201     my $first_current_biblio_search = {
202         userid => $userid,
203         sessionid => $current_sessionid,
204         query_desc => $query_desc_b1_c,
205         query_cgi => $query_cgi_b,
206         total => $total,
207         type => 'biblio',
208     };
209
210     my $query_desc_a1_c = q{first current authority search};
211     my $first_current_authority_search = {
212         userid => $userid,
213         sessionid => $current_sessionid,
214         query_desc => $query_desc_a1_c,
215         query_cgi => $query_cgi_a,
216         total => $total,
217         type => 'authority',
218     };
219
220     my $query_desc_b2_c = q{second current biblio search};
221     my $second_current_biblio_search = {
222         userid => $userid,
223         sessionid => $current_sessionid,
224         query_desc => $query_desc_b2_c,
225         query_cgi => $query_cgi_b,
226         total => $total,
227         type => 'biblio',
228     };
229
230     my $query_desc_a2_c = q{second current authority search};
231     my $second_current_authority_search = {
232         userid => $userid,
233         sessionid => $current_sessionid,
234         query_desc => $query_desc_a2_c,
235         query_cgi => $query_cgi_a,
236         total => $total,
237         type => 'authority',
238     };
239
240     my $query_desc_a3_c = q{third current authority search};
241     my $third_current_authority_search = {
242         userid => $userid,
243         sessionid => $current_sessionid,
244         query_desc => $query_desc_a3_c,
245         query_cgi => $query_cgi_a,
246         total => $total,
247         type => 'authority',
248     };
249
250
251     my $r = 0;
252     $r += C4::Search::History::add( $first_current_biblio_search );
253     $r += C4::Search::History::add( $first_current_authority_search );
254     $r += C4::Search::History::add( $second_current_biblio_search );
255     $r += C4::Search::History::add( $second_current_authority_search );
256     $r += C4::Search::History::add( $first_previous_biblio_search );
257     $r += C4::Search::History::add( $first_previous_authority_search );
258     $r += C4::Search::History::add( $second_previous_biblio_search );
259     $r += C4::Search::History::add( $second_previous_authority_search );
260     $r += C4::Search::History::add( $third_current_authority_search );
261     return $r;
262 }
263
264 sub delete_all {
265     my $userid = shift;
266     C4::Search::History::delete({
267         userid => $userid,
268     });
269 }
270
271 $dbh->rollback;
272
273 done_testing;