Prancer

 view release on metacpan or  search on metacpan

t/101.request.t  view on Meta::CPAN

#!/usr/bin/env perl

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

use Test::More;
use Plack::Test;
use HTTP::Request::Common qw(GET POST);

# these are the modules we are testing
use Prancer::Request;
use Prancer::Request::Upload;
use Prancer::Response;

{
    # test basic methods with a GET
    my $req = Prancer::Request->new({
          'HTTP_ACCEPT' => 'text/html, text/plain, text/css, text/sgml, */*;q=0.01',
          'HTTP_ACCEPT_ENCODING' => 'gzip, compress, bzip2',
          'HTTP_ACCEPT_LANGUAGE' => 'en',
          'HTTP_HOST' => 'localhost:5000',
          'HTTP_USER_AGENT' => 'Lynx/2.8.8dev.12 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.18',
          'HTTP_X_MYHEADER' => '123, 321',
          'PATH_INFO' => '/asdf',
          'QUERY_STRING' => '',
          'REMOTE_USER' => 'foobar',
          'REMOTE_ADDR' => '127.0.0.1',
          'REMOTE_PORT' => 41049,
          'REQUEST_METHOD' => 'GET',
          'REQUEST_URI' => '/asdf',
          'SCRIPT_NAME' => '',
          'SERVER_NAME' => 0,
          'SERVER_PORT' => 5000,
          'SERVER_PROTOCOL' => 'HTTP/1.0',
          'psgi.input' => undef,
          'psgi.errors' => undef,
          'psgi.multiprocess' => '',
          'psgi.multithread' => '',
          'psgi.nonblocking' => '',
          'psgi.run_once' => '',
          'psgi.streaming' => 1,
          'psgi.url_scheme' => 'http',
          'psgi.version' => [ 1, 1 ],
          'psgix.harakiri' => 1,
          'psgix.input.buffered' => 1,
    });

    isa_ok($req, 'Prancer::Request');
    is($req->uri(), 'http://localhost:5000/asdf');
    is($req->base(), 'http://localhost:5000/');
    is($req->method(), 'GET');
    is($req->protocol(), 'HTTP/1.0');
    is($req->scheme(), 'http');
    is($req->port(), 5000);
    is($req->secure(), 0);
    is($req->path(), '/asdf');
    is($req->body(), undef);
    is($req->address(), '127.0.0.1');
    is($req->user(), 'foobar');

    is($req->uri_for('fdsa'), 'http://localhost:5000/fdsa');
    is($req->uri_for('/fdsa'), 'http://localhost:5000/fdsa');
    is($req->uri_for('/logout', [ signoff => 1 ]), 'http://localhost:5000/logout?signoff=1');
}

# most of Prancer::Request and Prancer::Request::Upload are implemented by
# Plack and Prancer just proxies the requests through. However, Prancer does
# implement some of its own logic for:
#  - params
#  - cookies
#  - uploads
#  - upload basename

# test params, cookies
{
    my $req = Prancer::Request->new({
          'HTTP_COOKIE' => 'USER_TOKEN=Yes',
          'HTTP_ACCEPT' => 'text/html, text/plain, text/css, text/sgml, */*;q=0.01',
          'HTTP_ACCEPT_ENCODING' => 'gzip, compress, bzip2',
          'HTTP_ACCEPT_LANGUAGE' => 'en',
          'HTTP_HOST' => 'localhost:5000',
          'HTTP_USER_AGENT' => 'Lynx/2.8.8dev.12 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.18',
          'PATH_INFO' => '/asdf',
          'REMOTE_ADDR' => '127.0.0.1',
          'REMOTE_PORT' => 41049,
          'REQUEST_METHOD' => 'GET',
          'QUERY_STRING' => 'foo=bar&baz=bat&qwerty=fdsa&qwerty=asdf',
          'REQUEST_URI' => '/index?foo=bar&baz=bat&qwerty=fdsa&qwerty=asdf',
          'SCRIPT_NAME' => '',
          'SERVER_NAME' => 0,
          'SERVER_PORT' => 5000,
          'SERVER_PROTOCOL' => 'HTTP/1.0',
          'psgi.input' => undef,
          'psgi.errors' => undef,
          'psgi.multiprocess' => '',
          'psgi.multithread' => '',
          'psgi.nonblocking' => '',
          'psgi.run_once' => '',
          'psgi.streaming' => 1,
          'psgi.url_scheme' => 'http',
          'psgi.version' => [ 1, 1 ],
          'psgix.harakiri' => 1,
          'psgix.input.buffered' => 1,
    });

    {
        my @keys = $req->param();
        is_deeply([ sort @keys ], [ 'baz', 'foo', 'qwerty' ]);

        my $keys = $req->param();
        is($keys, 3);

        is($req->param('foo'), 'bar');
        is($req->param('baz'), 'bat');

        my @multivalue = $req->param('qwerty');
        is_deeply([ sort @multivalue ], [ 'asdf', 'fdsa' ]);

        my $multivalue = $req->param('qwerty');
        is($multivalue, 'asdf');
    }

    {
        my @keys = $req->cookie();
        is_deeply([ sort @keys ], [ 'USER_TOKEN' ]);

        my $keys = $req->cookie();
        is($keys, 1);

        is($req->cookie('USER_TOKEN'), 'Yes');

        my @multivalue = $req->cookie('USER_TOKEN');
        is_deeply([ sort @multivalue ], [ 'Yes' ]);

        my $multivalue = $req->cookie('USER_TOKEN');
        is($multivalue, 'Yes');
    }
}

# test posts with args
{
    my $app = sub {
        my $env = shift;
        my $request = Prancer::Request->new($env);
        my $response = Prancer::Response->new($env);

        is($request->param('foo'), 'bar');
        is($request->content(), 'foo=bar');

        return $response->finalize(200);
    };

    test_psgi($app, sub {
        my $cb = shift;
        my $res = $cb->(POST "/", { foo => "bar" });
        ok($res->is_success());
    });
}



( run in 3.131 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )