AxKit2
view release on metacpan or search on metacpan
lib/AxKit2/Test.pm view on Meta::CPAN
status_is is_redirect no_redirect header_is
skip plan);
our $VERSION = 0.01;
# Module to assist with testing
my $ua = LWP::UserAgent->new;
$ua->agent(__PACKAGE__."/".$VERSION);
my $server_port = 54000;
sub get_free_port {
die "No ports free" if $server_port == 65534;
while (IO::Socket::INET->new(PeerAddr => "localhost:$server_port")) {
$server_port++;
}
if (IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port+1)) {
# server port free, console port isn't
$server_port += 2;
return get_free_port();
}
return $server_port;
}
my $server;
=head2 start_server <config> | <docroot> <plugins> <directives>
This takes either a configuration file excerpt as a string (anything that goes inside a <Server></Server> block),
or the document root, a list of plugins to load and a list of other configuration directives.
=cut
sub start_server {
my ($docroot, $plugins, $directives) = @_;
my $port = get_free_port();
if (defined $plugins) {
$directives ||= [];
$docroot = File::Spec->rel2abs($docroot);
$server = AxKit2::Test::Server->new($port,"DocumentRoot '$docroot'\n" .
join("\n",map { "Plugin $_" } @$plugins) . "\n" .
join("\n",@$directives) . "\n");
} else {
$server = AxKit2::Test::Server->new($port, $docroot);
}
return $server;
}
sub stop_server {
$server->shutdown();
undef $server;
}
sub http_get {
my ($url) = @_;
$url = "http://localhost:$server_port$url" if $url !~ m/^[a-z0-9]{1,6}:/i;
my $req = new HTTP::Request(GET => $url);
return ($req, $ua->request($req));
}
sub plan {
my $builder = __PACKAGE__->builder;
return $builder->plan(@_);
}
sub skip {
my $builder = __PACKAGE__->builder;
return $builder->skip(@_);
}
sub content_is {
my ($url, $content, $name, $ignore) = @_;
my $builder = __PACKAGE__->builder;
my $res = http_get($url);
if (!$ignore && !$res->is_success) {
$builder->ok(0,$name);
$builder->diag("Request for '${url}' failed with error code ".$res->status_line);
return 0;
}
my $got = $res->content;
$got =~ s/[\r\n]*$//;
$content =~ s/[\r\n]*$//;
$builder->is_eq($got, $content, $name) or $builder->diag("Request URL: ${url}");
}
sub header_is {
my ($url, $header, $content, $name, $ignore) = @_;
my $builder = __PACKAGE__->builder;
my $res = http_get($url);
if (!$ignore && !$res->is_success) {
$builder->ok(0,$name);
$builder->diag("Request for '${url}' failed with error code ".$res->status_line);
return 0;
}
my $got = $res->header($header);
$builder->is_eq($got, $content, $name) or $builder->diag("Request URL: ${url}");
}
sub content_matches {
my ($url, $regex, $name, $ignore) = @_;
my $builder = __PACKAGE__->builder;
my $res = http_get($url);
if (!$ignore && !$res->is_success) {
$builder->ok(0,$name);
$builder->diag("Request for '${url}' failed with error code ".$res->status_line);
return 0;
}
my $got = decode_utf8($res->content);
$got =~ s/[\r\n]*$//;
$regex = qr($regex) unless ref($regex);
$builder->like($got, $regex, $name) or $builder->diag("Request URL: ${url}");
}
sub content_doesnt_match {
my ($url, $regex, $name, $ignore) = @_;
my $builder = __PACKAGE__->builder;
my $res = http_get($url);
( run in 0.606 second using v1.01-cache-2.11-cpan-39bf76dae61 )