blob: 4ea6a2f67a9a6400a01a2a8b99c22b888799e66f [file] [log] [blame]
Akrone8235be2016-06-27 11:02:18 +02001use Mojo::Base -strict;
Akronbe9d5b32017-04-05 20:48:24 +02002use Test::More;
Akrone8235be2016-06-27 11:02:18 +02003use Test::Mojo;
Akron0e1ed242018-10-11 13:22:00 +02004use Mojo::File qw/path/;
Akrone8235be2016-06-27 11:02:18 +02005use Data::Dumper;
6
Akron32396632018-10-11 17:08:37 +02007
8#####################
9# Start Fake server #
10#####################
Akron63d963b2019-07-05 15:35:51 +020011my $mount_point = '/realapi/';
Akron0e1ed242018-10-11 13:22:00 +020012$ENV{KALAMAR_API} = $mount_point;
Akrone8235be2016-06-27 11:02:18 +020013
Akron864c2932018-11-16 17:18:55 +010014my $t = Test::Mojo->new('Kalamar' => {
15 Kalamar => {
Akron7fb78d62021-06-10 12:51:13 +020016 plugins => ['Auth'],
17 },
18 'Kalamar-Auth' => {
19 jwt => 1
Akron864c2932018-11-16 17:18:55 +010020 }
21});
Akrone8235be2016-06-27 11:02:18 +020022
Akron0e1ed242018-10-11 13:22:00 +020023# Mount fake backend
24# Get the fixture path
Akron864c2932018-11-16 17:18:55 +010025my $fixtures_path = path(Mojo::File->new(__FILE__)->dirname, '..', 'server');
Akron0e1ed242018-10-11 13:22:00 +020026my $fake_backend = $t->app->plugin(
27 Mount => {
28 $mount_point =>
Akron73f36082018-10-25 15:34:59 +020029 $fixtures_path->child('mock.pl')
Akron0e1ed242018-10-11 13:22:00 +020030 }
31);
Akron0e1ed242018-10-11 13:22:00 +020032# Configure fake backend
33$fake_backend->pattern->defaults->{app}->log($t->app->log);
34
Akronbc6b3f22021-01-13 14:53:12 +010035my $q = qr!(?:\"|")!;
36
Akron63d963b2019-07-05 15:35:51 +020037$t->get_ok('/realapi/v1.0')
Akron0e1ed242018-10-11 13:22:00 +020038 ->status_is(200)
39 ->content_is('Fake server available');
Akron7d75ee32017-05-02 13:42:41 +020040
Akronbc213c02017-04-20 16:45:55 +020041$t->get_ok('/?q=Baum')
42 ->status_is(200)
43 ->text_like('h1 span', qr/KorAP: Find .Baum./i)
44 ->text_like('#total-results', qr/\d+$/)
Akronbc6b3f22021-01-13 14:53:12 +010045 ->content_like(qr/${q}authorized${q}:null/)
Akronc82b1bc2018-11-18 18:06:14 +010046 ->element_exists_not('div.button.top a')
Akron2d01d292018-11-23 11:17:35 +010047 ->element_exists_not('aside.active')
48 ->element_exists_not('aside.off')
Akronbc213c02017-04-20 16:45:55 +020049 ;
50
Akronbe9d5b32017-04-05 20:48:24 +020051$t->get_ok('/')
Akrona9c8b0e2018-11-16 20:20:28 +010052 ->status_is(200)
Akrone208d302020-11-28 11:14:50 +010053 ->element_exists('form[action=/user/login] input[name=handle]')
Akron2d01d292018-11-23 11:17:35 +010054 ->element_exists('aside.active')
55 ->element_exists_not('aside.off')
Akrona9c8b0e2018-11-16 20:20:28 +010056 ;
Akronbe9d5b32017-04-05 20:48:24 +020057
Akrone208d302020-11-28 11:14:50 +010058$t->post_ok('/user/login' => form => { handle => 'test', pwd => 'fail' })
Akron741b2b12017-04-13 22:15:59 +020059 ->status_is(302)
60 ->header_is('Location' => '/');
61
62$t->get_ok('/')
63 ->status_is(200)
64 ->element_exists('div.notify-error')
Akron3d673062019-01-29 15:54:16 +010065 ->text_is('div.notify-error', 'Bad CSRF token')
Akrone208d302020-11-28 11:14:50 +010066 ->element_exists('input[name=handle][value=test]')
Akronc82b1bc2018-11-18 18:06:14 +010067 ->element_exists_not('div.button.top a')
Akron741b2b12017-04-13 22:15:59 +020068 ;
Akronbe9d5b32017-04-05 20:48:24 +020069
Akrone208d302020-11-28 11:14:50 +010070$t->post_ok('/user/login' => form => { handle => 'test', pwd => 'pass' })
Akrone5ef4e02017-04-19 17:07:52 +020071 ->status_is(302)
72 ->header_is('Location' => '/');
73
Akron15158e02018-03-19 12:42:46 +010074my $csrf = $t->get_ok('/')
75 ->status_is(200)
76 ->element_exists('div.notify-error')
77 ->text_is('div.notify-error', 'Bad CSRF token')
Akronc82b1bc2018-11-18 18:06:14 +010078 ->element_exists_not('div.button.top a')
Akron15158e02018-03-19 12:42:46 +010079 ->tx->res->dom->at('input[name=csrf_token]')->attr('value')
80 ;
81
Akrond7ed34b2018-10-22 18:42:28 +020082$t->post_ok('/user/login' => form => {
Akrone208d302020-11-28 11:14:50 +010083 handle => 'test',
Akron3d673062019-01-29 15:54:16 +010084 pwd => 'ldaperr',
85 csrf_token => $csrf
86})
87 ->status_is(302)
88 ->content_is('')
89 ->header_is('Location' => '/');
90
91$csrf = $t->get_ok('/')
92 ->status_is(200)
93 ->element_exists('div.notify-error')
94 ->text_is('div.notify-error', '2022: LDAP Authentication failed due to unknown user or password!')
Akrone208d302020-11-28 11:14:50 +010095 ->element_exists('input[name=handle][value=test]')
Akron3d673062019-01-29 15:54:16 +010096 ->element_exists_not('div.button.top a')
97 ->tx->res->dom->at('input[name=csrf_token]')->attr('value')
98 ;
99
100$t->post_ok('/user/login' => form => {
Akrone208d302020-11-28 11:14:50 +0100101 handle => 'test',
Akron3d673062019-01-29 15:54:16 +0100102 pwd => 'unknown',
103 csrf_token => $csrf
104})
105 ->status_is(302)
106 ->content_is('')
107 ->header_is('Location' => '/');
108
109$csrf = $t->get_ok('/')
110 ->status_is(200)
111 ->element_exists('div.notify-error')
112 ->text_is('div.notify-error', 'Access denied')
Akrone208d302020-11-28 11:14:50 +0100113 ->element_exists('input[name=handle][value=test]')
Akron3d673062019-01-29 15:54:16 +0100114 ->element_exists_not('div.button.top a')
115 ->tx->res->dom->at('input[name=csrf_token]')->attr('value')
116 ;
117
118$t->post_ok('/user/login' => form => {
Akrone208d302020-11-28 11:14:50 +0100119 handle => 'test',
Akrond7ed34b2018-10-22 18:42:28 +0200120 pwd => 'pass',
121 csrf_token => $csrf
122})
Akron15158e02018-03-19 12:42:46 +0100123 ->status_is(302)
Akron864c2932018-11-16 17:18:55 +0100124 ->content_is('')
Akron15158e02018-03-19 12:42:46 +0100125 ->header_is('Location' => '/');
126
Akrone5ef4e02017-04-19 17:07:52 +0200127$t->get_ok('/')
128 ->status_is(200)
129 ->element_exists_not('div.notify-error')
130 ->element_exists('div.notify-success')
Akronbc213c02017-04-20 16:45:55 +0200131 ->text_is('div.notify-success', 'Login successful')
Akron2d01d292018-11-23 11:17:35 +0100132 ->element_exists('aside.off')
133 ->element_exists_not('aside.active')
Akron1d09b532021-06-15 18:18:25 +0200134 ->element_exists_not('aside.settings')
Akronbc213c02017-04-20 16:45:55 +0200135 ;
136
137# Now the user is logged in and should be able to
138# search with authorization
139$t->get_ok('/?q=Baum')
140 ->status_is(200)
141 ->text_like('h1 span', qr/KorAP: Find .Baum./i)
142 ->text_like('#total-results', qr/\d+$/)
143 ->element_exists_not('div.notify-error')
Akronbc6b3f22021-01-13 14:53:12 +0100144 ->content_like(qr/${q}authorized${q}:${q}test${q}/)
Akronc82b1bc2018-11-18 18:06:14 +0100145 ->element_exists('div.button.top a')
146 ->element_exists('div.button.top a.logout[title~="test"]')
Akrone5ef4e02017-04-19 17:07:52 +0200147 ;
148
Akronbc213c02017-04-20 16:45:55 +0200149# Logout
150$t->get_ok('/user/logout')
151 ->status_is(302)
152 ->header_is('Location' => '/');
153
154$t->get_ok('/')
155 ->status_is(200)
156 ->element_exists_not('div.notify-error')
157 ->element_exists('div.notify-success')
158 ->text_is('div.notify-success', 'Logout successful')
159 ;
160
161$t->get_ok('/?q=Baum')
162 ->status_is(200)
163 ->text_like('h1 span', qr/KorAP: Find .Baum./i)
164 ->text_like('#total-results', qr/\d+$/)
Akronbc6b3f22021-01-13 14:53:12 +0100165 ->content_like(qr/${q}authorized${q}:null/)
Akronbc213c02017-04-20 16:45:55 +0200166 ;
167
Akron429aeda2018-03-19 16:02:29 +0100168# Get redirect
169my $fwd = $t->get_ok('/?q=Baum&ql=poliqarp')
170 ->status_is(200)
171 ->element_exists_not('div.notify-error')
172 ->tx->res->dom->at('input[name=fwd]')->attr('value')
173 ;
174
175is($fwd, '/?q=Baum&ql=poliqarp', 'Redirect is valid');
176
177$t->post_ok('/user/login' => form => {
Akrone208d302020-11-28 11:14:50 +0100178 handle => 'test',
Akron429aeda2018-03-19 16:02:29 +0100179 pwd => 'pass',
180 csrf_token => $csrf,
181 fwd => 'http://bad.example.com/test'
182})
183 ->status_is(302)
184 ->header_is('Location' => '/');
185
186$t->get_ok('/')
187 ->status_is(200)
188 ->element_exists('div.notify-error')
189 ->element_exists_not('div.notify-success')
190 ->text_is('div.notify-error', 'Redirect failure')
191 ;
192
193$t->post_ok('/user/login' => form => {
Akrone208d302020-11-28 11:14:50 +0100194 handle => 'test',
Akron429aeda2018-03-19 16:02:29 +0100195 pwd => 'pass',
196 csrf_token => $csrf,
197 fwd => $fwd
198})
199 ->status_is(302)
200 ->header_is('Location' => '/?q=Baum&ql=poliqarp');
201
202
Akronbe9d5b32017-04-05 20:48:24 +0200203done_testing;
204__END__
Akrone8235be2016-06-27 11:02:18 +0200205
206
Akron1b0c2652017-04-27 15:28:49 +0200207# Login mit falschem Nutzernamen:
208# 400 und:
209{"errors":[[2022,"LDAP Authentication failed due to unknown user or password!"]]}
210
Akron741b2b12017-04-13 22:15:59 +0200211
212
Akrone8235be2016-06-27 11:02:18 +0200213ok(!$c->user->get('details'), 'User not logged in');
214
215# Login with user credentials
216ok($c->user->login('kustvakt', 'kustvakt2015'), 'Login with demo user');
217is($c->stash('user'), 'kustvakt', 'Kustvakt is logged in');
218like($c->stash('auth'), qr/^api_token /, 'Kustvakt is logged in');
219
220my $details = $c->user->get('details');
221is($details->{email}, 'kustvakt@ids-mannheim.de', 'Email');
222is($details->{firstName}, 'Kustvakt', 'Firstname');
223is($details->{lastName}, 'KorAP', 'Lastname');
224is($details->{country}, 'Germany', 'Country');
225is($details->{address}, 'Mannheim', 'Address');
226is($details->{username}, 'kustvakt', 'Username');
227is($details->{institution}, 'IDS Mannheim', 'Institution');
228
229my $settings = $c->user->get('settings');
230is($settings->{username}, 'kustvakt', 'Username');
231
232# ok($c->user->set(details => { firstName => 'Me' }), 'Set first name');
233#ok($c->user->set(details => {
234# firstName => 'Akron',
235# lastName => 'Fuxfell'
236#}), 'Set first name');
237
238# diag Dumper $c->user->get('info');
239
240ok(1,'Fine');
241
242done_testing;
243__END__