use strict;
use warnings FATAL => 'all';

use Apache::Test;
use Apache::TestRequest;
use Apache::TestUtil;
use Apache::TestConfig ();

my $config = Apache::Test::config();
my $server = $config->server;
my $version = $server->{version};
my $scheme = Apache::Test::vars()->{scheme};
my $hostport = Apache::TestRequest::hostport();

my $https = "nope";
$https = "yep" if $scheme eq "https";

my $pfx = "/modules/lua";

my @ts = (
    { url => "$pfx/hello.lua", rcontent => "Hello Lua World!\n", 
      ctype => "text/plain" },
    { url => "$pfx/404?translateme=1", rcontent => "Hello Lua World!\n" },

    { url => "$pfx/translate-inherit-before/404?translateme=1", rcontent => "other lua handler\n" },
    { url => "$pfx/translate-inherit-default-before/404?translateme=1", rcontent => "other lua handler\n" },
    { url => "$pfx/translate-inherit-after/404?translateme=1", rcontent => "Hello Lua World!\n" },

    { url => "$pfx/translate-inherit-before/404?translateme=1&ok=1", rcontent => "other lua handler\n" },
    { url => "$pfx/translate-inherit-default-before/404?translateme=1&ok=1", rcontent => "other lua handler\n" },
    # the more specific translate_name handler will run first and return OK.
    { url => "$pfx/translate-inherit-after/404?translateme=1&ok=1", rcontent => "other lua handler\n" },

    { url => "$pfx/version.lua", rcontent => qr(^$version) },
    { url => "$pfx/method.lua", rcontent => "GET" },
    { url => "$pfx/201.lua", rcontent => "", code => 201 },
    { url => "$pfx/https.lua", rcontent => $https },
    { url => "$pfx/setheaders.lua", rcontent => "",
                                    headers => { "X-Header" => "yes",
                                                 "X-Host"   => $hostport } },
    { url => "$pfx/setheaderfromparam.lua?HeaderName=foo&HeaderValue=bar",
                                    rcontent => "Header set",
                                    headers => { "foo" => "bar" } },
    { url => "$pfx/filtered/foobar.html",
          rcontent => "prefix\nbucket:foobar\nsuffix\n" },
);

plan tests => 4 * scalar @ts, need 'lua';

for my $t (@ts) {
    my $url = $t->{"url"};
    my $r = GET $url;
    my $code = $t->{"code"} || 200;
    my $headers = $t->{"headers"};

    ok t_cmp($r->code, $code, "code for $url");
    ok t_cmp($r->content, $t->{"rcontent"}, "response content for $url");

    if ($t->{"ctype"}) {
        ok t_cmp($r->header("Content-Type"), $t->{"ctype"}, "c-type for $url");
    }
    else {
        skip 1;
    }

    if ($headers) {
        my $correct = 1;
        while (my ($name, $value) = each %{$headers}) {
            my $actual = $r->header($name) || "<unset>";
            t_debug "'$name' header value is '$actual' (expected '$value')";

            if ($actual ne $value) {
                $correct = 0;
            }
        }
        ok $correct;
    }
    else {
        skip 1;
    }
}
