The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use warnings;
use strict;

use Test::More tests => 19;

use Test::MockModule;

use lib qw( t/lib );

use Test::Util;
use Test::MockBank::MBNA;
use Data::Dumper;

our $lwp_useragent_mock;
our $www_mechanize_mock;

BEGIN {
    $lwp_useragent_mock = new Test::MockModule( 'LWP::UserAgent' );
    $www_mechanize_mock = new Test::MockModule( 'WWW::Mechanize' );
    use_ok( "Finance::Bank::IE::MBNA" );
}

my $skipper = 1;
my $config = Test::Util::getconfig( 'MBNA' );
if ( !$config ) {
    # our fake config
    $config = {
               user => '0123456789',
               password => 'password',
              };

    # this is our fake bank server
    $lwp_useragent_mock->mock( 'simple_request', \&Test::MockBank::simple_request );

    $skipper = 0;
} else {
    print "# Running live tests\n" if $ENV{DEBUG};
}
Test::MockBank->globalstate( 'config', $config );

my @accounts = Finance::Bank::IE::MBNA->check_balance( $config );
ok( @accounts, "can retrieve accounts" );
ok( scalar(@accounts) == 2, "found two accounts" );
isa_ok( $accounts[0], "Finance::Bank::IE::MBNA::Account", "account" );
ok( $accounts[0]->{account_no}, "account has an account number" );
ok( $accounts[0]->{balance} eq -77.39, "found correct balance (credit)" );
ok( $accounts[1]->{balance} eq 1511.44, "found correct balance (debit)" );

# account zero has no transactions
my $test_account = $accounts[1];

# reset state
ok( Finance::Bank::IE::MBNA->reset, "can reset object" ) and
    Test::MockBank->globalstate( 'loggedin', 0 );

my ( @details ) = Finance::Bank::IE::MBNA->account_details( $test_account->{account_no}, $config );
ok( @details, "can fetch details" );

# cached config
Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
( @details ) = Finance::Bank::IE::MBNA->account_details( $test_account->{account_no}, $config );
Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Finance::Bank::IE::MBNA->account_details( $test_account->{account_no} );
ok( @details, "cached config (account_details)" );

# missing required fields
Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
( @details ) = Finance::Bank::IE::MBNA->account_details( $test_account->{account_no}, {} );
ok( !@details, "missing username" );
( @details ) = Finance::Bank::IE::MBNA->account_details( $test_account->{account_no}, { user => $config->{user}} );
ok( !@details, "missing password" );

# some failure scenarios
Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Test::MockBank->fail_on_iterations( 1 );
@accounts = Finance::Bank::IE::MBNA->check_balance( $config );
ok( !@accounts, "can handle page-load failure (root page)" );

Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Test::MockBank->fail_on_iterations( 2 );
@accounts = Finance::Bank::IE::MBNA->check_balance( $config );
ok( !@accounts, "can handle page-load failure (WelcomeScreen)" );

Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Test::MockBank->fail_on_iterations( 3 );
@accounts = Finance::Bank::IE::MBNA->check_balance( $config );
ok( !@accounts, "can handle page-load failure (LoginProcess (username))" );

Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Test::MockBank->fail_on_iterations( 4 );
@accounts = Finance::Bank::IE::MBNA->check_balance( $config );
ok( !@accounts, "can handle page-load failure (LoginProcess (password))" );

Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Test::MockBank->fail_on_iterations( 5 );
@accounts = Finance::Bank::IE::MBNA->check_balance( $config );
ok( !@accounts, "can handle page-load failure (Account Screen)" );

Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Test::MockBank->fail_on_iterations( 6, 7 ); # need to fail both cards
@accounts = Finance::Bank::IE::MBNA->check_balance( $config );
ok( !@accounts, "can handle page-load failure (Account Snapshot)" );

Finance::Bank::IE::MBNA->reset and
    Test::MockBank->globalstate( 'loggedin', 0 );
Test::MockBank->fail_on_iterations( 6, 7 );
@accounts = Finance::Bank::IE::MBNA->account_details( $test_account->{account_no}, $config );
ok( !@accounts, "can handle page-load failure (Account Snapshot 2)" );