View | Details | Raw Unified | Return to bug 30645
Collapse All | Expand All

(-)a/t/db_dependent/selenium/patrons_search.t (-102 / +185 lines)
Lines 25-37 our @cleanup; Link Here
25
our $DT_delay = 1;
25
our $DT_delay = 1;
26
26
27
END {
27
END {
28
    unless ( @cleanup ) { say "WARNING: Cleanup failed!" }
28
    unless (@cleanup) { say "WARNING: Cleanup failed!" }
29
    C4::Context->set_preference( 'dateformat',                $original_dateformat );
29
    C4::Context->set_preference( 'dateformat',                $original_dateformat );
30
    C4::Context->set_preference( 'DefaultPatronSearchFields', $original_DefaultPatronSearchFields );
30
    C4::Context->set_preference( 'DefaultPatronSearchFields', $original_DefaultPatronSearchFields );
31
    C4::Context->set_preference( 'DefaultPatronSearchMethod', $original_DefaultPatronSearchMethod );
31
    C4::Context->set_preference( 'DefaultPatronSearchMethod', $original_DefaultPatronSearchMethod );
32
    C4::Context->set_preference( 'PatronsPerPage',            $original_PatronsPerPage );
32
    C4::Context->set_preference( 'PatronsPerPage',            $original_PatronsPerPage );
33
    $_->delete for @cleanup;
33
    $_->delete for @cleanup;
34
};
34
}
35
35
36
use C4::Context;
36
use C4::Context;
37
37
Lines 47-53 use t::lib::Selenium; Link Here
47
use t::lib::TestBuilder;
47
use t::lib::TestBuilder;
48
48
49
eval { require Selenium::Remote::Driver; };
49
eval { require Selenium::Remote::Driver; };
50
if ( $@ ) {
50
if ($@) {
51
    plan skip_all => "Selenium::Remote::Driver is needed for selenium tests.";
51
    plan skip_all => "Selenium::Remote::Driver is needed for selenium tests.";
52
} else {
52
} else {
53
    plan tests => 1;
53
    plan tests => 1;
Lines 63-79 my $schema = Koha::Database->schema; Link Here
63
subtest 'Search patrons' => sub {
63
subtest 'Search patrons' => sub {
64
    plan tests => 28;
64
    plan tests => 28;
65
65
66
    if ( Koha::Patrons->search({surname => {-like => "test_patron_%"}})->count ) {
66
    if ( Koha::Patrons->search( { surname => { -like => "test_patron_%" } } )->count ) {
67
        BAIL_OUT("Cannot run this test, data we need to create already exist in the DB");
67
        BAIL_OUT("Cannot run this test, data we need to create already exist in the DB");
68
    }
68
    }
69
    my @patrons;
69
    my @patrons;
70
    my $borrowernotes           = q|<strong>just 'a" note</strong> \123 ❤|;
70
    my $borrowernotes           = q|<strong>just 'a" note</strong> \123 ❤|;
71
    my $borrowernotes_displayed = q|just 'a" note \123 ❤|;
71
    my $borrowernotes_displayed = q|just 'a" note \123 ❤|;
72
    my $branchname = q|<strong>just 'another" library</strong> \123 ❤|;
72
    my $branchname              = q|<strong>just 'another" library</strong> \123 ❤|;
73
    my $firstname  = q|<strong>fir's"tname</strong> \123 ❤|;
73
    my $firstname               = q|<strong>fir's"tname</strong> \123 ❤|;
74
    my $address    = q|<strong>add'res"s</strong> \123 ❤|;
74
    my $address                 = q|<strong>add'res"s</strong> \123 ❤|;
75
    my $email      = q|a<strong>bad_email</strong>@example\123 ❤.com|;
75
    my $email                   = q|a<strong>bad_email</strong>@example\123 ❤.com|;
76
    my $patron_category = $builder->build_object(
76
    my $patron_category         = $builder->build_object(
77
        {
77
        {
78
            class => 'Koha::Patron::Categories',
78
            class => 'Koha::Patron::Categories',
79
            value => { category_type => 'A' }
79
            value => { category_type => 'A' }
Lines 81-94 subtest 'Search patrons' => sub { Link Here
81
    );
81
    );
82
    push @cleanup, $patron_category;
82
    push @cleanup, $patron_category;
83
83
84
    my $library = $builder->build_object(
84
    my $library = $builder->build_object( { class => 'Koha::Libraries', value => { branchname => $branchname } } );
85
        { class => 'Koha::Libraries', value => { branchname => $branchname } }
86
    );
87
    push @cleanup, $library;
85
    push @cleanup, $library;
88
86
89
    for my $i ( 1 .. 25 ) {
87
    for my $i ( 1 .. 25 ) {
90
        push @patrons,
88
        push @patrons,
91
          $builder->build_object(
89
            $builder->build_object(
92
            {
90
            {
93
                class => 'Koha::Patrons',
91
                class => 'Koha::Patrons',
94
                value => {
92
                value => {
Lines 101-107 subtest 'Search patrons' => sub { Link Here
101
                    email         => $email,
99
                    email         => $email,
102
                }
100
                }
103
            }
101
            }
104
          );
102
            );
105
    }
103
    }
106
104
107
    push @patrons, $builder->build_object(
105
    push @patrons, $builder->build_object(
Lines 121-133 subtest 'Search patrons' => sub { Link Here
121
119
122
    unshift @cleanup, $_ for @patrons;
120
    unshift @cleanup, $_ for @patrons;
123
121
124
    my $library_2 = $builder->build_object(
122
    my $library_2 =
125
        { class => 'Koha::Libraries', value => { branchname => 'X' . $branchname } }
123
        $builder->build_object( { class => 'Koha::Libraries', value => { branchname => 'X' . $branchname } } );
126
    );
127
    push @cleanup, $library_2;
124
    push @cleanup, $library_2;
128
125
129
    my $patron_27 =
126
    my $patron_27 = $builder->build_object(
130
      $builder->build_object(
131
        {
127
        {
132
            class => 'Koha::Patrons',
128
            class => 'Koha::Patrons',
133
            value => {
129
            value => {
Lines 141-264 subtest 'Search patrons' => sub { Link Here
141
                dateofbirth   => '1980-06-17',
137
                dateofbirth   => '1980-06-17',
142
            }
138
            }
143
        }
139
        }
144
      );
140
    );
145
    unshift @cleanup, $patron_27;
141
    unshift @cleanup, $patron_27;
146
142
147
    my $attribute_type = Koha::Patron::Attribute::Type->new(
143
    my $attribute_type = Koha::Patron::Attribute::Type->new(
148
        {
144
        {
149
            code        => 'my code1',
145
            code                => 'my code1',
150
            description => 'my description1',
146
            description         => 'my description1',
151
            staff_searchable => 0,
147
            staff_searchable    => 0,
152
            searched_by_default => 0
148
            searched_by_default => 0
153
        }
149
        }
154
    )->store;
150
    )->store;
155
    my $attribute_type_searchable_1 = Koha::Patron::Attribute::Type->new(
151
    my $attribute_type_searchable_1 = Koha::Patron::Attribute::Type->new(
156
        {
152
        {
157
            code             => 'my code2',
153
            code                => 'my code2',
158
            description      => 'my description2',
154
            description         => 'my description2',
159
            opac_display     => 1,
155
            opac_display        => 1,
160
            staff_searchable => 1,
156
            staff_searchable    => 1,
161
            searched_by_default => 1
157
            searched_by_default => 1
162
        }
158
        }
163
    )->store;
159
    )->store;
164
    my $attribute_type_searchable_2 = Koha::Patron::Attribute::Type->new(
160
    my $attribute_type_searchable_2 = Koha::Patron::Attribute::Type->new(
165
        {
161
        {
166
            code             => 'my code3',
162
            code                => 'my code3',
167
            description      => 'my description3',
163
            description         => 'my description3',
168
            opac_display     => 1,
164
            opac_display        => 1,
169
            staff_searchable => 1,
165
            staff_searchable    => 1,
170
            searched_by_default => 1
166
            searched_by_default => 1
171
        }
167
        }
172
    )->store;
168
    )->store;
173
    my $attribute_type_searchable_not_default = Koha::Patron::Attribute::Type->new(
169
    my $attribute_type_searchable_not_default = Koha::Patron::Attribute::Type->new(
174
        {
170
        {
175
            code             => 'mycode4',
171
            code                => 'mycode4',
176
            description      => 'my description4',
172
            description         => 'my description4',
177
            opac_display     => 1,
173
            opac_display        => 1,
178
            staff_searchable => 1,
174
            staff_searchable    => 1,
179
            searched_by_default => 0
175
            searched_by_default => 0
180
        }
176
        }
181
    )->store;
177
    )->store;
182
    push @cleanup, $attribute_type, $attribute_type_searchable_1, $attribute_type_searchable_2, $attribute_type_searchable_not_default;
178
    push @cleanup, $attribute_type, $attribute_type_searchable_1, $attribute_type_searchable_2,
183
179
        $attribute_type_searchable_not_default;
184
    $patrons[0]->extended_attributes([
180
185
        { code => $attribute_type->code, attribute => 'test_attr_1' },
181
    $patrons[0]->extended_attributes(
186
        { code => $attribute_type_searchable_1->code, attribute => 'test_attr_2'},
182
        [
187
        { code => $attribute_type_searchable_2->code, attribute => 'test_attr_3'},
183
            { code => $attribute_type->code,                        attribute => 'test_attr_1' },
188
        { code => $attribute_type_searchable_not_default->code, attribute => 'test_attr_4'},
184
            { code => $attribute_type_searchable_1->code,           attribute => 'test_attr_2' },
189
    ]);
185
            { code => $attribute_type_searchable_2->code,           attribute => 'test_attr_3' },
190
    $patrons[1]->extended_attributes([
186
            { code => $attribute_type_searchable_not_default->code, attribute => 'test_attr_4' },
191
        { code => $attribute_type->code, attribute => 'test_attr_1' },
187
        ]
192
        { code => $attribute_type_searchable_1->code, attribute => 'test_attr_2'},
188
    );
193
        { code => $attribute_type_searchable_2->code, attribute => 'test_attr_3'},
189
    $patrons[1]->extended_attributes(
194
        { code => $attribute_type_searchable_not_default->code, attribute => 'test_attr_4'},
190
        [
195
    ]);
191
            { code => $attribute_type->code,                        attribute => 'test_attr_1' },
192
            { code => $attribute_type_searchable_1->code,           attribute => 'test_attr_2' },
193
            { code => $attribute_type_searchable_2->code,           attribute => 'test_attr_3' },
194
            { code => $attribute_type_searchable_not_default->code, attribute => 'test_attr_4' },
195
        ]
196
    );
196
197
197
    my $total_number_of_patrons = Koha::Patrons->search->count;
198
    my $total_number_of_patrons = Koha::Patrons->search->count;
198
    my $table_id = "memberresultst";
199
    my $table_id                = "memberresultst";
199
200
200
    $s->auth;
201
    $s->auth;
201
    C4::Context->set_preference('DefaultPatronSearchFields',"");
202
    C4::Context->set_preference( 'DefaultPatronSearchFields', "" );
202
    C4::Context->set_preference('DefaultPatronSearchMethod',"contains");
203
    C4::Context->set_preference( 'DefaultPatronSearchMethod', "contains" );
203
    my $searchable_attributes = Koha::Patron::Attribute::Types->search({ staff_searchable => 1 })->count();
204
    my $searchable_attributes = Koha::Patron::Attribute::Types->search( { staff_searchable => 1 } )->count();
204
    my $PatronsPerPage = 15;
205
    my $PatronsPerPage        = 15;
205
    my $nb_standard_fields = 13 + $searchable_attributes; # Standard fields, plus one searchable attribute
206
    my $nb_standard_fields    = 13 + $searchable_attributes;    # Standard fields, plus one searchable attribute
206
    C4::Context->set_preference('PatronsPerPage', $PatronsPerPage);
207
    C4::Context->set_preference( 'PatronsPerPage', $PatronsPerPage );
207
    $driver->get( $base_url . "/members/members-home.pl" );
208
    $driver->get( $base_url . "/members/members-home.pl" );
208
    my @adv_options = $driver->find_elements('//select[@id="searchfieldstype"]/option');
209
    my @adv_options = $driver->find_elements('//select[@id="searchfieldstype"]/option');
209
    is( scalar @adv_options, $nb_standard_fields + 1, 'All standard fields are searchable if DefaultPatronSearchFields not set. middle_name is there.');
210
    is(
210
    is( $adv_options[0]->get_value(), 'standard', 'Standard search uses value "standard"');
211
        scalar @adv_options, $nb_standard_fields + 1,
212
        'All standard fields are searchable if DefaultPatronSearchFields not set. middle_name is there.'
213
    );
214
    is( $adv_options[0]->get_value(), 'standard', 'Standard search uses value "standard"' );
211
    my @filter_options = $driver->find_elements('//select[@id="searchfieldstype_filter"]/option');
215
    my @filter_options = $driver->find_elements('//select[@id="searchfieldstype_filter"]/option');
212
    is( scalar @filter_options, $nb_standard_fields + 1, 'All standard fields + middle_name are searchable by filter if DefaultPatronSearchFields not set');
216
    is(
213
    is( $filter_options[0]->get_value(), 'standard', 'Standard filter uses hard coded value "standard" DefaultPatronSearchFields not set');
217
        scalar @filter_options, $nb_standard_fields + 1,
214
    C4::Context->set_preference('DefaultPatronSearchFields',"firstname|initials");
218
        'All standard fields + middle_name are searchable by filter if DefaultPatronSearchFields not set'
219
    );
220
    is(
221
        $filter_options[0]->get_value(), 'standard',
222
        'Standard filter uses hard coded value "standard" DefaultPatronSearchFields not set'
223
    );
224
    C4::Context->set_preference( 'DefaultPatronSearchFields', "firstname|initials" );
215
    $driver->get( $base_url . "/members/members-home.pl" );
225
    $driver->get( $base_url . "/members/members-home.pl" );
216
    @adv_options = $driver->find_elements('//select[@id="searchfieldstype"]/option');
226
    @adv_options = $driver->find_elements('//select[@id="searchfieldstype"]/option');
217
    is( scalar @adv_options, $nb_standard_fields, 'New option added when DefaultPatronSearchFields is populated with a field. Note that middle_name disappears, we do not want it if not part of DefaultPatronSearchFields');
227
    is(
218
    is( $adv_options[0]->get_value(), 'standard', 'Standard search uses value "standard"');
228
        scalar @adv_options, $nb_standard_fields,
229
        'New option added when DefaultPatronSearchFields is populated with a field. Note that middle_name disappears, we do not want it if not part of DefaultPatronSearchFields'
230
    );
231
    is( $adv_options[0]->get_value(), 'standard', 'Standard search uses value "standard"' );
219
    @filter_options = $driver->find_elements('//select[@id="searchfieldstype_filter"]/option');
232
    @filter_options = $driver->find_elements('//select[@id="searchfieldstype_filter"]/option');
220
    is( scalar @filter_options, $nb_standard_fields, 'New filter option added when DefaultPatronSearchFields is populated with a field');
233
    is(
221
    is( $filter_options[0]->get_value(), 'standard', 'Standard filter uses value "standard"');
234
        scalar @filter_options, $nb_standard_fields,
235
        'New filter option added when DefaultPatronSearchFields is populated with a field'
236
    );
237
    is( $filter_options[0]->get_value(), 'standard', 'Standard filter uses value "standard"' );
222
    $driver->get( $base_url . "/members/members-home.pl" );
238
    $driver->get( $base_url . "/members/members-home.pl" );
223
    @adv_options = $driver->find_elements('//select[@id="searchfieldstype"]/option');
239
    @adv_options    = $driver->find_elements('//select[@id="searchfieldstype"]/option');
224
    @filter_options = $driver->find_elements('//select[@id="searchfieldstype_filter"]/option');
240
    @filter_options = $driver->find_elements('//select[@id="searchfieldstype_filter"]/option');
225
    is( scalar @adv_options, $nb_standard_fields, 'Invalid option not added when DefaultPatronSearchFields is populated with an invalid field');
241
    is(
226
    is( scalar @filter_options, $nb_standard_fields, 'Invalid filter option not added when DefaultPatronSearchFields is populated with an invalid field');
242
        scalar @adv_options, $nb_standard_fields,
243
        'Invalid option not added when DefaultPatronSearchFields is populated with an invalid field'
244
    );
245
    is(
246
        scalar @filter_options, $nb_standard_fields,
247
        'Invalid filter option not added when DefaultPatronSearchFields is populated with an invalid field'
248
    );
227
249
228
    # NOTE: We should probably ensure the bad field is removed from 'standard' search here, else searches are broken
250
    # NOTE: We should probably ensure the bad field is removed from 'standard' search here, else searches are broken
229
    C4::Context->set_preference('DefaultPatronSearchFields',"");
251
    C4::Context->set_preference( 'DefaultPatronSearchFields', "" );
230
    $driver->get( $base_url . "/members/members-home.pl" );
252
    $driver->get( $base_url . "/members/members-home.pl" );
231
    $s->fill_form( { search_patron_filter => 'test_patron' } );
253
    $s->fill_form( { search_patron_filter => 'test_patron' } );
232
    $s->submit_form;
254
    $s->submit_form;
233
    my $first_patron = $patrons[0];
255
    my $first_patron = $patrons[0];
234
256
235
    sleep $DT_delay && $s->wait_for_ajax;
257
    sleep $DT_delay && $s->wait_for_ajax;
236
    my @td = $driver->find_elements('//table[@id="'.$table_id.'"]/tbody/tr/td');
258
    my @td = $driver->find_elements( '//table[@id="' . $table_id . '"]/tbody/tr/td' );
237
    like ($td[2]->get_text, qr[\Q$firstname\E],
259
    like(
260
        $td[2]->get_text, qr[\Q$firstname\E],
238
        'Column "Name" should be the 3rd and contain the firstname correctly filtered'
261
        'Column "Name" should be the 3rd and contain the firstname correctly filtered'
239
    );
262
    );
240
    like ($td[2]->get_text, qr[\Q$address\E],
263
    like(
264
        $td[2]->get_text, qr[\Q$address\E],
241
        'Column "Name" should be the 3rd and contain the address correctly filtered'
265
        'Column "Name" should be the 3rd and contain the address correctly filtered'
242
    );
266
    );
243
    like ($td[2]->get_text, qr[\Q$email\E],
267
    like(
268
        $td[2]->get_text, qr[\Q$email\E],
244
        'Column "Name" should be the 3rd and contain the email address correctly filtered'
269
        'Column "Name" should be the 3rd and contain the email address correctly filtered'
245
    );
270
    );
246
    is( $td[4]->get_text, $branchname,
271
    is(
272
        $td[4]->get_text, $branchname,
247
        'Column "Library" should be the 6th and contain the html tags - they have been html filtered'
273
        'Column "Library" should be the 6th and contain the html tags - they have been html filtered'
248
    );
274
    );
249
    is( $td[9]->get_text, $borrowernotes_displayed,
275
    is(
276
        $td[9]->get_text, $borrowernotes_displayed,
250
        'Column "Circ note" should be the 10th and not contain the html tags - they have not been html filtered'
277
        'Column "Circ note" should be the 10th and not contain the html tags - they have not been html filtered'
251
    );
278
    );
252
279
253
    $driver->find_element(
280
    $driver->find_element(
254
            '//a[@href="/cgi-bin/koha/members/memberentry.pl?op=modify&destination=circ&borrowernumber='
281
              '//a[@href="/cgi-bin/koha/members/memberentry.pl?op=modify&destination=circ&borrowernumber='
255
          . $first_patron->borrowernumber
282
            . $first_patron->borrowernumber
256
          . '"]' )->click;
283
            . '"]' )->click;
257
    is(
284
    is(
258
        $driver->get_title,
285
        $driver->get_title,
259
        sprintf(
286
        sprintf(
260
            "Modify patron %s %s %s (%s) %s (%s) (%s) › Patrons › Koha",
287
            "Modify patron %s %s %s (%s) %s (%s) (%s) › Patrons › Koha",
261
            $first_patron->title, $first_patron->firstname, $first_patron->middle_name, $first_patron->othernames, $first_patron->surname, $first_patron->cardnumber,
288
            $first_patron->title,   $first_patron->firstname, $first_patron->middle_name, $first_patron->othernames,
289
            $first_patron->surname, $first_patron->cardnumber,
262
            $first_patron->category->description,
290
            $first_patron->category->description,
263
        ),
291
        ),
264
        'Page title is correct after following modification link'
292
        'Page title is correct after following modification link'
Lines 269-281 subtest 'Search patrons' => sub { Link Here
269
    $s->submit_form;
297
    $s->submit_form;
270
    sleep $DT_delay && $s->wait_for_ajax;
298
    sleep $DT_delay && $s->wait_for_ajax;
271
299
272
    $s->driver->find_element('//*[@id="'.$table_id.'_filter"]//input')->send_keys('test_patron');
300
    $s->driver->find_element( '//*[@id="' . $table_id . '_filter"]//input' )->send_keys('test_patron');
273
    sleep $DT_delay && $s->wait_for_ajax;
301
    sleep $DT_delay && $s->wait_for_ajax;
274
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', $PatronsPerPage, 26, $total_number_of_patrons), 'Searching in standard brings back correct results' );
302
    is(
303
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
304
        sprintf(
305
            'Showing 1 to %s of %s entries (filtered from %s total entries)', $PatronsPerPage, 26,
306
            $total_number_of_patrons
307
        ),
308
        'Searching in standard brings back correct results'
309
    );
275
310
276
    $s->driver->find_element('//table[@id="'.$table_id.'"]//th[@data-filter="libraries"]/select/option[@value="'.$library->branchcode.'"]')->click;
311
    $s->driver->find_element( '//table[@id="'
312
            . $table_id
313
            . '"]//th[@data-filter="libraries"]/select/option[@value="'
314
            . $library->branchcode
315
            . '"]' )->click;
277
    sleep $DT_delay && $s->wait_for_ajax;
316
    sleep $DT_delay && $s->wait_for_ajax;
278
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', $PatronsPerPage, 25, $total_number_of_patrons), 'Filtering on library works in combination with main search' );
317
    is(
318
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
319
        sprintf(
320
            'Showing 1 to %s of %s entries (filtered from %s total entries)', $PatronsPerPage, 25,
321
            $total_number_of_patrons
322
        ),
323
        'Filtering on library works in combination with main search'
324
    );
279
325
280
    # Reset the filters
326
    # Reset the filters
281
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
327
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
Lines 283-296 subtest 'Search patrons' => sub { Link Here
283
    sleep $DT_delay && $s->wait_for_ajax;
329
    sleep $DT_delay && $s->wait_for_ajax;
284
330
285
    # And make sure all the patrons are present
331
    # And make sure all the patrons are present
286
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries', $PatronsPerPage, $total_number_of_patrons), 'Resetting filters works as expected' );
332
    is(
333
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
334
        sprintf( 'Showing 1 to %s of %s entries', $PatronsPerPage, $total_number_of_patrons ),
335
        'Resetting filters works as expected'
336
    );
287
337
288
    # Pattern terms must be split
338
    # Pattern terms must be split
289
    $s->fill_form( { search_patron_filter => 'test patron' } );
339
    $s->fill_form( { search_patron_filter => 'test patron' } );
290
    $s->submit_form;
340
    $s->submit_form;
291
341
292
    sleep $DT_delay && $s->wait_for_ajax;
342
    sleep $DT_delay && $s->wait_for_ajax;
293
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', $PatronsPerPage, 26, $total_number_of_patrons) );
343
    is(
344
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
345
        sprintf(
346
            'Showing 1 to %s of %s entries (filtered from %s total entries)', $PatronsPerPage, 26,
347
            $total_number_of_patrons
348
        )
349
    );
294
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
350
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
295
    $s->submit_form;
351
    $s->submit_form;
296
    sleep $DT_delay && $s->wait_for_ajax;
352
    sleep $DT_delay && $s->wait_for_ajax;
Lines 300-306 subtest 'Search patrons' => sub { Link Here
300
    $s->submit_form;
356
    $s->submit_form;
301
    sleep $DT_delay && $s->wait_for_ajax;
357
    sleep $DT_delay && $s->wait_for_ajax;
302
358
303
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('No entries to show (filtered from %s total entries)', $total_number_of_patrons), 'Searching on a non-searchable attribute returns no results' );
359
    is(
360
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
361
        sprintf( 'No entries to show (filtered from %s total entries)', $total_number_of_patrons ),
362
        'Searching on a non-searchable attribute returns no results'
363
    );
304
364
305
    # clear form
365
    # clear form
306
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
366
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
Lines 310-348 subtest 'Search patrons' => sub { Link Here
310
    $s->submit_form;
370
    $s->submit_form;
311
    sleep $DT_delay && $s->wait_for_ajax;
371
    sleep $DT_delay && $s->wait_for_ajax;
312
372
313
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons), 'Searching on a searchable attribute returns correct results' );
373
    is(
374
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
375
        sprintf( 'Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons ),
376
        'Searching on a searchable attribute returns correct results'
377
    );
314
378
315
    # clear form
379
    # clear form
316
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
380
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
317
381
318
    $s->fill_form( { search_patron_filter => 'test_attr_3' } ); # Terms must be split
382
    $s->fill_form( { search_patron_filter => 'test_attr_3' } );    # Terms must be split
319
    $s->submit_form;
383
    $s->submit_form;
320
    sleep $DT_delay && $s->wait_for_ajax;
384
    sleep $DT_delay && $s->wait_for_ajax;
321
385
322
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons), 'Searching on a searchable attribute returns correct results' );
386
    is(
387
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
388
        sprintf( 'Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons ),
389
        'Searching on a searchable attribute returns correct results'
390
    );
323
391
324
    # clear form
392
    # clear form
325
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
393
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="clear_search"]')->click();
326
394
327
    # Search on searchable attribute as specific field, we expect 2 patrons
395
    # Search on searchable attribute as specific field, we expect 2 patrons
328
    $s->fill_form( { search_patron_filter => 'test_attr_4' } );
396
    $s->fill_form( { search_patron_filter => 'test_attr_4' } );
329
    $driver->find_element('//form[@id="patron_search_form"]//*[@id="searchfieldstype_filter"]//option[@value="_ATTR_'.$attribute_type_searchable_not_default->code.'"]')->click();
397
    $driver->find_element( '//form[@id="patron_search_form"]//*[@id="searchfieldstype_filter"]//option[@value="_ATTR_'
398
            . $attribute_type_searchable_not_default->code
399
            . '"]' )->click();
330
    $s->submit_form;
400
    $s->submit_form;
331
    sleep $DT_delay && $s->wait_for_ajax;
401
    sleep $DT_delay && $s->wait_for_ajax;
332
402
333
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons), 'Searching on a searchable attribute as a specific field returns correct results' );
403
    is(
404
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
405
        sprintf( 'Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons ),
406
        'Searching on a searchable attribute as a specific field returns correct results'
407
    );
334
408
335
    # Refine search and search for test_patron in all the data using the DT global search
409
    # Refine search and search for test_patron in all the data using the DT global search
336
    # No change in result expected, still 2 patrons
410
    # No change in result expected, still 2 patrons
337
    $s->driver->find_element('//*[@id="'.$table_id.'_filter"]//input')->send_keys('test_patron');
411
    $s->driver->find_element( '//*[@id="' . $table_id . '_filter"]//input' )->send_keys('test_patron');
338
    sleep $DT_delay && $s->wait_for_ajax;
412
    sleep $DT_delay && $s->wait_for_ajax;
339
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons), 'Refining with DataTables search works to further filter the original query' );
413
    is(
414
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
415
        sprintf( 'Showing 1 to %s of %s entries (filtered from %s total entries)', 2, 2, $total_number_of_patrons ),
416
        'Refining with DataTables search works to further filter the original query'
417
    );
340
418
341
    # Adding the surname of the first patron in the "Name" column
419
    # Adding the surname of the first patron in the "Name" column
342
    # We expect only 1 result
420
    # We expect only 1 result
343
    $s->driver->find_element('//table[@id="'.$table_id.'"]//input[@placeholder="Name search"]')->send_keys($patrons[0]->surname);
421
    $s->driver->find_element( '//table[@id="' . $table_id . '"]//input[@placeholder="Name search"]' )
422
        ->send_keys( $patrons[0]->surname );
344
    sleep $DT_delay && $s->wait_for_ajax;
423
    sleep $DT_delay && $s->wait_for_ajax;
345
    is( $driver->find_element('//div[@id="'.$table_id.'_info"]')->get_text, sprintf('Showing 1 to %s of %s entries (filtered from %s total entries)', 1, 1, $total_number_of_patrons), 'Refining with header filters works to further filter the original query' );
424
    is(
425
        $driver->find_element( '//div[@id="' . $table_id . '_info"]' )->get_text,
426
        sprintf( 'Showing 1 to %s of %s entries (filtered from %s total entries)', 1, 1, $total_number_of_patrons ),
427
        'Refining with header filters works to further filter the original query'
428
    );
346
429
347
    subtest 'remember_search' => sub {
430
    subtest 'remember_search' => sub {
348
431
Lines 356-363 subtest 'Search patrons' => sub { Link Here
356
        my $patron_selected_text = $driver->find_element('//div[@id="table_search_selections"]/span')->get_text;
439
        my $patron_selected_text = $driver->find_element('//div[@id="table_search_selections"]/span')->get_text;
357
        is( $patron_selected_text, "", "Patrons selected is not displayed" );
440
        is( $patron_selected_text, "", "Patrons selected is not displayed" );
358
441
359
        my @checkboxes = $driver->find_elements(
442
        my @checkboxes = $driver->find_elements('//input[@type="checkbox"][@name="borrowernumber"]');
360
            '//input[@type="checkbox"][@name="borrowernumber"]');
361
        $checkboxes[2]->click;
443
        $checkboxes[2]->click;
362
        $patron_selected_text = $driver->find_element('//div[@id="table_search_selections"]/span')->get_text;
444
        $patron_selected_text = $driver->find_element('//div[@id="table_search_selections"]/span')->get_text;
363
        is( $patron_selected_text, "Patrons selected: 1", "One patron selected" );
445
        is( $patron_selected_text, "Patrons selected: 1", "One patron selected" );
Lines 368-375 subtest 'Search patrons' => sub { Link Here
368
450
369
        $driver->find_element('//*[@id="memberresultst_next"]')->click;
451
        $driver->find_element('//*[@id="memberresultst_next"]')->click;
370
        sleep $DT_delay && $s->wait_for_ajax;
452
        sleep $DT_delay && $s->wait_for_ajax;
371
        @checkboxes = $driver->find_elements(
453
        @checkboxes = $driver->find_elements('//input[@type="checkbox"][@name="borrowernumber"]');
372
            '//input[@type="checkbox"][@name="borrowernumber"]');
373
        $checkboxes[0]->click;
454
        $checkboxes[0]->click;
374
        $patron_selected_text = $driver->find_element('//div[@id="table_search_selections"]/span')->get_text;
455
        $patron_selected_text = $driver->find_element('//div[@id="table_search_selections"]/span')->get_text;
375
        is( $patron_selected_text, "Patrons selected: 3", "Three patrons are selected" );
456
        is( $patron_selected_text, "Patrons selected: 3", "Three patrons are selected" );
Lines 389-396 subtest 'Search patrons' => sub { Link Here
389
        $driver->find_element('//button[@id="add_to_patron_list_submit"]')->click;
470
        $driver->find_element('//button[@id="add_to_patron_list_submit"]')->click;
390
        sleep $DT_delay && $s->wait_for_ajax;
471
        sleep $DT_delay && $s->wait_for_ajax;
391
        is( $driver->find_element('//*[@id="patron_list_dialog"]')->get_text, "Added 3 patrons to $patron_list_name." );
472
        is( $driver->find_element('//*[@id="patron_list_dialog"]')->get_text, "Added 3 patrons to $patron_list_name." );
392
        my $patron_list = $schema->resultset('PatronList')->search({ name => $patron_list_name })->next;
473
        my $patron_list = $schema->resultset('PatronList')->search( { name => $patron_list_name } )->next;
393
        is( $schema->resultset('PatronListPatron')->search({ patron_list_id => $patron_list->patron_list_id })->count, 3 );
474
        is(
475
            $schema->resultset('PatronListPatron')->search( { patron_list_id => $patron_list->patron_list_id } )->count,
476
            3
477
        );
394
478
395
        $patron_list->delete;
479
        $patron_list->delete;
396
    };
480
    };
397
- 

Return to bug 30645