package Test::MockBank::BankOfIreland;
use strict;
use warnings;
use base qw( Test::MockBank );
use HTTP::Status;
use HTTP::Response;
use Finance::Bank::IE::BankOfIreland;
my $pages = Finance::Bank::IE::BankOfIreland::_pages();
sub request {
my ( $self, $response ) = @_;
my $request = $response->request();
my @args;
my @args_and_equals;
my ( $url, $content ) = split( /\?/, $request->uri, 2 );
$content ||= "";
if ( $request->method eq 'POST' ) {
$content = join( '&', $content, $request->content );
}
if ( $content ) {
my @args_and_equals = split( /\&/, $content );
for my $arg_and_equals ( @args_and_equals ) {
my ( $key, $value ) = split( /=/, $arg_and_equals, 2 );
push @args, [ $key, $value ];
}
}
# business logic
# Credentials expiry - no state
if ( $url eq $pages->{expired}->{url} ) {
print STDERR "# early return: expired session\n" if $ENV{DEBUG};
return $self->SUPER::request($response, 'BankOfIreland' );
}
my $execution = $self->get_param( 'execution', \@args ) || 'e0s0';
print STDERR "# Looking for $url, $execution (from " . $request->uri . ")\n" if $ENV{DEBUG};
# Bad Credentials page shouldn't need any state
# unpleasantly, it does
if ( $url eq $pages->{badcreds}->{url} and $execution eq 'e1s4') {
print STDERR "# early return: bad creds\n" if $ENV{DEBUG};
return $self->SUPER::request($response, 'BankOfIreland' );
}
if ( $url eq $pages->{login}->{url} ) {
if ( $execution =~ /s[01]$/ ) {
if ( $execution eq 'e0s0' or
( $execution =~ /s1$/ and !$self->get_param( 'form:userId', \@args ))) {
$request->uri( $request->uri . "?execution=e1s1" );
$response = $self->SUPER::request( $response, 'BankOfIreland' );
Test::MockBank->globalstate( 'loggedin', 1 );
return $response;
} else {
if ( Test::MockBank->globalstate('loggedin') != 1 ) {
print STDERR "# login state " . Test::MockBank->globalstate('loggedin') . ", expected 1\n" if $ENV{DEBUG};
$response->code( RC_FOUND );
$response->header( 'Location' => $pages->{expired}->{url} );
Test::MockBank->globalstate( 'loggedin', 0 );
return $response;
}
my $user = $self->get_param( 'form:userId', \@args );
my $pass = $self->get_param( 'form:phoneNumber', \@args );
if ( !defined($pass )) {
$pass = join( '/',
$self->get_param( 'form:dateOfBirth_date', \@args ),
$self->get_param( 'form:dateOfBirth_month', \@args ),
$self->get_param( 'form:dateOfBirth_year', \@args )
);
}
$response = $self->SUPER::request( $response, 'BankOfIreland' );
Test::MockBank->globalstate('user', $user);
Test::MockBank->globalstate('pass', $pass );
Test::MockBank->globalstate('loggedin', 2);
$response->code( RC_FOUND );
$response->header( 'Location' => $pages->{login2}->{url} .
"?execution=e1s2" );
return $response;
}
} elsif ( $execution =~ /s2$/ ) {
if ( Test::MockBank->globalstate('loggedin') != 2 ) {
print STDERR "# login state " . Test::MockBank->globalstate('loggedin') . ", expected 2\n" if $ENV{DEBUG};
$response->code( RC_FOUND );
$response->header( 'Location' => $pages->{expired}->{url} );
Test::MockBank->globalstate( 'loggedin', 0 );
return $response;
}
if ( $self->get_param( 'form:continue', \@args )) {
my $digits_ok = 0;
my $digits_submitted = 0;
my $expected = Test::MockBank->globalstate( 'config' )->{pin};
for my $index ( 1..6 ) {
my $digit = $self->get_param( 'form:security_number_digit' . $index, \@args );
if ( defined( $digit )) {
$digits_submitted++;
if ( substr( $expected, $index - 1, 1 ) eq $digit ) {
$digits_ok++;
}
}
}
if ( Test::MockBank->globalstate( 'user' ) ne Test::MockBank->globalstate( 'config')->{user} or
( Test::MockBank->globalstate( 'pass' ) ne Test::MockBank->globalstate( 'config')->{dob} and
Test::MockBank->globalstate('pass') ne Test::MockBank->globalstate('config')->{'contact'}) or
$digits_ok != 3 ) {
print STDERR "# bad login details, returning badcreds page\n" if $ENV{DEBUG};
$response->code( RC_FOUND );
$response->header( 'Location' => $pages->{badcreds}->{url} . "?execution=e1s4" );
Test::MockBank->globalstate('loggedin', 0);
return $response;
} elsif ( $digits_submitted != 3 ) {
# need to capture pages for this
die "not enough digits ($digits_submitted)";
} else {
$response->code( RC_FOUND );
$response->header( 'Location' => $pages->{accounts}->{url});
return $response;
}
} else {
# just return the login-2 page
$response = $self->SUPER::request( $response, 'BankOfIreland' );
return $response;
}
}
}
if ( !Test::MockBank->globalstate( 'loggedin' )) {
$response->code( RC_FOUND );
$response->header( 'Location' => $pages->{expired}->{url} );
Test::MockBank->globalstate( 'loggedin', 0 );
return $response;
} elsif ( Test::MockBank->globalstate('loggedin') == 1 ) {
print STDERR "Can't happen\n" if $ENV{DEBUG};
die;
} else {
if ( $url eq $pages->{manageaccounts}->{url} and
$request->method eq 'POST' and
$self->get_param( 'form:managePayees', \@args )) {
$response->code( RC_FOUND );
$response->header( 'Location' => $pages->{managepayees}->{url} );
return $response;
} else {
# this is how they should all work...
my ( $page ) = $request->uri =~ m@/(\w+)\?@;
my ( $e, $s ) = $execution =~ /e(\d+)s(\d+)/;
if ( $page eq 'moneyTransfer' ) {
# TODO: make these check inputs and respond appropriately
if ( $s == 1 ) {
if ( $self->get_param( 'form:domesticPayment', \@args )) {
( my $responsepage = $request->uri ) =~ s/s1$/s2/;
$response->code( RC_FOUND );
$response->header( 'Location' => $responsepage );
return $response;
}
} elsif ( $s == 2 ) {
if ( $self->get_param( 'form:formActions:continue', \@args )) {
( my $responsepage = $request->uri ) =~ s/s2$/s3/;
$response->code( RC_FOUND );
$response->header( 'Location' => $responsepage );
return $response;
}
} elsif ( $s == 3 ) {
if ( $self->get_param( 'form:formActions:continue', \@args )) {
( my $responsepage = $request->uri ) =~ s/s3$/s4/;
$response->code( RC_FOUND );
$response->header( 'Location' => $responsepage );
return $response;
}
} elsif ( $s == 4 ) {
if ( $self->get_param( 'form:formActions:continue', \@args )) {
( my $responsepage = $request->uri ) =~ s/s4$/s5/;
$response->code( RC_FOUND );
$response->header( 'Location' => $responsepage );
return $response;
}
}
}
$response = $self->SUPER::request( $response, 'BankOfIreland' );
}
}
$response;
}
1;