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;

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

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

while ( my $wiki = $iterator->new_wiki ) {
	# Add three base nodes
    foreach my $name ( qw( Carrots Handbags Cheese ) ) {
        $wiki->write_node( $name, "content" ) or die "Can't write node";
    }

	# Add three more versions of Cheese
	my %node = $wiki->retrieve_node("Cheese");
	$wiki->write_node("Cheese", "Content v2", $node{checksum}, { "foo" => "bar" } ) or die "Can't write node";

	%node = $wiki->retrieve_node("Cheese");
	$wiki->write_node("Cheese", "Content v3", $node{checksum}, { "foo" => "bar", "bar" => "foo" } ) or die "Can't write node";

	%node = $wiki->retrieve_node("Cheese");
	$wiki->write_node("Cheese", "Content v4", $node{checksum} ) or die "Can't write node";


	# Fetch all the versions
	my @all_versions = $wiki->list_node_all_versions("Cheese");

	is( scalar @all_versions, 4, "list_node_all_versions gives the right number back" );

	# Check them
	is( $all_versions[0]->{'version'}, 4, "right ordering" );
	is( $all_versions[1]->{'version'}, 3, "right ordering" );
	is( $all_versions[2]->{'version'}, 2, "right ordering" );
	is( $all_versions[3]->{'version'}, 1, "right ordering" );
	is( $all_versions[0]->{'name'}, "Cheese", "right node" );
	is( $all_versions[1]->{'name'}, "Cheese", "right node" );
	is( $all_versions[2]->{'name'}, "Cheese", "right node" );
	is( $all_versions[3]->{'name'}, "Cheese", "right node" );


	# Fetch with content too
	@all_versions = $wiki->list_node_all_versions(
								name => "Cheese",
								with_content => 1
	);

	is( scalar @all_versions, 4, "list_node_all_versions gives the right number back" );

	# Check them
	is( $all_versions[0]->{'version'}, 4, "right ordering" );
	is( $all_versions[1]->{'version'}, 3, "right ordering" );
	is( $all_versions[2]->{'version'}, 2, "right ordering" );
	is( $all_versions[3]->{'version'}, 1, "right ordering" );
	is( $all_versions[0]->{'name'}, "Cheese", "right node" );
	is( $all_versions[1]->{'name'}, "Cheese", "right node" );
	is( $all_versions[2]->{'name'}, "Cheese", "right node" );
	is( $all_versions[3]->{'name'}, "Cheese", "right node" );
	is( $all_versions[0]->{'content'}, "Content v4", "right node" );
	is( $all_versions[1]->{'content'}, "Content v3", "right node" );
	is( $all_versions[2]->{'content'}, "Content v2", "right node" );
	is( $all_versions[3]->{'content'}, "content", "right node" );


	# With metadata, but not content
	@all_versions = $wiki->list_node_all_versions(
								name => "Cheese",
								with_content => 0,
								with_metadata => 1
	);

	is( scalar @all_versions, 4, "list_node_all_versions gives the right number back" );

	# Check them
	is( $all_versions[0]->{'version'}, 4, "right ordering" );
	is( $all_versions[1]->{'version'}, 3, "right ordering" );
	is( $all_versions[2]->{'version'}, 2, "right ordering" );
	is( $all_versions[3]->{'version'}, 1, "right ordering" );
	is( $all_versions[0]->{'name'}, "Cheese", "right node" );
	is( $all_versions[1]->{'name'}, "Cheese", "right node" );
	is( $all_versions[2]->{'name'}, "Cheese", "right node" );
	is( $all_versions[3]->{'name'}, "Cheese", "right node" );
	is( $all_versions[0]->{'content'}, undef, "right node" );
	is( $all_versions[1]->{'content'}, undef, "right node" );
	is( $all_versions[2]->{'content'}, undef, "right node" );
	is( $all_versions[3]->{'content'}, undef, "right node" );

	my %md_1 = ();
	my %md_2 = (foo=>'bar');
	my %md_3 = (foo=>'bar',bar=>'foo');
	my %md_4 = ();

	is_deeply( $all_versions[0]->{'metadata'}, \%md_4, "right metadata" );
	is_deeply( $all_versions[1]->{'metadata'}, \%md_3, "right metadata" );
	is_deeply( $all_versions[2]->{'metadata'}, \%md_2, "right metadata" );
	is_deeply( $all_versions[3]->{'metadata'}, \%md_1, "right metadata" );


	# With both
	@all_versions = $wiki->list_node_all_versions(
								name => "Cheese",
								with_content => 1,
								with_metadata => 1
	);

	is( scalar @all_versions, 4, "list_node_all_versions gives the right number back" );

	# Check them
	is( $all_versions[0]->{'version'}, 4, "right ordering" );
	is( $all_versions[1]->{'version'}, 3, "right ordering" );
	is( $all_versions[2]->{'version'}, 2, "right ordering" );
	is( $all_versions[3]->{'version'}, 1, "right ordering" );
	is( $all_versions[0]->{'name'}, "Cheese", "right node" );
	is( $all_versions[1]->{'name'}, "Cheese", "right node" );
	is( $all_versions[2]->{'name'}, "Cheese", "right node" );
	is( $all_versions[3]->{'name'}, "Cheese", "right node" );
	is( $all_versions[0]->{'content'}, "Content v4", "right node" );
	is( $all_versions[1]->{'content'}, "Content v3", "right node" );
	is( $all_versions[2]->{'content'}, "Content v2", "right node" );
	is( $all_versions[3]->{'content'}, "content", "right node" );

	is_deeply( $all_versions[0]->{'metadata'}, \%md_4, "right metadata" );
	is_deeply( $all_versions[1]->{'metadata'}, \%md_3, "right metadata" );
	is_deeply( $all_versions[2]->{'metadata'}, \%md_2, "right metadata" );
	is_deeply( $all_versions[3]->{'metadata'}, \%md_1, "right metadata" );


	# Finally, check that we still only have 1 version of the carrots node
	my @carrots_versions = $wiki->list_node_all_versions(
								name => "Carrots",
								with_content => 1,
								with_metadata => 1
	);

	is( scalar @carrots_versions, 1, "list_node_all_versions gives the right number back" );

	is( $carrots_versions[0]->{'version'}, 1, "right ordering" );
	is( $carrots_versions[0]->{'name'}, "Carrots", "right node" );
}