/xt/captcha.t
http://github.com/gshank/html-formhandler · Raku · 85 lines · 67 code · 17 blank · 1 comment · 11 complexity · 161129f43ea86479c5f30358fec84222 MD5 · raw file
- use strict;
- use warnings;
- use Test::More;
- use HTML::FormHandler::Test;
- BEGIN {
- eval "use GD::SecurityImage";
- plan skip_all => 'GD::SecurityImage required' if $@;
- }
- use_ok( 'HTML::FormHandler::Field::Captcha' );
- {
- package Test::Captcha;
- use HTML::FormHandler::Moose;
- extends 'HTML::FormHandler';
- with 'HTML::FormHandler::TraitFor::Captcha';
- with 'HTML::FormHandler::Render::Simple';
- has_field 'some_field';
- has_field 'subject';
- has_field '+captcha' => ( id => 'captcha', wrapper_class => 'captcha' );
- sub validate_subject {
- my ( $self, $field ) = @_;
- $field->add_error("Incorrect")
- unless $field->value eq 'Correct';
- }
- }
- {
- package Mock::Ctx;
- use Moose;
- has '_session' => ( isa => 'HashRef', is => 'rw', builder => 'build_session' );
- sub build_session {{}}
- sub session {
- my $self = shift;
- my $session = $self->_session;
- if (@_) {
- my $new_values = @_ > 1 ? { @_ } : $_[0];
- croak('session takes a hash or hashref') unless ref $new_values;
- for my $key (keys %$new_values) {
- $session->{$key} = $new_values->{$key};
- }
- }
- $session;
- }
- }
- my $ctx = Mock::Ctx->new;
- ok( $ctx, 'get mock ctx' );
- my $form = Test::Captcha->new( ctx => $ctx );
- ok( $form, 'get form' );
- my $rnd = $ctx->session->{captcha}->{rnd};
- ok( $rnd, 'captcha is in session' );
- my $params = { some_field => 'test', subject => 'Correct', captcha => '1234' };
- $form->process( ctx => $ctx, params => $params );
- ok( !$form->validated, 'form did not validate with wrong captcha');
- my $rnd2 = $ctx->session->{captcha}->{rnd};
- ok( $rnd ne $rnd2, 'we now have a different captcha');
- ok( !$form->field('captcha')->fif, 'no fif for captcha' );
- $params->{captcha} = $rnd2;
- $params->{subject} = 'Incorrect';
- $form->process( ctx => $ctx, params => $params );
- # valid captcha, invalid subject
- ok( !$form->validated, 'form did not validate: valid captcha, invalid field' );
- ok( $rnd2 == $ctx->session->{captcha}->{rnd}, 'captcha has not changed' );
- $params->{subject} = 'Correct';
- $form->process( ctx => $ctx, params => $params );
- ok( $form->validated, 'form validated; old captcha, valid fields' );
- my $render = $form->render_field('captcha');
- is_html( $render, '
- <div class="captcha"><label for="captcha">Verification</label><img src="/captcha/image"/><input id="captcha" name="captcha"></div>
- ', 'captcha renders ok' );
- done_testing;