#!perl
use strict;
use warnings;
use Test::More tests => 15;
use Test::MockObject;
BEGIN {
use_ok( 'SMS::Send' );
}
my $send = SMS::Send->new( 'Clickatell',
_api_id => "999999",
_user => "someone",
_password => "secret",
);
isa_ok($send,'SMS::Send');
# Let's not send any real SMS!
my $mock_ua = Test::MockObject->new;
my (@requests,@mock_responses);
$mock_ua->mock(
request => sub {
shift;
push @requests => shift;
shift @mock_responses or die;
} );
{
# Ugly but we need to mung the User Agent inside the driver inside the
# object
my $driver = $send->{OBJECT};
isa_ok($driver,'SMS::Send::Clickatell');
$driver->{ua} = $mock_ua;
}
my @message = (
text => 'Hi there',
# From Ofcom's Telephone Numbers for drama purposes (TV, Radio etc)
to => '+447700900999',
);
my %expected_content = (
'password' => 'secret',
'to' => '447700900999',
'api_id' => '999999',
'text' => 'Hi+there',
'user' => 'someone',
'concat' => '3'
);
sub check_request {
my ($case,$expect_ok,$stati) = @_;
@mock_responses = map { HTTP::Response->new($_) } @$stati;
@requests = ();
# use Data::Dumper; print Dumper \@mock_responses;
is(!!$send->send_sms(@message), !!$expect_ok, "send_sms() status $case");
my %content = $requests[-1]->content =~ /\G(.*?)=(.*?)(?:&|$)/g;
is_deeply(\%content,\%expected_content, "request content $case")
if %expected_content;
ok(!@mock_responses,"number of requests $case");
}
check_request("without from",1,[200]);
push @message => ( _from => ($expected_content{from} = 'sender'));
check_request("with from",1,[200]);
undef %expected_content;
check_request("404 error",0,[404]);
check_request("single 502 error",1,[502,200]);
check_request("double 502 error",0,[502,502]);
# For reasons I don't understand leaving the SMS::Send to the global
# destruction causes problems under the test harness but not if this
# test is run directly.
undef $send;
diag( "Testing SMS::Send::Clickatell $SMS::Send::Clickatell::VERSION, Perl $], $^X" );