The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
no warnings qw(uninitialized);
use Cwd;
use Apache::Test;
use Apache::TestUtil;
use Apache::TestRequest qw(GET_BODY GET_OK);
use Apache::Wyrd::Services::MySQLIndex;
my $directory = getcwd();
#Note -- This line is to silence some errors using Apache::Test v. 1.19
eval 'use lib $directory';
$directory = "$directory/t" if (-d 't');

my $index = undef;
my $dbh = undef;
my $count = &count;

eval <<'EVAL';
	use DBI;
	$dbh = DBI->connect('DBI:mysql:test', 'test', '');
EVAL

if ($@) {
	$count = 0;
	warn "Could not initialize a connection to database 'test': $@";
} elsif (!$dbh) {
	$count = 0;
	warn "DBI Connection failed to be opened.";
}

my $create_routine = <<"CREATE";
drop table if exists _wyrd_index;
create table _wyrd_index (
id integer not null auto_increment primary key,
name varchar(255) unique not null,
timestamp long,
digest char(40),
data blob,
wordcount integer,
title varchar(255),
keywords varchar(255),
description text,
regular varchar(255),
map varchar(255)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

drop table if exists _wyrd_index_data;
create table _wyrd_index_data (
item varchar(255) not null,
id integer,
tally integer
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

drop table if exists _wyrd_index_regular;
create table _wyrd_index_regular (
item varchar(255) not null,
id integer,
tally integer
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

drop table if exists _wyrd_index_map;
create table _wyrd_index_map (
item varchar(255) not null,
id integer,
tally integer
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE

for my $query (split ';', $create_routine) {
	last if ($count == 0);
	my $sh = $dbh->prepare($query);
	$sh->execute;
	if ($sh->err) {
		warn $sh->errstr;
		$count = 0;
	}
}

if (!$count) {
	warn <<'WARNING';

Could not initialize MySQL database.  Will skip on this platform.  To test,
make sure:

1. MySQL is installed and running
2. A user account for database test exists: test, and that it has no password
3. user account 'test' has sufficient privileges to create tables and insert
   data.
4. dbd::mysql is installed and working

WARNING
}

print "1..$count\n";

exit 0 if (!$count);

print "not " unless (GET_OK '/25.html');
print "ok 1 - Index creation\n";

eval {
	$index = Apache::Wyrd::Services::MySQLIndex->new({
	dbh => $dbh,
	attributes => [qw(regular map)],
	maps => [qw(map)],
	strict => 1,
	debug => 1
})};
$index->read_db;

print "not " if ($@);
print "ok 2 - Index tie\n";

print "not " unless (GET_OK '/25.html');
print "ok 3 - Indexable objects\n";

my $text = GET_BODY '/25.html';

my $found = $index->entry_by_name('one');

print "not " if (ref($found) ne 'HASH');
print "ok 4 - Lookup\n";

print "not " if ($found->{description} ne 'first');
print "ok 5 - Find by name\n";

print "not " if ($found->{regular} ne 'regular1');
print "ok 6 - Custom regular attribute\n";

my @found = $index->word_search('one');

print "not " if (@found != 2);
print "ok 7 - Find by word\n";

@found = $index->word_search('four', 'map');

print "not " if (@found != 2);
print "ok 8 - Find by custom map\n";

@found = $index->word_search('+one');

print "not " if (@found != 2);
print "ok 9 - Exclusive word search\n";

@found = $index->word_search('+one +more');

print "not " if (@found != 1);
print "ok 10 - Exclusive word search combined 1\n";

@found = $index->word_search('+one -more');

print "not " if (@found != 1);
print "ok 11 - Exclusive word search combined 2\n";

@found = $index->word_search('-one -more');

print "not " if (@found != 2);
print "ok 12 - Exclusive word search combined 3\n";

@found = $index->word_search('-one -more');

print "not " if (@found != 2);
print "ok 13 - Exclusive word search combined 4\n";

@found = $index->parsed_search('one AND more');

print "not " if (@found != 1);
print "ok 14 - Exclusive logical search 1\n";

@found = $index->parsed_search('one NOT more');

print "not " if (@found != 1);
print "ok 15 - Exclusive logical search 2\n";

@found = $index->parsed_search('this AND (another OR more)');

print "not " if (@found != 4);
print "ok 16 - Exclusive logical search 3\n";

@found = $index->parsed_search('NOT one NOT more');

print "not " if (@found != 2);
print "ok 17 - Exclusive logical search 4\n";

#$index->delete_index;
$found = $index->get_entry('one');

print "not " if ($found->{description});
print "ok 18 - Zero index\n";

sub count {18}