new test suite for atom with some subs from the original ../test.pl

This commit is contained in:
Alex Schroeder
2006-09-18 00:06:31 +00:00
parent 73b9365ddc
commit e1a5d27f19
2 changed files with 462 additions and 0 deletions

124
t/atom-test.t Normal file
View File

@@ -0,0 +1,124 @@
#!/usr/bin/perl
do 'test.pl';
package OddMuse;
use XML::Atom::Client;
use XML::Atom::Entry;
use XML::Atom::Person;
use Test::More tests => 42;
clear_pages();
print "Preparing new entry\n";
my $api = XML::Atom::Client->new;
my $entry = XML::Atom::Entry->new;
my $title = 'New Post';
my $summary = 'Created';
my $content = 'Content of my post ' . rand(999) . "\n";
my $username = 'Alex';
ok($entry->title($title), 'set post title');
ok($entry->summary($summary), 'set post summary');
ok($entry->content($content), 'set post content');
my $author = XML::Atom::Person->new;
ok($author->name($username), 'set author name');
ok($entry->author($author), 'set entry author');
my $PostURI = 'http://localhost/cgi-bin/wiki.pl/atom';
my $MemberURI = $api->createEntry($PostURI, $entry);
ok($MemberURI, 'posting entry returns member URI')
or diag($api->errstr);
my $result = $api->getEntry($MemberURI);
ok($result, 'get created entry')
or diag($api->errstr);
ok($result->title eq $title, 'verify title');
ok($result->summary eq $summary, 'verify summary');
ok($result->content->body eq $content, 'verify content');
ok($result->author->name eq $username, 'verify author');
$MemberURI = '';
my @links = ($result->link);
ok($#links >= 0, 'verify link');
for my $link (@links) {
if ($link->rel eq 'edit') {
$MemberURI = $link->href;
last;
} else {
print "Ignoring ", $link->href, "\n";
}
}
ok($MemberURI, 'entry contains member URI');
$summary = 'Updated';
$content = "No more random numbers!\n";
ok($entry->summary($summary), 'change summary');
ok($entry->content($content), 'change content');
ok($api->updateEntry($MemberURI, $entry), 'update entry')
or diag($api->errstr);
$result = $api->getEntry($MemberURI);
ok($result, 'get updated entry')
or diag($api->errstr);
ok($result->title eq $title, 'verify title');
ok($result->summary eq $summary, 'verify summary');
ok($result->content->body eq $content, 'verify content');
ok($result->author->name eq $username, 'verify author');
my $new_title = 'Same old post';
ok($entry->title($new_title), 'rename entry');
ok($api->updateEntry($MemberURI, $entry), 'post renamed entry')
or diag($api->errstr);
$result = $api->getEntry($MemberURI);
ok($result, 'get renamed old entry')
or diag($api->errstr);
ok($result->title eq $title, 'verify title');
ok($result->summary eq "Renamed to $new_title", 'verify summary');
ok($result->content->body eq 'DeletedPage', 'verify deleted page');
ok($result->author->name eq $username, 'verify author');
my $FeedURI = 'http://localhost/cgi-bin/wiki.pl/atom/feed';
my $feed = $api->getFeed($FeedURI);
ok($feed, 'checking feed');
my @entries = $feed->entries;
ok($#entries >= 1, 'verify feed entries'); # at least 2, start at 0
$result = undef;
for $entry (@entries) {
if ($entry->author and $entry->author->name eq $username
and $entry->title eq $new_title) {
$result = $entry;
last;
}
}
ok($result, 'result found in the feed');
ok($result->title eq $new_title, 'verify title');
ok($result->summary eq $summary, 'verify summary');
ok(!$result->content, 'no content in the default feed');
ok($result->author->name eq $username, 'verify author');
$FeedURI = 'http://localhost/cgi-bin/wiki.pl/atom/full/feed?rsslimit=2';
my $feed = $api->getFeed($FeedURI);
ok($feed, 'checking full feed');
my @entries = $feed->entries;
ok($#entries >= 1, 'verify full feed entries'); # at least 2, start at 0
$result = undef;
for $entry (@entries) {
if ($entry->author and $entry->author->name eq $username
and $entry->title eq $new_title) {
$result = $entry;
last;
}
}
ok($result, 'result found in the full feed');
ok($result->title eq $new_title, 'verify title');
ok($result->summary eq $summary, 'verify summary');
sub trim {
$_ = shift;
s/^\s+//g;
s/\s+$//g;
return $_;
}
ok(trim($result->content->body) eq ("<p>" . trim($content) . '</p>'), 'verify content');
ok($result->author->name eq $username, 'verify author');

338
t/test.pl Executable file
View File

@@ -0,0 +1,338 @@
#!/usr/bin/perl
# Copyright (C) 2004, 2005, 2006 Alex Schroeder <alex@emacswiki.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the
# Free Software Foundation, Inc.
# 59 Temple Place, Suite 330
# Boston, MA 02111-1307 USA
use XML::LibXML;
use Encode;
# Import the functions
package OddMuse;
$RunCGI = 0; # don't print HTML on stdout
$UseConfig = 0; # don't read module files
do 'wiki.pl';
Init();
my ($passed, $failed) = (0, 0);
my $resultfile = "/tmp/test-markup-result-$$";
my $redirect;
undef $/;
$| = 1; # no output buffering
sub url_encode {
my $str = shift;
return '' unless $str;
my @letters = split(//, $str);
my @safe = ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '-', '_', '.'); # shell metachars are unsafe
foreach my $letter (@letters) {
my $pattern = quotemeta($letter);
if (not grep(/$pattern/, @safe)) {
$letter = sprintf("%%%02x", ord($letter));
}
}
return join('', @letters);
}
print "* means that a page is being updated\n";
sub update_page {
my ($id, $text, $summary, $minor, $admin, @rest) = @_;
print '*';
my $pwd = $admin ? 'foo' : 'wrong';
$id = url_encode($id);
$text = url_encode($text);
$summary = url_encode($summary);
$minor = $minor ? 'on' : 'off';
my $rest = join(' ', @rest);
$redirect = `perl wiki.pl Save=1 title=$id summary=$summary recent_edit=$minor text=$text pwd=$pwd $rest`;
$output = `perl wiki.pl action=browse id=$id`;
# just in case a new page got created or NearMap or InterMap
$IndexInit = 0;
$NearInit = 0;
$InterInit = 0;
$RssInterwikiTranslateInit = 0;
InitVariables();
return $output;
}
print "+ means that a page is being retrieved\n";
sub get_page {
print '+';
open(F,"perl wiki.pl @_ |");
my $output = <F>;
close F;
return $output;
}
print ". means a test\n";
sub test_page {
my $page = shift;
my $printpage = 0;
foreach my $str (@_) {
print '.';
if ($page =~ /$str/) {
$passed++;
} else {
$failed++;
$printpage = 1;
print "\nSimple Test: Did not find \"", $str, '"';
}
}
print "\n\nPage content:\n", $page, "\n" if $printpage;
}
sub test_page_negative {
my $page = shift;
my $printpage = 0;
foreach my $str (@_) {
print '.';
if ($page =~ /$str/) {
$failed++;
$printpage = 1;
print "\nSimple negative Test: Found \"", $str, '"';
} else {
$passed++;
}
}
print "\n\nPage content:\n", $page, "\n" if $printpage;
}
sub get_text_via_xpath {
my ($page, $test) = @_;
$page =~ s/^.*?<html>/<html>/s; # strip headers
my $parser = XML::LibXML->new();
my $doc;
eval { $doc = $parser->parse_html_string($page) };
if ($@) {
print "Could not parse html: $@\n", $page, "\n\n";
$failed += 1;
} else {
print '.';
my $nodelist;
eval { $nodelist = $doc->findnodes($test) };
if ($@) {
$failed++;
print "\nXPATH Test: failed to run $test: $@\n";
} elsif ($nodelist->size()) {
$passed++;
return $nodelist->string_value();
} else {
$failed++;
print "\nXPATH Test: No matches for $test\n";
$page =~ s/^.*?<body/<body/s;
print substr($page,0,30000), "\n";
}
}
}
sub xpath_test {
my ($page, @tests) = @_;
$page =~ s/^.*?<html>/<html>/s; # strip headers
my $parser = XML::LibXML->new();
my $doc;
eval { $doc = $parser->parse_html_string($page) };
if ($@) {
print "Could not parse html: ", substr($page,0,100), "\n";
$failed += @tests;
} else {
foreach my $test (@tests) {
print '.';
my $nodelist;
eval { $nodelist = $doc->findnodes($test) };
if ($@) {
$failed++;
print "\nXPATH Test: failed to run $test: $@\n";
} elsif ($nodelist->size()) {
$passed++;
} else {
$failed++;
print "\nXPATH Test: No matches for $test\n";
$page =~ s/^.*?<body/<body/s; # strip
print substr($page,0,30000), "\n";
}
}
}
}
sub negative_xpath_test {
my ($page, @tests) = @_;
$page =~ s/^.*?<html>/<html>/s; # strip headers
my $parser = XML::LibXML->new();
my $doc = $parser->parse_html_string($page);
foreach my $test (@tests) {
print '.';
my $nodelist = $doc->findnodes($test);
if (not $nodelist->size()) {
$passed++;
} else {
$failed++;
$printpage = 1;
print "\nXPATH Test: Unexpected matches for $test\n";
}
}
}
sub apply_rules {
my $input = shift;
local *STDOUT;
$output = '';
open(STDOUT, '>', \$output) or die "Can't open memory file: $!";
$FootnoteNumber = 0;
ApplyRules(QuoteHtml($input), 1);
return $output;
}
sub xpath_run_tests {
# translate embedded newlines (other backslashes remain untouched)
my %New;
foreach (keys %Test) {
$Test{$_} =~ s/\\n/\n/g;
my $new = $Test{$_};
s/\\n/\n/g;
$New{$_} = $new;
}
# Note that the order of tests is not specified!
my $output;
foreach my $input (keys %New) {
my $output = apply_rules($input);
xpath_test("<div>$output</div>", $New{$input});
}
}
sub test_match {
my ($input, @tests) = @_;
my $output = apply_rules($input);
foreach my $str (@tests) {
print '.';
if ($output =~ /$str/) {
$passed++;
} else {
$failed++;
$printpage = 1;
print "\n\n---- input:\n", $input,
"\n---- output:\n", $output,
"\n---- instead of:\n", $str, "\n----\n";
}
}
}
sub run_tests {
# translate embedded newlines (other backslashes remain untouched)
my %New;
foreach (keys %Test) {
$Test{$_} =~ s/\\n/\n/g;
my $new = $Test{$_};
s/\\n/\n/g;
$New{$_} = $new;
}
# Note that the order of tests is not specified!
foreach my $input (keys %New) {
print '.';
my $output = apply_rules($input);
if ($output eq $New{$input}) {
$passed++;
} else {
$failed++;
print "\n\n---- input:\n", $input,
"\n---- output:\n", $output,
"\n---- instead of:\n", $New{$input}, "\n----\n";
}
}
}
sub run_macro_tests {
# translate embedded newlines (other backslashes remain untouched)
my %New;
foreach (keys %Test) {
$Test{$_} =~ s/\\n/\n/g;
my $new = $Test{$_};
s/\\n/\n/g;
$New{$_} = $new;
}
# Note that the order of tests is not specified!
foreach my $input (keys %New) {
print '.';
$_ = $input;
foreach my $macro (@MyMacros) { &$macro; }
my $output = $_;
if ($output eq $New{$input}) {
$passed++;
} else {
$failed++;
print "\n\n---- input:\n", $input,
"\n---- output:\n", $output,
"\n---- instead of:\n", $New{$input}, "\n----\n";
}
}
}
sub remove_rule {
my $rule = shift;
my @list = ();
my $found = 0;
foreach my $item (@MyRules) {
if ($item ne $rule) {
push @list, $item;
} else {
$found = 1;
}
}
die "Rule not found" unless $found;
@MyRules = @list;
}
sub add_module {
my $mod = shift;
mkdir $ModuleDir unless -d $ModuleDir;
my $dir = `/bin/pwd`;
chop($dir);
symlink("$dir/modules/$mod", "$ModuleDir/$mod") or die "Cannot symlink $mod: $!"
unless -l "$ModuleDir/$mod";
do "$ModuleDir/$mod";
@MyRules = sort {$RuleOrder{$a} <=> $RuleOrder{$b}} @MyRules;
}
sub remove_module {
my $mod = shift;
mkdir $ModuleDir unless -d $ModuleDir;
unlink("$ModuleDir/$mod") or die "Cannot unlink: $!";
}
sub clear_pages {
system('/bin/rm -rf /tmp/oddmuse');
die "Cannot remove /tmp/oddmuse!\n" if -e '/tmp/oddmuse';
mkdir '/tmp/oddmuse';
open(F,'>/tmp/oddmuse/config');
print F "\$AdminPass = 'foo';\n";
# this used to be the default in earlier CGI.pm versions
print F "\$ScriptName = 'http://localhost/wiki.pl';\n";
print F "\$SurgeProtection = 0;\n";
close(F);
$ScriptName = 'http://localhost/test.pl'; # different!
$IndexInit = 0;
%IndexHash = ();
$InterSiteInit = 0;
%InterSite = ();
$NearSiteInit = 0;
%NearSite = ();
%NearSearch = ();
}
1;