The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;
use Test::More tests => 13;
use Wiki::Toolkit::TestConfig;

my $class;
BEGIN {
    $class = "Wiki::Toolkit::Store::MySQL";
    use_ok($class);
}

eval { $class->new; };
ok( $@, "Failed creation dies" );

my %config = %{$Wiki::Toolkit::TestConfig::config{MySQL}};
my ($dbname, $dbuser, $dbpass, $dbhost) =
                                      @config{qw(dbname dbuser dbpass dbhost)};

SKIP: {
    skip "No MySQL database configured for testing", 11 unless $dbname;

    my $store = eval { $class->new( dbname => $dbname,
				    dbuser => $dbuser,
				    dbpass => $dbpass,
				    dbhost => $dbhost );
		     };
    is( $@, "", "Creation succeeds with connection parameters" );
    isa_ok( $store, $class );
    ok( $store->dbh, "...and has set up a database handle" );

    my $dsn = "dbi:mysql:$dbname";
    $dsn .= ";host=$dbhost" if $dbhost;
    my $dbh = DBI->connect( $dsn, $dbuser, $dbpass );
    my $evil_store = eval { $class->new( dbh => $dbh ); };
    is( $@, "", "Creation succeeds with dbh" );
    isa_ok( $evil_store, $class );
    ok( $evil_store->dbh, "...and we can retrieve the database handle" );

    # White box test - do internal locking functions work the way we expect?
    ok( $store->_lock_node("Home"), "Can lock a node" );
    ok( ! $evil_store->_lock_node("Home"),
        "...and now other people can't get a lock on it" );
    ok( ! $evil_store->_unlock_node("Home"),
        "...or unlock it" );
    ok( $store->_unlock_node("Home"), "...but I can unlock it" );
    ok( $evil_store->_lock_node("Home"),
	"...and now other people can lock it" );

    # Cleanup (not necessary, since this thread is about to die, but here
    # in case I forget and add some more tests at the end).
    $evil_store->_unlock_node("Home");

}