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 => ( 40 * 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";

	# Now add another version
    my %node_data = $wiki->retrieve_node("Home");

    ok( $wiki->write_node("Home", "xx", $node_data{checksum}),
        "write_node succeeds when node matches checksum" );

	# Now add a new node requiring moderation
    $wiki->write_node( "Moderation", "This is the moderated node.", undef, undef, 1);
    my %mn_data = $wiki->retrieve_node("Moderation");
	is( $mn_data{moderated}, '0', "First version shouldn't be moderated" );
	is( $mn_data{node_requires_moderation}, '1', "New node needs moderation" );

	# Update it
    ok( $wiki->write_node("Moderation", "yy", $mn_data{checksum}),
		"Can update where moderation is enabled" );

	# And another needing moderation
    $wiki->write_node( "Moderation2", "This is another moderated node.", undef, undef, 1);

	# And two versions of a third
    $wiki->write_node( "Moderation3", "3 This is another moderated node.", undef, undef, 1);
    my %mn3_data = $wiki->retrieve_node("Moderation3");
    ok( $wiki->write_node("Moderation3", "3yy3", $mn3_data{checksum}),
		"Can update where moderation is enabled" );



	# Now look for all nodes needing moderation
	my @all_mod_nodes = $wiki->list_unmoderated_nodes();
	my @new_mod_nodes = $wiki->list_unmoderated_nodes(only_where_latest=>1);

	# All should have nodes 2 (2 vers), 3 and 4 (2 vers)
	is( scalar @all_mod_nodes, 5, "Should find 5 needing moderation");

	# New should have nodes 2, 3 and 4
	is( scalar @new_mod_nodes, 3, "Should find 3 needing moderation");

	# Check we did get the right data back
	my %m21 = (name=>'Moderation', node_id=>2, version=>1, moderated_version=>1);
	my %m22 = (name=>'Moderation', node_id=>2, version=>2, moderated_version=>1);
	my %m31 = (name=>'Moderation2', node_id=>3, version=>1, moderated_version=>1);
	my %m41 = (name=>'Moderation3', node_id=>4, version=>1, moderated_version=>1);
	my %m42 = (name=>'Moderation3', node_id=>4, version=>2, moderated_version=>1);

	is_deeply( $all_mod_nodes[0], \%m21, "Should have right data" );
	is_deeply( $all_mod_nodes[1], \%m22, "Should have right data" );
	is_deeply( $all_mod_nodes[2], \%m31, "Should have right data" );
	is_deeply( $all_mod_nodes[3], \%m41, "Should have right data" );
	is_deeply( $all_mod_nodes[4], \%m42, "Should have right data" );

	is_deeply( $new_mod_nodes[0], \%m21, "Should have right data" );
	is_deeply( $new_mod_nodes[1], \%m31, "Should have right data" );
	is_deeply( $new_mod_nodes[2], \%m41, "Should have right data" );


	# Mark the last (only) version Moderation2 as moderated
	ok( $wiki->moderate_node("Moderation2", 1), "Can't moderate 1st version" );

	# Check counts now
	@all_mod_nodes = $wiki->list_unmoderated_nodes();
	@new_mod_nodes = $wiki->list_unmoderated_nodes(only_where_latest=>1);

	is( scalar @all_mod_nodes, 4, "Should find 4 needing moderation");
	is( scalar @new_mod_nodes, 2, "Should find 2 needing moderation");

	# Check data now
	is_deeply( $all_mod_nodes[0], \%m21, "Should have right data" );
	is_deeply( $all_mod_nodes[1], \%m22, "Should have right data" );
	is_deeply( $all_mod_nodes[2], \%m41, "Should have right data" );
	is_deeply( $all_mod_nodes[3], \%m42, "Should have right data" );

	is_deeply( $new_mod_nodes[0], \%m21, "Should have right data" );
	is_deeply( $new_mod_nodes[1], \%m41, "Should have right data" );


	# Mark the last version Moderation3 as moderated
	ok( $wiki->moderate_node("Moderation3", 2), "Can't moderate 2nd version" );
	
	# Check counts now
	@all_mod_nodes = $wiki->list_unmoderated_nodes();
	@new_mod_nodes = $wiki->list_unmoderated_nodes(only_where_latest=>1);

	is( scalar @all_mod_nodes, 3, "Should find 3 needing moderation");
	is( scalar @new_mod_nodes, 1, "Should find 1 needing moderation");

	# Check data now
	$m41{'moderated_version'} = 2; # Moderated version now shows 2
	is_deeply( $all_mod_nodes[0], \%m21, "Should have right data" );
	is_deeply( $all_mod_nodes[1], \%m22, "Should have right data" );
	is_deeply( $all_mod_nodes[2], \%m41, "Should have right data" );

	is_deeply( $new_mod_nodes[0], \%m21, "Should have right data" );
	
        # Check that we can make ->list_recent_changes show us only things
        # that have been moderated.
	my @rc_mod_nodes = $wiki->list_recent_changes( days => 7,
                                                 moderation => 1);

        # Sort them by name, since otherwise we get spurious test failures
        # if the initial node-writing takes more than a second.
        @rc_mod_nodes = sort { $a->{name} cmp $b->{name} } @rc_mod_nodes;

	is( scalar(@rc_mod_nodes), 4, "Count of recent changes nodes");
	is( $rc_mod_nodes[0]{name}, 'Home', "RC node 0 name" );
	is( $rc_mod_nodes[0]{version}, 2, "RC node 0 version" );
	is( $rc_mod_nodes[1]{name}, 'Moderation', "RC node 1 name" );
	is( $rc_mod_nodes[1]{version}, 1, "RC node 1 version" );
	is( $rc_mod_nodes[2]{name}, 'Moderation2', "RC node 2 name" );
	is( $rc_mod_nodes[2]{version}, 1, "RC node 2 version" );
	is( $rc_mod_nodes[3]{name}, 'Moderation3', "RC node 3 name" );
	is( $rc_mod_nodes[3]{version}, 2, "RC node 3 version" );
}