#!/usr/bin/perl

# (C) Maxim Dounin

# Tests for location selection.

###############################################################################

use warnings;
use strict;

use Test::More;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

my $t = Test::Nginx->new()->has(qw/http rewrite/)->plan(8)
	->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    server {
        listen       127.0.0.1:8080;
        server_name  localhost;

        location = / {
            add_header X-Location exactlyroot;
            return 204;
        }

        location / {
            add_header X-Location root;
            return 204;
        }

        location ^~ /images/ {
            add_header X-Location images;
            return 204;
        }

        location ~* \.(gif|jpg|jpeg)$ {
            add_header X-Location regex;
            return 204;
        }

        location ~ casefull {
            add_header X-Location casefull;
            return 204;
        }
    }
}

EOF

$t->run();

###############################################################################

like(http_get('/'), qr/X-Location: exactlyroot/, 'exactlyroot');
like(http_get('/x'), qr/X-Location: root/, 'root');
like(http_get('/images/t.gif'), qr/X-Location: images/, 'images');
like(http_get('/t.gif'), qr/X-Location: regex/, 'regex');
like(http_get('/t.GIF'), qr/X-Location: regex/, 'regex with mungled case');
like(http_get('/casefull/t.gif'), qr/X-Location: regex/, 'first regex wins');
like(http_get('/casefull/'), qr/X-Location: casefull/, 'casefull regex');

SKIP: {
	skip 'caseless os', 1
		if $^O eq 'MSWin32' or $^O eq 'darwin';

	like(http_get('/CASEFULL/'), qr/X-Location: root/,
     		'casefull regex do not match wrong case');
}

###############################################################################
