Business-Mondo

 view release on metacpan or  search on metacpan

t/business/mondo.t  view on Meta::CPAN

#!perl

use strict;
use warnings;

use Test::Most;
use Test::Deep;
use Test::MockObject;
use Test::Exception;
use Mojo::JSON qw/ decode_json /;

# this makes Business::Mondo::Exception show a stack
# trace when any error is thrown so i don't have to keep
# wrapping stuff in this test in evals to debug
$ENV{MONDO_DEBUG} = 0;

use_ok( 'Business::Mondo' );
isa_ok(
    my $Mondo = Business::Mondo->new(
        token => 'MvYX0i6snRh/1PXfPoc6',
    ),
    'Business::Mondo'
);

can_ok(
    $Mondo,
    qw/
        token
        api_url
        client
        transactions
        transaction
        accounts
    /,
);

isa_ok( $Mondo->client,'Business::Mondo::Client' );

# monkey patching Mojo::UserAgent here to make this test work without
# having to actually hit the endpoints or use credentials
no warnings 'redefine';
no warnings 'once';
my $mock = Test::MockObject->new;
$mock->mock( 'success',sub { 1 } );
$mock->mock( 'headers',sub { $mock } );
$mock->mock( 'res',sub { $mock } );
$mock->mock( 'json',sub { $mock } );
*Mojo::UserAgent::post = sub { $mock };
*Mojo::UserAgent::put = sub { $mock };
*Mojo::UserAgent::patch = sub { $mock };
*Mojo::UserAgent::get = sub { $mock };

test_transaction( $Mondo,$mock );
test_account( $Mondo,$mock );
test_balance( $Mondo,$mock );
test_attachment( $Mondo,$mock );

*Business::Mondo::Client::_api_request = sub { shift; return shift };

is( $Mondo->client->api_get,'GET','api_get' );
is( $Mondo->client->api_post,'POST','api_post' );
is( $Mondo->client->api_delete,'DELETE','api_delete' );
is( $Mondo->client->api_patch,'PATCH','api_patch' );

done_testing();

sub test_transaction {

    my ( $Mondo,$mock ) = @_;

    note( "Transaction" );

    $mock->mock( 'json',sub { _transaction_json() } );

    isa_ok(
        my $Transaction = $Mondo->transaction( id => 1 ),
        'Business::Mondo::Transaction'
    );

    $mock->mock( 'json',sub { _transactions_json() } );

    isa_ok(
        $Transaction = ( $Mondo->transactions( account_id => 1 ) )[1],
        'Business::Mondo::Transaction'
    );
}

sub test_account {

    my ( $Mondo,$mock ) = @_;

    note( "Account" );

    $mock->mock( 'json',sub { _accounts_json() } );

    isa_ok(
        my $Account = ( $Mondo->accounts )[1],
        'Business::Mondo::Account'
    );
}

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.950 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )