Author: nick
Date: 2006-06-22 15:30:44 +0100 (Thu, 22 Jun 2006)
New Revision: 814
Modified:
trunk/lib/OpenGuides.pm
trunk/t/53_show_index.t
Log:
Support RSS and Atom for category and locale indicies, + test for this
Modified: trunk/lib/OpenGuides.pm
===================================================================
--- trunk/lib/OpenGuides.pm 2006-06-22 14:11:27 UTC (rev 813)
+++ trunk/lib/OpenGuides.pm 2006-06-22 14:30:44 UTC (rev 814)
@@ -484,6 +484,13 @@
format => "rdf",
);
+ # RSS / Atom version (recent changes style).
+ $guide->show_index(
+ type => "locale",
+ value => "Holborn",
+ format => "rss",
+ );
+
# Or return output as a string (useful for writing tests).
$guide->show_index(
type => "category",
@@ -567,6 +574,24 @@
$tt_vars{display_google_maps} = 1; # override for this page
$template = "map_index.tt";
+ } elsif( $args{format} eq "rss" || $args{format} eq "atom") {
+ # They really wanted a recent changes style rss/atom feed
+ my $feed_type = $args{format};
+ my ($feed,$content_type) = $self->get_feed_and_content_type($feed_type);
+
+ # Grab the actual node data out of @nodes
+ my @node_data;
+ foreach my $node (@nodes) {
+ $node->{node_data}->{name} = $node->{name};
+ push @node_data, $node->{node_data};
+ }
+
+ my $output = "Content-Type: ".$content_type."\n";
+ $output .= $feed->build_feed_for_nodes($feed_type, @node_data);
+
+ return $output if $args{return_output};
+ print $output;
+ return;
}
} else {
$template = "site_index.tt";
@@ -640,6 +665,37 @@
print $output;
}
+=item B<get_feed_and_content_type>
+
+Fetch the OpenGuides feed object, and the output content type, for the
+supplied feed type.
+
+Handles all the setup for the OpenGuides feed object.
+=cut
+sub get_feed_and_content_type {
+ my ($self, $feed_type) = @_;
+
+ my $feed = OpenGuides::Feed->new(
+ wiki => $self->wiki,
+ config => $self->config,
+ og_version => $VERSION,
+ );
+
+ my $content_type;
+
+ if ($feed_type eq 'rss') {
+ $content_type = "application/rdf+xml";
+ }
+ elsif ($feed_type eq 'atom') {
+ $content_type = "application/atom+xml";
+ }
+ else {
+ croak "Unknown feed type given: $feed_type";
+ }
+
+ return ($feed, $content_type);
+}
+
=item B<display_feed>
# Last ten non-minor edits to Hammersmith pages in RSS 1.0 format
@@ -712,24 +768,11 @@
}
- my $feed = OpenGuides::Feed->new(
- wiki => $self->wiki,
- config => $self->config,
- og_version => $VERSION,
- );
+ # Get the feed object, and the content type
+ my ($feed,$content_type) = $self->get_feed_and_content_type($feed_type);
- my $output;
+ my $output = "Content-Type: ".$content_type."\n";
- if ($feed_type eq 'rss') {
- $output = "Content-Type: application/rdf+xml\n";
- }
- elsif ($feed_type eq 'atom') {
- $output = "Content-Type: application/atom+xml\n";
- }
- else {
- croak "Unknown feed type given: $feed_type";
- }
-
# Get the feed, and the timestamp, in one go
my ($feed_output, $feed_timestamp) =
$feed->make_feed( %criteria );
Modified: trunk/t/53_show_index.t
===================================================================
--- trunk/t/53_show_index.t 2006-06-22 14:11:27 UTC (rev 813)
+++ trunk/t/53_show_index.t 2006-06-22 14:30:44 UTC (rev 814)
@@ -2,13 +2,13 @@
use Wiki::Toolkit::Setup::SQLite;
use OpenGuides;
use OpenGuides::Test;
-use Test::More tests => 6;
+use Test::More tests => 17; # 19 when all enabled
eval { require DBD::SQLite; };
my $have_sqlite = $@ ? 0 : 1;
SKIP: {
- skip "DBD::SQLite not installed - no database to test with", 6
+ skip "DBD::SQLite not installed - no database to test with", 17
unless $have_sqlite;
Wiki::Toolkit::Setup::SQLite::setup( { dbname => "t/node.db" } );
@@ -32,6 +32,8 @@
$wiki->write_node( "Test Page 2", "foo", undef,
{ category => "Alpha" } )
or die "Couldn't write node";
+
+ # Test the normal, HTML version
my $output = eval {
$guide->show_index(
type => "category",
@@ -44,6 +46,7 @@
"...and includes correct links" );
unlike( $output, qr|<title>\s*-|, "...sets <title> correctly" );
+ # Test the RDF version
$output = $guide->show_index(
type => "category",
value => "Alpha",
@@ -52,4 +55,43 @@
);
like( $output, qr|Content-Type: application/rdf\+xml|,
"RDF output gets content-type of application/rdf+xml" );
+ like( $output, qr|<rdf:RDF|, "Really is rdf" );
+ like( $output, qr|<dc:title>Category Alpha</dc:title>|, "Right rdf title" );
+ my @entries = ($output =~ /(\<rdf\:li\>)/g);
+ is( 2, scalar @entries, "Right number of nodes included in rdf" );
+
+ # Test the RSS version
+ $output = eval {
+ $guide->show_index(
+ type => "category",
+ value => "Alpha",
+ return_output => 1,
+ format => "rss",
+ );
+ };
+ is( $@, "", "->show_index doesn't die when asked for rss" );
+ like( $output, qr|Content-Type: application/rdf\+xml|,
+ "RSS output gets content-type of application/rdf+xml" );
+ like( $output, "/\<rdf\:RDF.*?http\:\/\/purl.org\/rss\//s", "Really is rss" );
+ #like( $output, qr|<title>Category Alpha</title>|, "Right rss title" );
+ my @entries = ($output =~ /(\<\/item\>)/g);
+ is( 2, scalar @entries, "Right number of nodes included in rss" );
+warn($output);
+
+ # Test the Atom version
+ $output = eval {
+ $guide->show_index(
+ type => "category",
+ value => "Alpha",
+ return_output => 1,
+ format => "atom",
+ );
+ };
+ is( $@, "", "->show_index doesn't die when asked for atom" );
+ like( $output, qr|Content-Type: application/atom\+xml|,
+ "Atom output gets content-type of application/atom+xml" );
+ like( $output, qr|<feed|, "Really is atom" );
+ #like( $output, qr|<title>Category Alpha</title>|, "Right atom title" );
+ my @entries = ($output =~ /(\<entry\>)/g);
+ is( 2, scalar @entries, "Right number of nodes included in atom" );
}