use strict; use Test::More; use URI::Escape; use Wiki::Toolkit::TestLib; my $iterator = Wiki::Toolkit::TestLib->new_wiki_maker; plan tests => ( 3 + $iterator->number * 22 ); use_ok( "Wiki::Toolkit::Feed::RSS" ); eval { my $rss = Wiki::Toolkit::Feed::RSS->new; }; ok( $@, "new croaks if no wiki object supplied" ); eval { my $rss = Wiki::Toolkit::Feed::RSS->new( wiki => "foo" ); }; ok( $@, "new croaks if something that isn't a wiki object supplied" ); while ( my $wiki = $iterator->new_wiki ) { # First, write some data. # Write two versions of one node # The recent changes should only show it once though $wiki->write_node( "Old Node", "First version of Old Node" ); my %old_node = $wiki->retrieve_node("Old Node"); $wiki->write_node( "Old Node", "We will write at least 15 nodes after this one", $old_node{'checksum'} ); my $slept = sleep(2); warn "Slept for less than a second, 'days=n' test may pass even if buggy" unless $slept >= 1; for my $i ( 1 .. 15 ) { $wiki->write_node( "Temp Node $i", "foo" ); } $slept = sleep(2); warn "Slept for less than a second, test results may not be trustworthy" unless $slept >= 1; $wiki->write_node( "Test Node 1", "Just a plain test", undef, { username => "Kake", comment => "new node", category => [ 'TestCategory1', 'Meta' ] } ); $slept = sleep(2); warn "Slept for less than a second, 'items=n' test may fail" unless $slept >= 1; $wiki->write_node( "Calthorpe Arms", "CAMRA-approved pub near King's Cross", undef, { comment => "Stub page, please update!", username => "Kake", postcode => "WC1X 8JR", locale => [ "Bloomsbury" ] } ); $wiki->write_node( "Test Node 2", "Gosh, another test!", undef, { username => "nou", comment => "This is a minor edit.", major_change => 0, } ); # Now set up a feed object and test it. my %default_config = ( wiki => $wiki, site_name => "Wiki::Toolkit Test Site", make_node_url => sub { my $id = uri_escape($_[0]); my $version = $_[1] || ''; $version = uri_escape($version) if $version; "http://example.com/?id=$id;version=$version"; }, recent_changes_link => "http://example.com/recentchanges" ); my $rss = eval { Wiki::Toolkit::Feed::RSS->new( %default_config, site_url => "http://example.com/kakeswiki/", ); }; is( $@, "", "'new' doesn't croak if wiki object and mandatory parameters supplied" ); isa_ok( $rss, "Wiki::Toolkit::Feed::RSS" ); my $feed = eval { $rss->recent_changes; }; is( $@, "", "->recent_changes doesn't croak" ); # Check the things that are generated by the mandatory arguments. like( $feed, qr||, "make_node_url is used" ); like( $feed, qr|1|, "version numbers included in feed" ); like( $feed, qr|new|, "page status included in feed" ); like( $feed, qr|major|, "change importance included and defaults to 'major'" ); my $charset = $wiki->store->{_charset}; like( $feed, qr|Kake|, "username picked up as contributor" ); like( $feed, qr|.*\[nou]|, "username included in description" ); like( $feed, qr|TestCategory1|, "dublin core subject contains category" ); # Check that interwiki things are passed through right. $rss = Wiki::Toolkit::Feed::RSS->new( %default_config, interwiki_identifier => "KakesWiki", site_url => "http://example.com/kakeswiki/", ); $feed = $rss->recent_changes; like( $feed, qr|KakesWiki|, "interwiki identifier passed through OK" ); # Check that diff url comes through. $rss = Wiki::Toolkit::Feed::RSS->new( %default_config, make_diff_url => sub { my $node_name = shift; return "http://example.com/?action=show_diff;id=" . uri_escape($node_name) }, site_url => "http://example.com/kakeswiki/", ); $feed = $rss->recent_changes; like( $feed, qr|http://example.com/\?action=show_diff;id=Calthorpe%20Arms|, "make_diff_url used" ); # Check that history url comes through. # Will use a different character set $rss = Wiki::Toolkit::Feed::RSS->new( %default_config, make_history_url => sub { my $node_name = shift; return "http://example.com/?action=history;id=" . uri_escape($node_name) }, site_url => "http://example.com/kakeswiki/", encoding => "UTF-16" ); $feed = $rss->recent_changes; like( $feed, qr|http://example.com/\?action=history;id=Calthorpe%20Arms|, "make_history_url used" ); # Test the 'items' parameter. $feed = $rss->recent_changes( items => 2 ); unlike( $feed, qr|Test Node 1|, "items param works" ); # Test the 'days' parameter. $feed = $rss->recent_changes( days => 2 ); like( $feed, qr|Old Node|, "days param works" ); # Test ignoring minor changes. $feed = $rss->recent_changes( ignore_minor_edits => 1 ); unlike( $feed, qr|This is a minor change.|, "ignore_minor_edits works" ); # Test personalised feeds. $feed = $rss->recent_changes( filter_on_metadata => { username => "Kake", }, ); unlike( $feed, qr|nou|, "can filter on a single metadata criterion" ); $feed = $rss->recent_changes( filter_on_metadata => { username => "Kake", locale => "Bloomsbury", }, ); unlike( $feed, qr|Test Node 1|, "can filter on two criteria" ); # Test the xml headers again, now we have given a character set like( $feed, qr|