Fix repos layout
[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 => 17;
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
40 diag("Waiting (up to $seconds seconds) for application servers to start...");
41
42 eval {
43     local $SIG{ALRM} = sub { die "Servers took too long to start\n" }; # NB: \n required
44     alarm($seconds);
45     sleep 1 while check_port( 'localhost', $provider_port ) != 1;
46     sleep 1 while check_port( 'localhost', $consumer_port ) != 1;
47     alarm(0)
48 };
49
50 if ( $@ )
51 {
52     shut_down();
53     die "Could not run test: $@";
54 }
55
56 my $root = $ENV{CATALYST_SERVER} = "http://localhost:$consumer_port";
57 my $openid_server = "http://localhost:$provider_port";
58
59 # Tests start --------------------------------------------
60 diag("Started...") if $ENV{TEST_VERBOSE};
61
62 my $mech = Test::WWW::Mechanize->new(timeout => $seconds);
63
64 $mech->get_ok($root, "GET $root");
65 $mech->content_contains("not signed in", "Content looks right");
66
67 $mech->get_ok("$openid_server/login", "GET $root/login");
68
69 # diag($mech->content);
70
71 $mech->submit_form_ok({ form_name => "login",
72                         fields => { username => "paco",
73                                     password => "l4s4v3n7ur45",
74                                 },
75                        },
76                       "Trying cleartext login, 'memebers' realm");
77
78 $mech->content_contains("signed in", "Signed in successfully");
79
80 $mech->get_ok("$root/signin_openid", "GET $root/signin_openid");
81
82 $mech->content_contains("Sign in with OpenID", "Content looks right");
83
84 my $claimed_uri = "$openid_server/provider/paco";
85
86 $mech->submit_form_ok({ form_name => "openid",
87                         fields => { openid_identifier => $claimed_uri,
88                                 },
89                     },
90                       "Trying OpenID login, 'openid' realm");
91
92 $mech->content_contains("You did it with OpenID!",
93                         "Successfully signed in with OpenID");
94
95 $mech->get_ok($root, "GET $root");
96
97 $mech->content_contains("provider/paco", "OpenID info is in the user");
98
99 # can't be verified
100
101 $mech->get_ok("$root/logout", "GET $root/logout");
102
103 $mech->get_ok("$root/signin_openid", "GET $root/signin_openid");
104
105 $mech->content_contains("Sign in with OpenID", "Content looks right");
106
107 $mech->submit_form_ok({ form_name => "openid",
108                         fields => { openid_identifier => $claimed_uri,
109                                 },
110                     },
111                       "Trying OpenID login, 'openid' realm");
112
113 $mech->content_contains("can't be verified",
114                         "Proper failure for unauthenticated memember.");
115
116 shut_down();
117
118 exit 0;
119
120 # Tests end ----------------------------------------------
121
122 sub shut_down {
123     kill INT => $provider_pid, $consumer_pid;
124     close $provider;
125     close $consumer;
126 }
127
128 sub check_port {
129     my ( $host, $port ) = @_;
130
131     my $remote = IO::Socket::INET->new(
132         Proto    => "tcp",
133         PeerAddr => $host,
134         PeerPort => $port
135     );
136     if ($remote) {
137         close $remote;
138         return 1;
139     }
140     else {
141         return 0;
142     }
143 }
144
145 __END__
146