The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More tests => 10;

use Search::InvertedIndex;
use Search::InvertedIndex::DB::Pg;

SKIP: {
    skip "Test database not configured", 10 unless -e "test.conf";

    require Config::Tiny;
    my $conf_ref = Config::Tiny->read( "test.conf" );
    my %conf = %{ $conf_ref->{_} };

    my $db = Search::InvertedIndex::DB::Pg->new(
        -db_name    => $conf{dbname},
        -hostname   => $conf{dbhost},
        -port       => $conf{dbport},
        -username   => $conf{dbuser},
        -password   => $conf{dbpass},
        -table_name => "siindex",
        -lock_mode  => "EX",
    );

    # Get the database object, open the map.
    my $map  = Search::InvertedIndex->new( -database => $db );

    # Avoid interference from other tests which may not have cleaned up
    $map->clear_all;

    # Check that there are no groups in the system.
    my $groups = $map->list_all_groups;
    is( scalar @$groups, 0,
        "list_all_groups finds no groups in cleared system" );
    is( $map->number_of_groups, 0, "...neither does number_of_groups" );

    # Explictly add some groups
    my @test_groups = qw( able baker charlie delta );
    foreach my $group ( @test_groups ) {
  	    $map->add_group( -group => $group );
    }

    # Check that we get back what we inserted.
    $groups = $map->list_all_groups;
    is_deeply( [ sort @$groups ], [ sort @test_groups ],
    	   "can get back groups we just added" );

    # Check that a newly-added group has no indexes.
    is( $map->number_of_indexes_in_group( -group => $test_groups[0] ), 0,
        "newly-added group has no indexes" );

    # Check that deletion of a nonexistent index has no side-effects.
    $map->remove_index_from_all( -index => "no such animal" );
    is( $map->number_of_indexes_in_group( -group => $test_groups[0] ), 0,
        "...index count still zero after deleting nonexistent index" );

    # Check no groups remain after clearing database.
    $map->clear_all;
    $groups = $map->list_all_groups;
    is( scalar @$groups, 0, "no groups remain after clear_all" );

    # Test deleting groups one by one.
    foreach my $group ( @test_groups ) {
  	    $map->add_group( -group => $group );
    }
    my $i = 0;
    foreach my $group ( reverse @test_groups ) {
        is( $map->first_group, $group,
            "first group is $group after $i deletions" );
        $map->remove_group( -group => $group );
        $i++;
      }

    # Clean up to avoid interfering with other tests.
    $map->clear_all;
}