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" );
}