use strict;
my $ss = WebService::Shutterstock->new(api_username => "test", api_key => 123);
can_ok $ss, 'auth';
ok !eval{ $ss->auth() }, "dies on no params auth call";
like $@, qr{missing 'password'}, 'error message accurate';
{
my $guard = Test::MockModule->new('REST::Client');
$guard->mock('POST', sub {
my $self = shift;
is $_[0], '/auth/customer.json', 'POSTs to the correct URL';
like $_[1], qr{username=test}, 'inherits username from api_username';
like $_[1], qr{password=test-password}, 'password from param';
$ss->client->{_res} = response(200, ['Content-Type' => 'application/json'], '{"auth_token":"abc123","username":"test123"}');
});
$ss->auth(password => 'test-password');
}
{
my $guard = Test::MockModule->new('REST::Client');
$guard->mock('POST', sub {
my $self = shift;
like $_[1], qr{username=someone_else}, 'username from param';
like $_[1], qr{password=test-password}, 'password from param';
$ss->client->{_res} = response(200, ['Content-Type' => 'application/json'], '{"auth_token":"abc123","username":"test123"}');
});
my $customer = $ss->auth(username => 'someone_else', password => 'test-password');
is $customer->username, 'test123', 'successful auth - username';
is $customer->auth_token, 'abc123', 'successful auth - auth_token';
}
{
my $guard = Test::MockModule->new('REST::Client');
$guard->mock('POST', sub {
$ss->client->{_res} = response(401);
});
eval { $ss->auth(username => 'someone_else', password => 'test-password') };
like $@, qr{invalid api}, 'invalid api authorization';
}
{
my $guard = Test::MockModule->new('REST::Client');
$guard->mock('POST', sub {
$ss->client->{_res} = response([403],['POST','/auth/customer.json']);
});
eval { $ss->auth(username => 'someone_else', password => 'test-password') };
like $@, qr{403 Forbidden}, 'invalid username/password';
}
{
my $guard = Test::MockModule->new('REST::Client');
$guard->mock('POST', sub {
$ss->client->{_res} = response([200, undef, 'garbage'],['POST','/auth/customer.json']);
});
eval { $ss->auth(username => 'someone_else', password => 'test-password') };
like $@, qr{garbage}, 'has error';
}
done_testing;
sub response {
@_ = [@_] unless ref $_[0] eq 'ARRAY';
my $code = $_[0]->[0];
my $headers = $_[0]->[1];
my $data = $_[0]->[2];
my $method = $_[1]->[0] || 'GET';
my $uri = $_[1]->[1] || '/';
my $response = HTTP::Response->new( $code, undef, $headers, $data );
$response->request(HTTP::Request->new( $method, $uri ));
return $response;
}