Koha/t/lib/KohaTest/Search/NoZebra.pm
Galen Charlton 496b6c8ef4 bugfix - fix 'not' operator in NoZebra
Corrected bug that prevented the 'not' operator
from working consistently - i.e., a search of
'mice not men' would not always work.

Also added test cases for NoZebra, so far focusing on
NZanalyse and adding and deleting bibs.  A couple of
the test cases are currently known to fail and
therefore are marked TODO.  The tests in question
are to verify that rows in nozebra are removed if
no bib is linked to the relevant word.  However, it
looks like such rows are retained, just with
nozebra.biblionubmers set to ''.  Is there any
reason to keep these rows?

Signed-off-by: Joshua Ferraro <jmf@liblime.com>
2008-05-16 08:18:25 -05:00

233 lines
8.8 KiB
Perl

package KohaTest::Search::NoZebra;
use base qw( KohaTest::Search );
use strict;
use warnings;
use Test::More;
use MARC::Record;
use C4::Search;
use C4::Biblio;
use C4::Context;
=head2 STARTUP METHODS
These get run once, before the main test methods in this module
=cut
=head3 startup_50_init_nozebra
Turn on NoZebra mode, for now, assumes and requires
that the test database has started out using Zebra.
=cut
sub startup_50_init_nozebra : Test( startup => 3 ) {
my $using_nozebra = C4::Context->preference('NoZebra');
ok(!$using_nozebra, "starting out using Zebra");
my $dbh = C4::Context->dbh;
$dbh->do("UPDATE systempreferences SET value=1 WHERE variable='NoZebra'");
$dbh->do("UPDATE systempreferences SET value=0 WHERE variable in ('QueryFuzzy','QueryWeightFields','QueryStemming')");
$using_nozebra = C4::Context->preference('NoZebra');
ok($using_nozebra, "switched to NoZebra");
my $sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra");
$sth->execute;
my ($count) = $sth->fetchrow_array;
$sth->finish;
cmp_ok($count, '==', 0, "NoZebra index starts off empty");
}
sub startup_51_add_bibs : Test( startup => 2 ) {
my $self = shift;
my $bib1 = MARC::Record->new();
$bib1->leader(' nam a22 7a 4500');
$bib1->append_fields(
MARC::Field->new('010', ' ', ' ', a => 'lccn001'),
MARC::Field->new('020', ' ', ' ', a => 'isbn001'),
MARC::Field->new('022', ' ', ' ', a => 'issn001'),
MARC::Field->new('100', ' ', ' ', a => 'Cat, Felix T.'),
MARC::Field->new('245', ' ', ' ', a => 'Of mice and men :', b=> 'a history'),
);
my $bib2 = MARC::Record->new();
$bib2->leader(' nam a22 7a 4500');
$bib2->append_fields(
MARC::Field->new('010', ' ', ' ', a => 'lccn002'),
MARC::Field->new('020', ' ', ' ', a => 'isbn002'),
MARC::Field->new('022', ' ', ' ', a => 'issn002'),
MARC::Field->new('100', ' ', ' ', a => 'Dog, Rover T.'),
MARC::Field->new('245', ' ', ' ', a => 'Of mice and men :', b=> 'a digression'),
);
my $dbh = C4::Context->dbh;
my $count_sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra");
my $count;
my ($bib1_bibnum, $bib1_bibitemnum) = AddBiblio($bib1, '');
$count_sth->execute;
($count) = $count_sth->fetchrow_array;
cmp_ok($count, '==', 14, "correct number of new words indexed"); # tokens + biblionumber + __RAW__
my ($bib2_bibnum, $bib2_bibitemnum) = AddBiblio($bib2, '');
$count_sth->execute;
($count) = $count_sth->fetchrow_array;
cmp_ok($count, '==', 22, "correct number of new words indexed"); # tokens + biblionumber + __RAW__
push @{ $self->{nozebra_test_bibs} }, $bib1_bibnum, $bib2_bibnum;
}
=head2 TEST METHODS
Standard test methods
=cut
sub basic_searches_via_nzanalyze : Test( 28 ) {
my $self = shift;
my ($bib1_bibnum, $bib2_bibnum) = @{ $self->{nozebra_test_bibs} };
my $results = C4::Search::NZanalyse('foobar');
ok(!defined($results), "no hits on 'foobar'");
$results = C4::Search::NZanalyse('dog');
my ($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 1, "one hit on 'dog'");
is($bib2_bibnum, $bibnumbers[0], "correct hit on 'dog'");
$results = C4::Search::NZanalyse('au=dog');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 1, "one hit on 'au=dog'");
is($bib2_bibnum, $bibnumbers[0], "correct hit on 'au=dog'");
$results = C4::Search::NZanalyse('isbn=dog');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 0, "zero hits on 'isbn=dog'");
$results = C4::Search::NZanalyse('cat');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 1, "one hit on 'cat'");
is($bib1_bibnum, $bibnumbers[0], "correct hit on 'cat'");
$results = C4::Search::NZanalyse('cat and dog');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 0, "zero hits on 'cat and dog'");
$results = C4::Search::NZanalyse('cat or dog');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 2, "two hits on 'cat or dog'");
is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'cat or dog'");
$results = C4::Search::NZanalyse('mice and men');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 2, "two hits on 'mice and men'");
is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'mice and men'");
$results = C4::Search::NZanalyse('title=digression or issn=issn001');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 2, "two hits on 'title=digression or issn=issn001'");
is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'title=digression or issn=issn001'");
$results = C4::Search::NZanalyse('title=digression and issn=issn002');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 1, "two hits on 'title=digression and issn=issn002'");
is($bib2_bibnum, $bibnumbers[0], "correct hit on 'title=digression and issn=issn002'");
$results = C4::Search::NZanalyse('mice not men');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 0, "zero hits on 'mice not men'");
$results = C4::Search::NZanalyse('mice not dog');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 1, "one hit on 'mice not dog'");
is($bib1_bibnum, $bibnumbers[0], "correct hit on 'mice not dog'");
$results = C4::Search::NZanalyse('isbn > a');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 2, "two hits on 'isbn > a'");
is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'isbn > a'");
$results = C4::Search::NZanalyse('isbn < z');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 2, "two hits on 'isbn < z'");
is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'isbn < z'");
$results = C4::Search::NZanalyse('isbn > isbn001');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 1, "one hit on 'isbn > isbn001'");
is($bib2_bibnum, $bibnumbers[0], "correct hit on 'isbn > isbn001'");
$results = C4::Search::NZanalyse('isbn>=isbn001');
($hits, @bibnumbers) = parse_nzanalyse($results);
cmp_ok($hits, '==', 2, "two hits on 'isbn>=isbn001'");
is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'isbn>=isbn001'");
}
sub parse_nzanalyse {
my $results = shift;
my @bibnumbers = ();
if (defined $results) {
# NZanalyze currently has a funky way of returning results -
# it does not guarantee that a biblionumber occurs only
# once in the results string. Hence we must remove
# duplicates, like NZorder (inefficently) does
my %hash;
@bibnumbers = grep { ++$hash{$_} == 1 } map { my @f = split /,/, $_; $f[0]; } split /;/, $results;
}
return scalar(@bibnumbers), @bibnumbers;
}
=head2 SHUTDOWN METHODS
These get run once, after all of the main tests methods in this module
=cut
sub shutdown_49_remove_bibs : Test( shutdown => 4 ) {
my $self = shift;
my ($bib1_bibnum, $bib2_bibnum) = @{ $self->{nozebra_test_bibs} };
my $dbh = C4::Context->dbh;
my $count_sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra");
my $count;
my $error = DelBiblio($bib2_bibnum);
ok(!defined($error), "deleted bib $bib2_bibnum");
$count_sth->execute;
($count) = $count_sth->fetchrow_array;
TODO: { local $TODO = 'nothing actually gets deleted from nozebra currently';
cmp_ok($count, '==', 14, "correct number of words indexed after bib $bib2_bibnum deleted");
}
$error = DelBiblio($bib1_bibnum);
ok(!defined($error), "deleted bib $bib1_bibnum");
$count_sth->execute;
($count) = $count_sth->fetchrow_array;
TODO: { local $TODO = 'nothing actually gets deleted from nozebra currently';
cmp_ok($count, '==', 0, "no entries left in nozebra after bib $bib1_bibnum deleted");
}
delete $self->{nozebra_test_bibs};
}
sub shutdown_50_init_nozebra : Test( shutdown => 3 ) {
my $using_nozebra = C4::Context->preference('NoZebra');
ok($using_nozebra, "still in NoZebra mode");
my $dbh = C4::Context->dbh;
$dbh->do("UPDATE systempreferences SET value=0 WHERE variable='NoZebra'");
$dbh->do("UPDATE systempreferences SET value=1 WHERE variable in ('QueryFuzzy','QueryWeightFields','QueryStemming')");
$using_nozebra = C4::Context->preference('NoZebra');
ok(!$using_nozebra, "switched to Zebra");
# FIXME
$dbh->do("DELETE FROM nozebra");
my $sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra");
$sth->execute;
my ($count) = $sth->fetchrow_array;
$sth->finish;
cmp_ok($count, '==', 0, "NoZebra index finishes up empty");
}
1;