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 => ( 6 * 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( "Hammersmith Station", "a station", undef,
{ tube_data =>
{ line => "Piccadilly",
direction => "Eastbound",
next_station => "Baron's Court Station"
}
}
);
my %node_data = $wiki->retrieve_node( "Hammersmith Station" );
my %metadata = %{ $node_data{metadata} || {} };
ok( !defined $metadata{tube_data},
"hashref metadata not stored directly" );
ok( defined $metadata{__tube_data__checksum},
"checksum stored instead" );
ok( $wiki->write_node( "Hammersmith Station", "a station",
$node_data{checksum},
{ tube_data => [
{ line => "Piccadilly",
direction => "Eastbound",
next_station => "Baron's Court Station"
},
{ line => "Piccadilly",
direction => "Westbound",
next_station => "Acton Town Station"
}
]
}
),
"writing node with metadata succeeds when node checksum fresh" );
ok( !$wiki->write_node( "Hammersmith Station", "a station",
$node_data{checksum},
{ tube_data => [
{ line => "Piccadilly",
direction => "Eastbound",
next_station => "Baron's Court Station"
},
{ line => "Piccadilly",
direction => "Westbound",
next_station => "Acton Town Station"
}
]
}
),
"...but fails when node checksum old and hashref metadata changed");
# Make sure that order doesn't matter in the arrayrefs.
%node_data = $wiki->retrieve_node( "Hammersmith Station" );
$wiki->write_node( "Hammersmith Station", "a station",
$node_data{checksum},
{ tube_data => [
{ line => "Piccadilly",
direction => "Westbound",
next_station => "Acton Town Station"
},
{ line => "Piccadilly",
direction => "Eastbound",
next_station => "Baron's Court Station"
},
]
}
) or die "Couldn't write node";
ok( $wiki->verify_checksum("Hammersmith Station",$node_data{checksum}),
"order within arrayrefs doesn't affect checksum" );
my %node_data_check = $wiki->retrieve_node( "Hammersmith Station" );
my %metadata_check = %{ $node_data_check{metadata} || {} };
is( scalar @{ $metadata_check{__tube_data__checksum} }, 1,
"metadata checksum only written once even if multiple entries" );
}