Koha/t/QueryParser.t
Tomas Cohen Arazi 27eccf4122 Bug 12647: PQF QueryParser driver and unit tests fixes
Due to Perl 5.18, QueryParser the default search class is no longer
'keyword' (see bug 12738), and needs to be set manually. This patch
adds a line that does that. The problem that gets fixed is with test
'super simple keyword query'.

The rest of the non-deterministically failing tests are due to the same
problem, keys returning differently sorted keys from hashes.

So this patch sorts keys in the step that concatenates attributes when building
the PQF queries (and tests get adjusted to match the now deterministic result).

I did that (sorting there) under Jared's recommendation. Hopefuly he will step
in and comment/fix any mistake I made. My main concern was a possible loss
in performance. That we agreed it is almost void, because of the tiny size
of the hash.

Sponsored-by: Universidad Nacional de Cordoba
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
All tests are passing now again :)

Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
2014-08-11 10:09:38 -03:00

136 lines
5 KiB
Perl

#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use Test::Deep;
use Module::Load::Conditional qw(can_load);
BEGIN {
use_ok( 'Koha::QueryParser::Driver::PQF' );
}
my $QParser = Koha::QueryParser::Driver::PQF->new();
ok(defined $QParser, 'Successfully created empty QP object');
ok($QParser->load_config('./etc/searchengine/queryparser.yaml'), 'Loaded QP config');
is($QParser->search_class_count, 4, 'Initialized 4 search classes');
is (scalar(@{$QParser->search_fields()->{'keyword'}}), 111, "Correct number of search fields for 'keyword' class");
# Set keyword search as the default
$QParser->default_search_class('keyword');
my $kwd_search = q/@attr 1=1016 @attr 4=6/;
my $weight1 = q/@attr 2=102 @attr 9=20 @attr 4=6/;
my $weight2 = q/@attr 2=102 @attr 9=34 @attr 4=6/;
like( $QParser->target_syntax('biblioserver', 'smith'),
qr/\@or \@or $kwd_search "smith" ($weight1 "smith" $weight2 "smith"|$weight2 "smith" $weight1 "smith")/,
'super simple keyword query');
is($QParser->target_syntax('biblioserver', 'au:smith'),
'@attr 1=1003 @attr 4=6 "smith"', 'simple author query');
is($QParser->target_syntax('biblioserver', 'keyword|publisher:smith'),
'@attr 1=1018 @attr 4=6 "smith"', 'fielded publisher query');
is($QParser->target_syntax('biblioserver', 'ti:"little engine that could"'),
'@attr 1=4 @attr 4=1 "little engine that could"', 'phrase query');
is($QParser->target_syntax('biblioserver', 'keyword|titlekw:smith'),
'@attr 1=4 @attr 2=102 @attr 9=20 @attr 4=6 "smith"',
'relevance-bumped query');
is($QParser->target_syntax('biblioserver', 'au:smith && johnson'),
'@and @attr 1=1003 @attr 4=6 "smith" @attr 1=1003 @attr 4=6 "johnson"',
'query with boolean &&');
is($QParser->target_syntax('biblioserver', 'au:smith && ti:johnson'),
'@and @attr 1=1003 @attr 4=6 "smith" @attr 1=4 @attr 4=6 "johnson"', 'query with boolean &&');
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(-2008)'),
'@and @attr 1=1003 @attr 4=6 "smith" @attr 1=31 @attr 4=4 @attr 2=2 "2008"',
'keyword search with pubdate limited to -2008');
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(2008-)'),
'@and @attr 1=1003 @attr 4=6 "smith" @attr 1=31 @attr 4=4 @attr 2=4 "2008"',
'keyword search with pubdate limited to 2008-');
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(2008)'),
'@and @attr 1=1003 @attr 4=6 "smith" @attr 1=31 @attr 4=4 "2008"',
'keyword search with pubdate limited to 2008');
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(1980,2008)'),
'@and @attr 1=1003 @attr 4=6 "smith" @or @attr 1=31 @attr 4=4 "1980" @attr 1=31 @attr 4=4 "2008"',
'keyword search with pubdate limited to 1980, 2008');
is($QParser->target_syntax('biblioserver', 'au:smith #acqdate_dsc'),
'@or @attr 1=32 @attr 7=1 0 @attr 1=1003 @attr 4=6 "smith"',
'keyword search sorted by acqdate descending');
is($QParser->bib1_mapping_by_attr('field', 'biblioserver', {'1' => '1004'})->{'field'},
'personal', 'retrieve field by attr');
is($QParser->bib1_mapping_by_attr_string('field', 'biblioserver', '@attr 1=1004')->{'field'},
'personal', 'retrieve field by attrstring');
is ($QParser->clear_all_mappings, $QParser, 'clear all mappings returns self');
is ($QParser->clear_all_configuration, $QParser, 'clear all configuration returns self');
is (scalar(keys(%{$QParser->search_fields})), 0, "All mapping erased");
$QParser->add_bib1_field_map('author' => 'personal' => 'biblioserver' => { '1' => '1004' } );
$QParser->add_bib1_modifier_map('relevance' => 'biblioserver' => { '2' => '102' } );
my $desired_config = {
'field_mappings' => {
'author' => {
'personal' => {
'aliases' => [ ],
'bib1_mapping' => {
'biblioserver' => {
'1' => '1004'
}
},
'enabled' => '1',
'index' => 'personal',
'label' => 'Personal'
}
}
},
'filter_mappings' => {},
'modifier_mappings' => {
'relevance' => {
'bib1_mapping' => {
'biblioserver' => {
'2' => '102'
}
},
'enabled' => 1,
'label' => 'Relevance'
}
},
'relevance_bumps' => {}
};
SKIP: {
my $got_config;
skip 'YAML is unavailable', 2 unless can_load('modules' => { 'YAML::Any' => undef });
$got_config = YAML::Any::Load($QParser->serialize_mappings());
ok(ref $got_config, 'serialized YAML valid');
is_deeply($got_config, $desired_config, 'Mappings serialized correctly to YAML');
skip 'JSON is unavailable', 2 unless can_load('modules' => { 'JSON' => undef });
undef $got_config;
eval {
$got_config = JSON::from_json($QParser->serialize_mappings('json'));
};
is($@, '', 'serialized JSON valid');
is_deeply($got_config, $desired_config, 'Mappings serialized correctly to JSON');
}
$QParser->clear_all_mappings;
is($QParser->TEST_SETUP, $QParser, 'TEST_SETUP returns self');
is($QParser->search_class_count, 4, 'Initialized 4 search classes in test setup');
done_testing();