Version 0.80006.
[catagits/Catalyst-Runtime.git] / t / unit_core_uri_for.t
1 use strict;
2 use warnings;
3
4 use Test::More tests => 19;
5 use URI;
6
7 use_ok('Catalyst');
8
9 my $request = Catalyst::Request->new( {
10                 base => URI->new('http://127.0.0.1/foo')
11               } );
12
13 my $context = Catalyst->new( {
14                 request => $request,
15                 namespace => 'yada',
16               } );
17
18 is(
19     Catalyst::uri_for( $context, '/bar/baz' )->as_string,
20     'http://127.0.0.1/foo/bar/baz',
21     'URI for absolute path'
22 );
23
24 is(
25     Catalyst::uri_for( $context, 'bar/baz' )->as_string,
26     'http://127.0.0.1/foo/yada/bar/baz',
27     'URI for relative path'
28 );
29
30 is(
31     Catalyst::uri_for( $context, '', 'arg1', 'arg2' )->as_string,
32     'http://127.0.0.1/foo/yada/arg1/arg2',
33     'URI for undef action with args'
34 );
35
36
37 is( Catalyst::uri_for( $context, '../quux' )->as_string,
38     'http://127.0.0.1/foo/quux', 'URI for relative dot path' );
39
40 is(
41     Catalyst::uri_for( $context, 'quux', { param1 => 'value1' } )->as_string,
42     'http://127.0.0.1/foo/yada/quux?param1=value1',
43     'URI for undef action with query params'
44 );
45
46 is (Catalyst::uri_for( $context, '/bar/wibble?' )->as_string,
47    'http://127.0.0.1/foo/bar/wibble%3F', 'Question Mark gets encoded'
48 );
49    
50 is( Catalyst::uri_for( $context, qw/bar wibble?/, 'with space' )->as_string,
51     'http://127.0.0.1/foo/yada/bar/wibble%3F/with%20space', 'Space gets encoded'
52 );
53
54 is(
55     Catalyst::uri_for( $context, '/bar', 'with+plus', { 'also' => 'with+plus' })->as_string,
56     'http://127.0.0.1/foo/bar/with+plus?also=with%2Bplus',
57     'Plus is not encoded'
58 );
59
60 # test with utf-8
61 is(
62     Catalyst::uri_for( $context, 'quux', { param1 => "\x{2620}" } )->as_string,
63     'http://127.0.0.1/foo/yada/quux?param1=%E2%98%A0',
64     'URI for undef action with query params in unicode'
65 );
66 is(
67     Catalyst::uri_for( $context, 'quux', { 'param:1' => "foo" } )->as_string,
68     'http://127.0.0.1/foo/yada/quux?param%3A1=foo',
69     'URI for undef action with query params in unicode'
70 );
71
72 # test with object
73 is(
74     Catalyst::uri_for( $context, 'quux', { param1 => $request->base } )->as_string,
75     'http://127.0.0.1/foo/yada/quux?param1=http%3A%2F%2F127.0.0.1%2Ffoo',
76     'URI for undef action with query param as object'
77 );
78
79 $request->base( URI->new('http://localhost:3000/') );
80 $request->match( 'orderentry/contract' );
81 is(
82     Catalyst::uri_for( $context, '/Orderentry/saveContract' )->as_string,
83     'http://localhost:3000/Orderentry/saveContract',
84     'URI for absolute path'
85 );
86
87 {
88     $request->base( URI->new('http://127.0.0.1/') );
89
90     $context->namespace('');
91
92     is( Catalyst::uri_for( $context, '/bar/baz' )->as_string,
93         'http://127.0.0.1/bar/baz', 'URI with no base or match' );
94
95     # test "0" as the path
96     is( Catalyst::uri_for( $context, qw/0 foo/ )->as_string,
97         'http://127.0.0.1/0/foo', '0 as path is ok'
98     );
99
100 }
101
102 # test with undef -- no warnings should be thrown
103 {
104     my $warnings = 0;
105     local $SIG{__WARN__} = sub { $warnings++ };
106
107     Catalyst::uri_for( $context, '/bar/baz', { foo => undef } )->as_string,
108     is( $warnings, 0, "no warnings emitted" );
109 }
110
111 # Test with parameters '/', 'foo', 'bar' - should not generate a //
112 is( Catalyst::uri_for( $context, qw| / foo bar | )->as_string,
113     'http://127.0.0.1/foo/bar', 'uri is /foo/bar, not //foo/bar'
114 );
115
116 TODO: {
117     local $TODO = 'RFCs are for people who, erm - fix this test..';
118     # Test rfc3986 reserved characters.  These characters should all be escaped
119     # according to the RFC, but it is a very big feature change so I've removed it
120     no warnings; # Yes, everything in qw is sane
121     is(
122         Catalyst::uri_for( $context, qw|! * ' ( ) ; : @ & = $ / ? % # [ ] ,|, )->as_string,
123         'http://127.0.0.1/%21/%2A/%27/%2B/%29/%3B/%3A/%40/%26/%3D/%24/%2C/%2F/%3F/%25/%23/%5B/%5D',
124         'rfc 3986 reserved characters'
125     );
126
127     # jshirley bug - why the hell does only one of these get encoded
128     #                has been like this forever however.
129     is(
130         Catalyst::uri_for( $context, qw|{1} {2}| )->as_string,
131         'http://127.0.0.1/{1}/{2}',
132         'not-escaping unreserved characters'
133     );
134 }
135