The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Wiki::Toolkit::TestLib;
use Test::More;

my $iterator = Wiki::Toolkit::TestLib->new_wiki_maker;
plan tests => ( 1 + $iterator->number * 7 );

use_ok( "Wiki::Toolkit::Plugin::Categoriser" );

while ( my $wiki = $iterator->new_wiki ) {
    print "#\n##### TEST CONFIG: Store: " . (ref $wiki->store) . "\n";

    my $categoriser = eval { Wiki::Toolkit::Plugin::Categoriser->new; };
    is( $@, "", "'new' doesn't croak" );
    isa_ok( $categoriser, "Wiki::Toolkit::Plugin::Categoriser" );
    $wiki->register_plugin( plugin => $categoriser );

    $wiki->write_node( "Calthorpe Arms", "beer", undef,
			 { category => [ "Pubs", "Pub Food" ] } )
      or die "Can't write node";
    $wiki->write_node( "Albion", "pub", undef,
			 { category => [ "Pubs", "Pub Food" ] } )
      or die "Can't write node";
    $wiki->write_node( "Ken Livingstone", "Congestion charge hero", undef,
                       { category => [ "People" ] } )
      or die "Can't write node";

    # Test ->in_category
    my $isa_pub = $categoriser->in_category( category => "Pubs",
                                             node     => "Albion" );
    ok( $isa_pub, "in_category returns true for things in the category" );
    $isa_pub = $categoriser->in_category( category => "Pubs",
                                          node     => "Ken Livingstone" );
    ok( !$isa_pub, "...and false for things not in the category" );

    $isa_pub = $categoriser->in_category( category => "pubs",
                                          node     => "Albion" );
    ok( $isa_pub, "...and is case-insensitive" );

    # Test ->categories
    my @categories = $categoriser->categories( node => "Calthorpe Arms" );
    is_deeply( [ sort @categories ], [ "Pub Food", "Pubs" ],
               "...->categories returns all categories" );

    # Make sure we only look at current category data.
    my %node_data = $wiki->retrieve_node( "Calthorpe Arms" );
    $wiki->write_node( "Calthorpe Arms",
                       "Oh noes, they stopped doing food!",
                       $node_data{checksum},
                       { category => [ "Pubs" ] } )
      or die "Can't write node";
    @categories = $categoriser->categories( node => "Calthorpe Arms" );
    is_deeply( \@categories, [ "Pubs" ],
               "->categories ignores out-of-date data" );
}