5 use lib ("$FindBin::Bin/lib");
7 use stemmaweb::Test::Common;
10 use LWP::Protocol::PSGI;
11 use Test::WWW::Mechanize;
14 use HTML::TreeBuilder;
18 use stemmaweb::Test::DB;
20 my $dir = stemmaweb::Test::DB->new_db;
22 # NOTE: this test uses Text::Tradition::Directory
23 # to check user accounts really have been created.
24 # It'll need to be changed once that is replaced...
26 LWP::Protocol::PSGI->register(stemmaweb->psgi_app);
28 my $ua = Test::WWW::Mechanize->new;
30 io("$FindBin::Bin/var")->rmtree if io("$FindBin::Bin/var")->exists;
33 diag("Create OpenID based Google account");
34 my $scope = $dir->new_scope;
36 $ua->get_ok('http://localhost/login');
38 local *Catalyst::Authentication::Credential::OpenID::authenticate = sub {
39 my ( $self, $c, $realm, $authinfo ) = @_;
41 return $realm->find_user({
42 url => 'https://www.google.com/accounts/o8/id?id=XYZ',
43 email => 'test@example.com',
47 ok !$dir->find_user({ url => 'https://www.google.com/accounts/o8/id?id=XYZ' }), 'No such user, yet.';
52 openid_identifier => 'https://www.google.com/accounts/o8/id?id=XYZ',
56 $ua->content_contains('You have logged in.', 'Openid login works');
60 $ua->content_contains('Hello! test@example.com!', 'We are logged in.');
62 diag("Verify new OpenID Google account exists");
63 ok $dir->find_user({ url => 'https://www.google.com/accounts/o8/id?id=XYZ',
64 email => 'test@example.com',
65 }), 'The user is now there.';
68 # Converting to Google ID.
70 diag("Login/Convert to new Google+ account");
71 local *stemmaweb::Authentication::Credential::Google::authenticate = sub {
72 my ( $self, $c, $realm, $authinfo ) = @_;
74 return $realm->find_user({
75 openid_id => 'https://www.google.com/accounts/o8/id?id=XYZ',
77 email => $authinfo->{email},
80 $ua->get_ok('http://localhost/login');
85 id_token => 'something',
86 email => 'test@example.com',
90 $ua->content_contains('You have logged in.', 'G+ login works');
94 $ua->content_contains('Hello! test@example.com!', 'We are logged in.');
96 $ua->get_ok('/logout', 'Logged out');
100 diag("Create OpenID based Google account for email match");
101 my $scope = $dir->new_scope;
103 $ua->get_ok('http://localhost/login');
105 local *Catalyst::Authentication::Credential::OpenID::authenticate = sub {
106 my ( $self, $c, $realm, $authinfo ) = @_;
108 return $realm->find_user({
109 url => 'https://www.google.com/accounts/o8/id?id=42XYZ',
110 email => 'test42@example.com',
114 ok !$dir->find_user({ url => 'https://www.google.com/accounts/o8/id?id=42XYZ' }), 'No such user, yet.';
119 openid_identifier => 'https://www.google.com/accounts/o8/id?id=42XYZ',
123 $ua->content_contains('You have logged in.', 'Openid login works');
127 $ua->content_contains('Hello! test42@example.com!', 'We are logged in.');
129 diag("Verify new OpenID Google account for email match exists");
130 ok $dir->find_user({ url => 'https://www.google.com/accounts/o8/id?id=42XYZ',
131 email => 'test42@example.com',
132 }), 'The user is now there.';
135 # Converting to Google ID.
137 diag("Login/Convert to new Google+ account matching only on email");
138 local *stemmaweb::Authentication::Credential::Google::authenticate = sub {
139 my ( $self, $c, $realm, $authinfo ) = @_;
141 return $realm->find_user({
142 openid_id => 'https://www.google.com/accounts/o8/id?id=45XYZ',
144 email => $authinfo->{email},
147 $ua->get_ok('http://localhost/login');
152 id_token => 'something',
153 email => 'test42@example.com',
157 $ua->content_contains('You have logged in.', 'G+ login works');
161 $ua->content_contains('Hello! test42@example.com!', 'We are logged in.');
167 diag("Test converting OpenID based Google account with traditions");
168 my $scope = $dir->new_scope;
170 my $openid_u = $dir->find_user({ url => 'https://www.google.com/accounts/o8/id?id=AItOawlFTlpuHGcI67tqahtw7xOod9VNWffB-Qg',
171 email => 'openid@example.org',
173 ok($openid_u, 'The user is there.');
175 diag("Login/Convert to new Google+ account");
176 local *stemmaweb::Authentication::Credential::Google::authenticate = sub {
177 my ( $self, $c, $realm, $authinfo ) = @_;
179 return $realm->find_user({
180 openid_id => 'https://www.google.com/accounts/o8/id?id=AItOawlFTlpuHGcI67tqahtw7xOod9VNWffB-Qg',
182 email => $authinfo->{email},
185 $ua->get_ok('http://localhost/login');
190 id_token => 'something',
191 email => 'openid@example.org',
195 $ua->content_contains('You have logged in.', 'G+ login works');
197 $ua->content_contains('Hello! openid@example.org!', 'We are logged in.');
199 my $gplus_u = $dir->find_user({
200 openid_id => 'https://www.google.com/accounts/o8/id?id=AItOawlFTlpuHGcI67tqahtw7xOod9VNWffB-Qg',
202 email => 'openid@example.org'
205 foreach my $trad_id (0..$#{ $openid_u->traditions }) {
206 is($gplus_u->traditions->[$trad_id]->name, $openid_u->traditions->[$trad_id]->name, 'Traditions were copied over to G+ user');
213 diag("Verify we can login the new Google+ account again");
214 my $scope = $dir->new_scope;
215 # ok !$dir->find_user({ url => 'https://www.google.com/accounts/o8/id?id=XYZ' }), 'Old google-openid is gone.';
219 openid_id => 'https://www.google.com/accounts/o8/id?id=XYZ',
220 email => 'test@example.com',
221 }), 'The G+ user is there.';
225 $ua->get_ok('http://localhost/login');
227 local *stemmaweb::Authentication::Credential::Google::authenticate = sub {
228 my ( $self, $c, $realm, $authinfo ) = @_;
230 return $realm->find_user({
231 openid_id => 'https://www.google.com/accounts/o8/id?id=XYZ',
233 email => $authinfo->{email},
240 id_token => 'something',
241 email => 'test@example.com',
245 $ua->content_contains('You have logged in.', 'We can now log in to our created user');
249 $ua->content_contains('Hello! test@example.com!', 'We are logged in.');
252 # Brand new user just from open id.
255 diag("Create a fresh Google+ user");
256 my $scope = $dir->new_scope;
258 ok !$dir->find_user({ sub => 2, openid_id => 'https://www.google.com/accounts/o8/id2?id=XYZ', email => 'test2@exmple.com' }), 'The G+ user is not yet there.';
262 $ua->get_ok('http://localhost/login');
264 local *stemmaweb::Authentication::Credential::Google::authenticate = sub {
265 my ( $self, $c, $realm, $authinfo ) = @_;
267 return $realm->find_user({
268 openid_id => 'https://www.google.com/accounts/o8/id2?id=XYZ',
270 email => $authinfo->{email},
277 id_token => 'something',
278 email => 'test2@example.com',
282 $ua->content_contains('You have logged in.', 'We can now log in to our created user');
286 $ua->content_contains('Hello! test2@example.com!', 'We are logged in.');
288 ok $dir->find_user({ sub => 2, openid_id => 'https://www.google.com/accounts/o8/id2?id=XYZ', email => 'test2@example.com' }), 'The G+ user is there.';
292 $ua->get_ok('http://localhost/login');
297 id_token => 'something',
298 email => 'test2@example.com',
302 $ua->content_contains('You have logged in.', 'We can login again');
306 $ua->content_contains('Hello! test2@example.com!', 'We are logged in.');
312 my $scope = $dir->new_scope;
314 ok !$dir->find_user({ sub => 4242, openid_id => 'https://www.google.com/accounts/o8/id3', email => 'email@example.org' }), 'The G+ user is not yet there.';
318 $ua->get_ok('http://localhost/login');
323 id_token => 'eyJraWQiOiJhIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiI0MjQyIiwib3BlbmlkX2lkIjoiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hY2NvdW50cy9vOC9pZDMifQ.moNERe3UHCY4xGMPxdCqmbg2JKW5feVnYlA8jeB4CdE4c_KL3YHvICQeql-S486HT-AlWBeDJWMr6wWH1kkwz11a2D1oyJ8qCWBssHIkhfv8dm3dphmRbtzYssAOFdGsmnPH1oXolCnl-Qu9WgHkhYYnRJWHr3CkeNA6Yh1xOV3nkaa8REtJckuzh3jyKQgx_rjIFsWBPDmT1rqa_Q0XOGVK34N5tADwpcWmkb3fFnbddzd9L6MnybbFzF_S238Bpr5vNa9doXRBwvJ85AdSn1AWX8R6qVpDbbaiGL2RCahuZYF9XECYm6anee-KTKvxh02KXkG2zniKVvweaMlcbQ',
324 email => 'email@example.org',
328 $ua->content_contains('You have logged in.', 'We can now log in to our created user - the token was decoded');
332 $ua->content_contains('Hello! email@example.org!', 'We are logged in.');
334 ok $dir->find_user({ sub => 4242, openid_id => 'https://www.google.com/accounts/o8/id3', email => 'email@example.org' }), 'The G+ user is there.';
338 $ua->get_ok('http://localhost/login');
343 id_token => 'eyJraWQiOiJhIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiI0MjQyIiwib3BlbmlkX2lkIjoiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hY2NvdW50cy9vOC9pZDMifQ.moNERe3UHCY4xGMPxdCqmbg2JKW5feVnYlA8jeB4CdE4c_KL3YHvICQeql-S486HT-AlWBeDJWMr6wWH1kkwz11a2D1oyJ8qCWBssHIkhfv8dm3dphmRbtzYssAOFdGsmnPH1oXolCnl-Qu9WgHkhYYnRJWHr3CkeNA6Yh1xOV3nkaa8REtJckuzh3jyKQgx_rjIFsWBPDmT1rqa_Q0XOGVK34N5tADwpcWmkb3fFnbddzd9L6MnybbFzF_S238Bpr5vNa9doXRBwvJ85AdSn1AWX8R6qVpDbbaiGL2RCahuZYF9XECYm6anee-KTKvxh02KXkG2zniKVvweaMlcbQ',
344 email => 'email@example.org',
348 $ua->content_contains('You have logged in.', 'We can login again');
352 $ua->content_contains('Hello! email@example.org!', 'We are logged in.');
355 io("$FindBin::Bin/var")->rmtree if io("$FindBin::Bin/var")->exists;