The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use Captcha::reCAPTCHA;

use constant PUBKEY  => '6LdAAAkAwAAAFJj6ACG3Wlix_GuQJMNGjMQnw5UY';
use constant PRIVKEY => '6LdAAAkAwAAAix_GF6AMQnw5UCG3JjWluQJMNGjY';

my @schedule;

BEGIN {
  @schedule = (
    {
      name  => 'new: Bad args',
      class => 'T::Captcha::reCAPTCHA',
      try   => sub {
        my $c = Captcha::reCAPTCHA->new( PUBKEY );
      },
      expect => qr/reference to a hash/
    },
    {
      name  => 'get_html: No args',
      class => 'T::Captcha::reCAPTCHA',
      try   => sub {
        my $c = shift;
        $c->get_html();
      },
      expect => qr/To use reCAPTCHA you must get an API key from/
    },
    {
      name  => 'get_html: No key',
      class => 'T::Captcha::reCAPTCHA',
      try   => sub {
        my $c = shift;
        $c->get_html( '' );
      },
      expect => qr/To use reCAPTCHA you must get an API key from/
    },
    {
      name  => 'check_answer: No args',
      class => 'T::Captcha::reCAPTCHA',
      try   => sub {
        my $c = shift;
        $c->check_answer();
      },
      expect => qr/To use reCAPTCHA you must get an API key from/
    },
    {
      name  => 'check_answer: no response',
      class => 'T::Captcha::reCAPTCHA',
      try   => sub {
        my $c = shift;
        $c->check_answer( PRIVKEY, '' );
      },
      expect => qr/you must pass the remote ip/
    },
  );

  plan tests => 3 * @schedule;
}

package T::Captcha::reCAPTCHA;

our @ISA = qw(Captcha::reCAPTCHA);
use Captcha::reCAPTCHA;

sub _post_request {
  my $self = shift;
  my $url  = shift;
  my $args = shift;

  # Just keep the args
  $self->{t_url}  = $url;
  $self->{t_args} = $args;

  return HTTP::Response->new( 200, 'OK',
    [ 'Content-type:' => 'text/plain' ], "true\n" );
}

sub get_url  { shift->{t_url} }
sub get_args { shift->{t_args} }

package main;

for my $test ( @schedule ) {
  my $name  = $test->{name};
  my $class = $test->{class};
  ok my $captcha = $class->new, "$name: create OK";
  isa_ok $captcha, $class;
  eval { $test->{try}->( $captcha ); };
  if ( my $expect = $test->{expect} ) {
    like $@, $expect, "$name: error OK";
  }
  else {
    note "error is " . $@;
    ok !$@, "$name: no error OK";
  }
}