Apertur-SDK

 view release on metacpan or  search on metacpan

t/01_client.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More tests => 36;

# --- Module loading ---

use_ok('Apertur::SDK');
use_ok('Apertur::SDK::HTTPClient');
use_ok('Apertur::SDK::Error');
use_ok('Apertur::SDK::Error::Authentication');
use_ok('Apertur::SDK::Error::NotFound');
use_ok('Apertur::SDK::Error::RateLimit');
use_ok('Apertur::SDK::Error::Validation');
use_ok('Apertur::SDK::Signature');
use_ok('Apertur::SDK::Crypto');
use_ok('Apertur::SDK::Resource::Sessions');
use_ok('Apertur::SDK::Resource::Upload');
use_ok('Apertur::SDK::Resource::Uploads');
use_ok('Apertur::SDK::Resource::Polling');
use_ok('Apertur::SDK::Resource::Destinations');
use_ok('Apertur::SDK::Resource::Keys');
use_ok('Apertur::SDK::Resource::Webhooks');
use_ok('Apertur::SDK::Resource::Encryption');
use_ok('Apertur::SDK::Resource::Stats');

# --- Constructor ---

my $client = Apertur::SDK->new(api_key => 'aptr_live_test123');
isa_ok($client, 'Apertur::SDK');
is($client->env, 'live', 'live key detected as live env');

my $test_client = Apertur::SDK->new(api_key => 'aptr_test_abc');
is($test_client->env, 'test', 'test key detected as test env');

# Require at least one auth method
eval { Apertur::SDK->new() };
like($@, qr/api_key or oauth_token/, 'dies without credentials');

# OAuth token constructor
my $oauth_client = Apertur::SDK->new(oauth_token => 'some_oauth_token');
isa_ok($oauth_client, 'Apertur::SDK');
is($oauth_client->env, 'live', 'non-prefixed oauth token defaults to live');

# --- Resource accessors ---

isa_ok($client->sessions,     'Apertur::SDK::Resource::Sessions');
isa_ok($client->upload,       'Apertur::SDK::Resource::Upload');
isa_ok($client->uploads,      'Apertur::SDK::Resource::Uploads');
isa_ok($client->polling,      'Apertur::SDK::Resource::Polling');
isa_ok($client->destinations, 'Apertur::SDK::Resource::Destinations');
isa_ok($client->keys,         'Apertur::SDK::Resource::Keys');
isa_ok($client->webhooks,     'Apertur::SDK::Resource::Webhooks');
isa_ok($client->encryption,   'Apertur::SDK::Resource::Encryption');
isa_ok($client->stats,        'Apertur::SDK::Resource::Stats');

# --- Error classes ---

subtest 'Error hierarchy' => sub {
    plan tests => 17;

    my $base = Apertur::SDK::Error->new(
        status_code => 500,
        code        => 'INTERNAL',
        message     => 'Server error',
    );
    isa_ok($base, 'Apertur::SDK::Error');
    is($base->status_code, 500,            'base status_code');
    is($base->code,        'INTERNAL',     'base code');
    is($base->message,     'Server error', 'base message');

    my $auth = Apertur::SDK::Error::Authentication->new(message => 'Bad key');
    isa_ok($auth, 'Apertur::SDK::Error::Authentication');
    isa_ok($auth, 'Apertur::SDK::Error');
    is($auth->status_code, 401, 'auth status_code');

    my $nf = Apertur::SDK::Error::NotFound->new();
    isa_ok($nf, 'Apertur::SDK::Error');
    is($nf->status_code, 404,         'not found status_code');
    is($nf->message,     'Not found', 'not found default message');

    my $rl = Apertur::SDK::Error::RateLimit->new(
        message     => 'Slow down',
        retry_after => 30,
    );
    isa_ok($rl, 'Apertur::SDK::Error');
    is($rl->status_code,  429,         'rate limit status_code');
    is($rl->retry_after,  30,          'rate limit retry_after');

    my $val = Apertur::SDK::Error::Validation->new(message => 'Bad input');
    isa_ok($val, 'Apertur::SDK::Error');
    is($val->status_code, 400, 'validation status_code');

    # Test throw mechanism
    eval { Apertur::SDK::Error::NotFound->throw(message => 'Gone') };
    my $caught = $@;
    isa_ok($caught, 'Apertur::SDK::Error::NotFound');
    is($caught->message, 'Gone', 'thrown error message');



( run in 1.016 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )