Another dev release for teh CPANZ. Errors are no longer fatal by default.
[catagits/Catalyst-Authentication-Credential-OpenID.git] / t / live-app.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4
5 use FindBin;
6 use IO::Socket;
7 use Test::More;
8 use Test::WWW::Mechanize;
9
10 plan skip_all => 'set TEST_HTTP to enable this test' unless $ENV{TEST_HTTP};
11 eval "use Catalyst::Devel 1.0";
12 plan skip_all => 'Catalyst::Devel required' if $@;
13
14 # plan "no_plan";
15 plan tests => 21;
16
17 # One port for consumer app, one for provider.
18 my $consumer_port = 10000 + int rand(1 + 10000);
19 my $provider_port = $consumer_port;
20 $provider_port = 10000 + int rand(1 + 10000) until $consumer_port != $provider_port;
21
22 my $provider_pipe = "perl -I$FindBin::Bin/../lib -I$FindBin::Bin/Provider/lib $FindBin::Bin/Provider/script/testapp_server.pl -p $consumer_port |";
23
24 my $consumer_pipe = "perl -I$FindBin::Bin/../lib -I$FindBin::Bin/Consumer/lib $FindBin::Bin/Consumer/script/testapp_server.pl -p $provider_port |";
25
26 my $provider_pid = open my $provider, $provider_pipe
27     or die "Unable to spawn standalone HTTP server for Provider: $!";
28
29 diag("Started Provider with pid $provider_pid");
30
31 my $consumer_pid = open my $consumer, $consumer_pipe
32     or die "Unable to spawn standalone HTTP server for Consumer: $!";
33
34 diag("Started Consumer with pid $consumer_pid");
35
36 # How long to wait for test server to start and timeout for UA.
37 my $seconds = 15;
38
39 diag("Waiting (up to $seconds seconds) for application servers to start...");
40
41 eval {
42     local $SIG{ALRM} = sub { die "Servers took too long to start\n" }; # NB: \n required
43     alarm($seconds);
44     sleep 1 while check_port( 'localhost', $provider_port ) != 1;
45     sleep 1 while check_port( 'localhost', $consumer_port ) != 1;
46     alarm(0)
47 };
48
49 if ( $@ )
50 {
51     shut_down();
52     die "Could not run test: $@";
53 }
54
55 my $openid_consumer = $ENV{CATALYST_SERVER} = "http://localhost:$consumer_port";
56 my $openid_server = "http://localhost:$provider_port";
57
58 # Tests start --------------------------------------------
59 diag("Started...") if $ENV{TEST_VERBOSE};
60
61 my $mech = Test::WWW::Mechanize->new(timeout => $seconds);
62
63 $mech->get_ok($openid_consumer, "GET $openid_consumer");
64
65 $mech->content_contains("You are not signed in.", "Content looks right");
66
67 $mech->get_ok("$openid_consumer/signin_openid", "GET $openid_consumer/signin_openid");
68
69 {
70     my $claimed_uri = "$openid_server/provider/paco";
71
72     $mech->submit_form_ok({ form_name => "openid",
73                             fields => { openid_identifier => $claimed_uri,
74                             },
75                           },
76                           "Trying OpenID login, 'openid' realm");
77
78     $mech->content_contains("You're not signed in so you can't be verified",
79                             "Can't use OpenID, not signed in at provider");
80 }
81
82 # Bad claimed URI.
83 {
84     my $claimed_uri = "gopher://localhost:443/what?";
85     $mech->back();
86     $mech->submit_form( form_name => "openid",
87                          fields => { openid_identifier => $claimed_uri,
88                                    },
89                        );
90
91     diag("Trying OpenID with ridiculous URI")
92         if $ENV{TEST_VERBOSE};
93
94     # no_identity_server: The provided URL doesn't declare its OpenID identity server.
95
96     is( $mech->status, 500,
97         "Can't use OpenID: bogus_url" );
98 }
99
100 # Bad claimed URI.
101 {
102     my $claimed_uri = "localhost/some/path";
103     $mech->back();
104     $mech->submit_form( form_name => "openid",
105                          fields => { openid_identifier => $claimed_uri,
106                                    },
107                        );
108
109     diag("Trying OpenID with phony URI")
110         if $ENV{TEST_VERBOSE};
111
112     # no_identity_server: The provided URL doesn't declare its OpenID identity server.
113     is( $mech->status, 500,
114         "Can't use OpenID: no_identity_server");
115 }
116
117
118
119 #
120 $mech->get_ok("$openid_server/login", "GET $openid_consumer/login");
121
122 # diag($mech->content);
123
124 $mech->submit_form_ok({ form_name => "login",
125                         fields => { username => "paco",
126                                     password => "l4s4v3n7ur45",
127                                 },
128                        },
129                       "Trying cleartext login, 'memebers' realm");
130
131 $mech->content_contains("signed in", "Signed in successfully");
132
133 $mech->get_ok("$openid_consumer/signin_openid", "GET $openid_consumer/signin_openid");
134
135 $mech->content_contains("Sign in with OpenID", "Content looks right");
136
137 my $claimed_uri = "$openid_server/provider/paco";
138
139 $mech->submit_form_ok({ form_name => "openid",
140                         fields => { openid_identifier => $claimed_uri,
141                                 },
142                     },
143                       "Trying OpenID login, 'openid' realm");
144
145 $mech->content_contains("You did it with OpenID!",
146                         "Successfully signed in with OpenID");
147
148 $mech->get_ok($openid_consumer, "GET $openid_consumer");
149
150 $mech->content_contains("provider/paco", "OpenID info is in the user");
151
152 # can't be verified
153
154 $mech->get_ok("$openid_consumer/logout", "GET $openid_consumer/logout");
155
156 $mech->get_ok("$openid_consumer/signin_openid", "GET $openid_consumer/signin_openid");
157
158 $mech->content_contains("Sign in with OpenID", "Content looks right");
159
160 $mech->submit_form_ok({ form_name => "openid",
161                         fields => { openid_identifier => $claimed_uri,
162                                 },
163                     },
164                       "Trying OpenID login, 'openid' realm");
165
166 $mech->content_contains("can't be verified",
167                         "Proper failure for unauthenticated memember.");
168
169 shut_down();
170
171 exit 0;
172
173 # Tests end ----------------------------------------------
174
175 sub shut_down {
176     kill INT => $provider_pid, $consumer_pid;
177     close $provider;
178     close $consumer;
179 }
180
181 sub check_port {
182     my ( $host, $port ) = @_;
183
184     my $remote = IO::Socket::INET->new(
185         Proto    => "tcp",
186         PeerAddr => $host,
187         PeerPort => $port
188     );
189     if ($remote) {
190         close $remote;
191         return 1;
192     }
193     else {
194         return 0;
195     }
196 }
197
198 __END__
199