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 => ( 89 * 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" );
# Fetch it with and without specifying a version
my %new_node_data = $wiki->retrieve_node("Home");
my %new_node_data_v = $wiki->retrieve_node(name=>"Home", version=>$new_node_data{version});
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" );
is( $new_node_data{version}, $new_node_data_v{version},
"...and the version number is updated on successful writing" );
# Ensure that the moderation required flag isn't set on the node
is( $node_data{node_requires_moderation}, '0', "New node correctly doesn't require moderation" );
is( $new_node_data{node_requires_moderation}, '0', "Nor does it require moderation after being updated" );
is( $new_node_data_v{node_requires_moderation}, '0', "Nor does it require moderation after being updated via version" );
# Ensure the moderated flag is set on the two entries in content
is( $node_data{moderated}, '1', "No moderation required, so is moderated" );
is( $new_node_data{moderated}, '1', "No moderation required, so is moderated" );
is( $new_node_data_v{moderated}, '1', "No moderation required, so is moderated" );
# 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" );
# Shouldn't have the text if fetched without the version
is( $mn_data{content}, "=== This page has yet to be moderated. ===", "First version isn't moderated" );
# If we fetch with a version, we should get the text
my %mnv_data = $wiki->retrieve_node(name=>"Moderation", version=>1);
is( $mnv_data{content}, "This is the moderated node.", "Should get text if a version is given" );
is( $mnv_data{moderated}, '0', "First version shouldn't be moderated" );
is( $mnv_data{node_requires_moderation}, '1', "New node needs moderation" );
# Update it
my $nmn_ver = $wiki->write_node("Moderation", "yy", $mn_data{checksum});
ok( $nmn_ver, "Can update where moderation is enabled" );
my %nmn_data = $wiki->retrieve_node("Moderation");
my %nmnv_data = $wiki->retrieve_node(name=>"Moderation", version=>2);
is( $nmn_data{version}, '1', "Latest moderated version" );
is( $nmnv_data{version}, '2', "Latest unmoderated version" );
is( $nmn_ver, '2', "Latest (unmoderated) version returned by write_node" );
# Check content was updated right
is( $nmnv_data{content}, "yy", "Version 2 text");
# Should still be the same as before (unmoderated v1)
is_deeply(\%mn_data,\%nmn_data, "Should still be the unmod first ver");
is( $nmn_data{content}, "=== This page has yet to be moderated. ===", "No version is moderated" );
# Check node requires it still
is( $nmnv_data{node_requires_moderation}, '1', "New node needs moderation" );
# Check content not moderated
is( $nmnv_data{moderated}, '0', "Second version shouldn't be moderated" );
# Add the third entry
ok( $wiki->write_node("Moderation", "foo foo", $nmn_data{checksum}),
"Can update where moderation is enabled" );
my %mn3_data = $wiki->retrieve_node("Moderation");
is( $mn3_data{node_requires_moderation}, '1', "New node needs moderation" );
is( $mn3_data{moderated}, '0', "Third version shouldn't be moderated" );
is( $mn3_data{content}, "=== This page has yet to be moderated. ===", "No version is moderated" );
# Moderate the second entry
ok( $wiki->moderate_node("Moderation", 2), "Can't moderate 2nd version" );
%node_data = $wiki->retrieve_node(name=>"Moderation");
my %mmn2 = $wiki->retrieve_node(name=>"Moderation",version=>2);
# Node should now hold 2nd version
is( $mmn2{moderated}, '1', "Second version should now be moderated" );
is( $mmn2{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{moderated}, '1', "Current version should now be moderated" );
is( $node_data{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{content}, "yy", "Node should be second version" );
is( $node_data{version}, "2", "Node should be second version" );
# Moderate the first entry
ok( $wiki->moderate_node(name=>"Moderation", version=>1), "Can't moderate 1st version" );
%node_data = $wiki->retrieve_node(name=>"Moderation");
my %mmn1 = $wiki->retrieve_node(name=>"Moderation",version=>1);
# First entry should now be moderated, but node should not be changed
is( $mmn1{moderated}, '1', "First version should now be moderated" );
is( $mmn1{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{moderated}, '1', "Current version should still be moderated" );
is( $node_data{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{content}, "yy", "Node should still be second version" );
is( $node_data{version}, "2", "Node should still be second version" );
# Moderate the third entry
ok( $wiki->moderate_node(name=>"Moderation", version=>3), "Can't moderate 3rd version" );
%node_data = $wiki->retrieve_node(name=>"Moderation");
my %mmn3 = $wiki->retrieve_node(name=>"Moderation",version=>3);
# Third entry should now be moderated, and node should have been changed
is( $mmn3{moderated}, '1', "Third version should now be moderated" );
is( $mmn3{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{moderated}, '1', "Current version should still be moderated" );
is( $node_data{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{content}, "foo foo", "Node should be third version" );
is( $node_data{version}, "3", "Node should be third version" );
# Add a 4th entry
ok( $wiki->write_node("Moderation", "bar bar", $node_data{checksum}),
"Can update where moderation is enabled" );
%node_data = $wiki->retrieve_node("Moderation");
my %mn4_data = $wiki->retrieve_node(name=>"Moderation", version=>4);
# Node should still be third entry, with 4th needing moderation
is( $node_data{moderated}, '1', "Current version should still be moderated" );
is( $node_data{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{content}, "foo foo", "Node should still be third version" );
is( $node_data{version}, "3", "Node should still be third version" );
is( $mn4_data{moderated}, '0', "New version shouldn't be moderated" );
is( $mn4_data{node_requires_moderation}, '1', "Still requires moderation" );
is( $mn4_data{content}, "bar bar", "Content should have fourth version" );
is( $mn4_data{version}, "4", "Content should have fourth version" );
# Add the 5th entry, and moderate it
ok( $wiki->write_node("Moderation", "I shall be deleted", $node_data{checksum}),
"Can update where moderation is enabled" );
%node_data = $wiki->retrieve_node("Moderation");
# Moderate it
ok( $wiki->moderate_node(name=>"Moderation", version=>5), "Can't moderate 5th version" );
my %mn5_data = $wiki->retrieve_node(name=>"Moderation", version=>5);
is( $mn5_data{moderated}, '1', "Current version should be moderated" );
is( $mn5_data{node_requires_moderation}, '1', "Still requires moderation" );
is( $mn5_data{content}, "I shall be deleted", "Node should be fifth version" );
is( $mn5_data{version}, "5", "Node should be fifth version" );
# Delete the 5th entry - should fall back to the 3rd
is( 1, $wiki->delete_node(name=>"Moderation", version=>5), "Can't delete 5th version" );
%node_data = $wiki->retrieve_node("Moderation");
is( $node_data{moderated}, '1', "Current version should still be moderated" );
is( $node_data{node_requires_moderation}, '1', "Still requires moderation" );
is( $node_data{content}, "foo foo", "Node should now be third version" );
is( $node_data{version}, "3", "Node should now be third version" );
# Delete the 4th version, should remain the 3rd version
# Now mark this node as not needing moderation, and add a new version
is( 1, $wiki->set_node_moderation(name=>"Moderation", required=>0), "Can set as not needing moderation" );
%node_data = $wiki->retrieve_node("Moderation");
is( $node_data{moderated}, '1', "Current version should still be moderated" );
is( $node_data{node_requires_moderation}, '0', "Doesn't requires moderation" );
is( $node_data{content}, "foo foo", "Node should now be third version" );
is( $node_data{version}, "3", "Node should now be third version" );
# Check now not moderated
ok( $wiki->write_node("Moderation", "No moderation", $node_data{checksum}),
"Can update where moderation is disabled again" );
my %mn5b_data = $wiki->retrieve_node(name=>"Moderation", version=>5);
%node_data = $wiki->retrieve_node("Moderation");
is_deeply( \%mn5b_data, \%node_data, "Version 5 (again) is the latest" );
is( $node_data{moderated}, '1', "Current version should be moderated" );
is( $node_data{node_requires_moderation}, '0', "Doesn't requires moderation" );
is( $node_data{content}, "No moderation", "Node should now be fifth version" );
is( $node_data{version}, "5", "Node should now be fifth version" );
# Now turn moderation back on
is( 1, $wiki->set_node_moderation(name=>"Moderation", required=>1), "Can set as needing moderation" );
%node_data = $wiki->retrieve_node("Moderation");
is( $node_data{moderated}, '1', "Current version should be moderated" );
is( $node_data{node_requires_moderation}, '1', "Now requires moderation" );
is( $node_data{content}, "No moderation", "Node should now be fifth version" );
is( $node_data{version}, "5", "Node should now be fifth version" );
# Test that the shorthand node_required_moderation behaves
is( 0, $wiki->node_required_moderation("MADE_UP"), "node_required_moderation behaves");
is( 0, $wiki->node_required_moderation("Home"), "node_required_moderation behaves");
is( 1, $wiki->node_required_moderation("Moderation"), "node_required_moderation behaves");
# Check that we get 0, not 1 back, when trying to set moderation
# on a node that doesn't exist
is( 0, $wiki->set_node_moderation(name=>"NODE THAT DOES NOT EXIST", required=>1), "returns 0 if you set moderation on an unknown node" );
}