/xt/captcha.t

http://github.com/gshank/html-formhandler · Raku · 85 lines · 67 code · 17 blank · 1 comment · 11 complexity · 161129f43ea86479c5f30358fec84222 MD5 · raw file

  1. use strict;
  2. use warnings;
  3. use Test::More;
  4. use HTML::FormHandler::Test;
  5. BEGIN {
  6. eval "use GD::SecurityImage";
  7. plan skip_all => 'GD::SecurityImage required' if $@;
  8. }
  9. use_ok( 'HTML::FormHandler::Field::Captcha' );
  10. {
  11. package Test::Captcha;
  12. use HTML::FormHandler::Moose;
  13. extends 'HTML::FormHandler';
  14. with 'HTML::FormHandler::TraitFor::Captcha';
  15. with 'HTML::FormHandler::Render::Simple';
  16. has_field 'some_field';
  17. has_field 'subject';
  18. has_field '+captcha' => ( id => 'captcha', wrapper_class => 'captcha' );
  19. sub validate_subject {
  20. my ( $self, $field ) = @_;
  21. $field->add_error("Incorrect")
  22. unless $field->value eq 'Correct';
  23. }
  24. }
  25. {
  26. package Mock::Ctx;
  27. use Moose;
  28. has '_session' => ( isa => 'HashRef', is => 'rw', builder => 'build_session' );
  29. sub build_session {{}}
  30. sub session {
  31. my $self = shift;
  32. my $session = $self->_session;
  33. if (@_) {
  34. my $new_values = @_ > 1 ? { @_ } : $_[0];
  35. croak('session takes a hash or hashref') unless ref $new_values;
  36. for my $key (keys %$new_values) {
  37. $session->{$key} = $new_values->{$key};
  38. }
  39. }
  40. $session;
  41. }
  42. }
  43. my $ctx = Mock::Ctx->new;
  44. ok( $ctx, 'get mock ctx' );
  45. my $form = Test::Captcha->new( ctx => $ctx );
  46. ok( $form, 'get form' );
  47. my $rnd = $ctx->session->{captcha}->{rnd};
  48. ok( $rnd, 'captcha is in session' );
  49. my $params = { some_field => 'test', subject => 'Correct', captcha => '1234' };
  50. $form->process( ctx => $ctx, params => $params );
  51. ok( !$form->validated, 'form did not validate with wrong captcha');
  52. my $rnd2 = $ctx->session->{captcha}->{rnd};
  53. ok( $rnd ne $rnd2, 'we now have a different captcha');
  54. ok( !$form->field('captcha')->fif, 'no fif for captcha' );
  55. $params->{captcha} = $rnd2;
  56. $params->{subject} = 'Incorrect';
  57. $form->process( ctx => $ctx, params => $params );
  58. # valid captcha, invalid subject
  59. ok( !$form->validated, 'form did not validate: valid captcha, invalid field' );
  60. ok( $rnd2 == $ctx->session->{captcha}->{rnd}, 'captcha has not changed' );
  61. $params->{subject} = 'Correct';
  62. $form->process( ctx => $ctx, params => $params );
  63. ok( $form->validated, 'form validated; old captcha, valid fields' );
  64. my $render = $form->render_field('captcha');
  65. is_html( $render, '
  66. <div class="captcha"><label for="captcha">Verification</label><img src="/captcha/image"/><input id="captcha" name="captcha"></div>
  67. ', 'captcha renders ok' );
  68. done_testing;