Add unit test for old Captcha API (#2692)

This commit is contained in:
Maxime Besson 2022-04-20 11:51:43 +02:00
parent 7817a1b544
commit aca5468100
2 changed files with 171 additions and 0 deletions

View File

@ -0,0 +1,114 @@
use Test::More;
use strict;
use IO::String;
use JSON;
use Lemonldap::NG::Portal::Main::Constants 'PE_CAPTCHAEMPTY';
require 't/test-lib.pm';
my $res;
my $maintests = 0;
SKIP: {
eval 'use GD::SecurityImage; use Image::Magick;';
if ($@) {
skip 'Image::Magick not found', $maintests;
}
my $client = LLNG::Manager::Test->new( {
ini => {
logLevel => 'error',
portalMainLogo => 'common/logos/logo_llng_old.png',
customPlugins => 't::CaptchaOldApi',
}
}
);
my ( $data, $json );
# check setCaptcha
$data = '';
$json = expectJSON(
$client->_post(
'/setCaptcha',
IO::String->new($data),
length => length($data),
)
);
like( $json->{token}, qr/.+/ );
like( $json->{img}, qr#^data:image/png;base64,.{10}# );
like( $json->{answer}, qr#^\d{6}$# );
count(3);
# check getCaptcha
$data = '';
$json = expectJSON(
$client->_post(
'/getCaptcha',
IO::String->new($data),
length => length($data),
)
);
like( $json->{token}, qr/.+/ );
like( $json->{img}, qr#^data:image/png;base64,.{10}# );
like( $json->{answer}, qr#^\d{6}$# );
count(3);
my $token = $json->{token};
my $answer = $json->{answer};
# validate: wrong token
$data = buildForm( { token => 111, answer => $answer } );
$json = expectJSON(
$client->_post(
'/validateCaptcha', IO::String->new($data),
length => length($data),
)
);
is( $json->{result}, 0, 'Wrong token failed' );
count(1);
# validate: wrong answer
$data = buildForm( { token => $token, answer => 999 } );
$json = expectJSON(
$client->_post(
'/validateCaptcha', IO::String->new($data),
length => length($data),
)
);
is( $json->{result}, 0, 'Wrong captcha failed' );
count(1);
# Get Fresh token/answer pair
$data = '';
$json = expectJSON(
$client->_post(
'/getCaptcha',
IO::String->new($data),
length => length($data),
)
);
like( $json->{token}, qr/.+/ );
like( $json->{img}, qr#^data:image/png;base64,.{10}# );
like( $json->{answer}, qr#^\d{6}$# );
count(3);
$token = $json->{token};
$answer = $json->{answer};
# validate: correct values
$data = buildForm( { token => $token, answer => $answer } );
$json = expectJSON(
$client->_post(
'/validateCaptcha', IO::String->new($data),
length => length($data),
)
);
is( $json->{result}, 1, 'Captcha successfully verified' );
count(1);
}
count($maintests);
clean_sessions();
done_testing( count() );

View File

@ -0,0 +1,57 @@
package t::CaptchaOldApi;
use Mouse;
use Lemonldap::NG::Portal::Main::Constants;
extends 'Lemonldap::NG::Portal::Main::Plugin';
has 'captcha' => ( is => 'rw' );
sub init {
my $self = shift;
$self->addUnauthRoute( validateCaptcha => 'validateCaptcha', ['POST'] );
$self->addUnauthRoute( setCaptcha => 'setCaptcha', ['POST'] );
$self->addUnauthRoute( getCaptcha => 'getCaptcha', ['POST'] );
$self->captcha( $self->p->loadModule('::Lib::Captcha') );
return 1;
}
sub setCaptcha {
my ( $self, $req ) = @_;
$self->captcha->setCaptcha($req);
my $info = $self->captcha->ott->getToken( $req->token, 1 );
return $self->sendJSONresponse(
$req,
{
token => $req->token,
img => $req->captcha,
answer => $info->{captcha}
}
);
}
sub getCaptcha {
my ( $self, $req ) = @_;
my ( $token, $image ) = $self->captcha->getCaptcha;
my $info = $self->captcha->ott->getToken( $token, 1 );
return $self->sendJSONresponse( $req,
{ token => $token, img => $image, answer => $info->{captcha} } );
}
sub validateCaptcha {
my ( $self, $req ) = @_;
my $token = $req->param('token');
my $answer = $req->param('answer');
my $result = $self->captcha->validateCaptcha( $token, $answer );
return $self->sendJSONresponse( $req, { result => $result } );
}
1;