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;
use Time::Piece;

if ( scalar @Wiki::Toolkit::TestLib::wiki_info == 0 ) {
    plan skip_all => "no backends configured";
} else {
    plan tests => ( 12 * scalar @Wiki::Toolkit::TestLib::wiki_info );
}

my $iterator = Wiki::Toolkit::TestLib->new_wiki_maker;

while ( my $wiki = $iterator->new_wiki ) {
    # Put some test data in.
    $wiki->write_node( "Home", "This is the home node." )
      or die "Couldn't write node";

    # Test writing to existing nodes.
    my %node_data = $wiki->retrieve_node("Home");
    my $slept = sleep(2);
    warn "Slept for less than a second, 'lastmod' test may fail"
      unless $slept >= 1;

    ok( $wiki->write_node("Home", "xx", $node_data{checksum}),
        "write_node succeeds when node matches checksum" );
    ok( ! $wiki->write_node("Home", "foo", $node_data{checksum}),
        "...and flags when it doesn't" );
    my %new_node_data = $wiki->retrieve_node("Home");
    print "# version now: [$new_node_data{version}]\n";
    is( $new_node_data{version}, $node_data{version} + 1,
        "...and the version number is updated on successful writing" );
    my $lastmod = Time::Piece->strptime($new_node_data{last_modified},
                                   $Wiki::Toolkit::Store::Database::timestamp_fmt);
    my $prev_lastmod = Time::Piece->strptime($node_data{last_modified},
                                   $Wiki::Toolkit::Store::Database::timestamp_fmt);
    print "# [$lastmod] [$prev_lastmod]\n";
    ok( $lastmod > $prev_lastmod, "...as is last_modified" );
    my %old_content = $wiki->retrieve_node( name    => "Home",
                                            version => 2 );
	is( $old_content{'version'}, "2",  "...and old versions are still available" );
    is( $old_content{'content'}, "xx", "...and old versions have right content" );

	# Ensure it's the same whichever way we fetch the new version
	is_deeply(\%old_content, \%new_node_data, "New version the same however fetched");

    # Test retrieving with checksums.
    %node_data = $wiki->retrieve_node("Home");
    ok( $node_data{checksum}, "retrieve_node does return a checksum" );
    is( $node_data{content}, $wiki->retrieve_node("Home"),
        "...and the same content as when called in scalar context" );
    ok( $wiki->verify_checksum("Home", $node_data{checksum}),
        "...and verify_checksum is happy with the checksum" );

    $wiki->write_node( "Home", $node_data{content}, $node_data{checksum} )
      or die "Couldn't write node";
    ok( $wiki->verify_checksum("Home", $node_data{checksum}),
         "...still happy when we write node again with exact same content" );
    $wiki->write_node("Home", "foo bar wibble", $node_data{checksum} )
      or die "Couldn't write node";
    ok( ! $wiki->verify_checksum("Home", $node_data{checksum}),
        "...but not once we've changed the node content" );
}