db12334a2732a528f948186278f53c434ee7e0d3
[Business-OnlinePayment.git] / t / bop.t
1 #!/usr/bin/perl
2 # $Id: bop.t,v 1.5 2006-08-31 15:08:16 lawrence Exp $
3
4 use strict;
5 use warnings;
6 use Test::More tests => 50;
7
8 BEGIN { use_ok("Business::OnlinePayment") or exit; }
9
10 {    # fake test driver 1
11
12     package Business::OnlinePayment::MOCK1;
13     use strict;
14     use warnings;
15     use base qw(Business::OnlinePayment);
16
17 }
18
19 my $package = "Business::OnlinePayment";
20 my $driver  = "MOCK1";
21
22 # trick to make use() happy (called in Business::OnlinePayment->new)
23 $INC{"Business/OnlinePayment/${driver}.pm"} = "testing";
24
25 {    # new
26     can_ok( $package, qw(new) );
27     my $obj;
28
29     eval { $obj = $package->new(); };
30     like( $@, qr/^unspecified processor/, "new() without a processor croaks" );
31
32     eval { $obj = $package->new("__BOP BOGUS PROCESSOR__"); };
33     like( $@, qr/^unknown processor/,
34         "new() with an unknown processor croaks" );
35
36     $obj = $package->new($driver);
37     isa_ok( $obj, $package );
38     isa_ok( $obj, $package . "::" . $driver );
39
40     # build_subs(%fields)
41     can_ok(
42         $obj, qw(
43           authorization
44           error_message
45           failure_status
46           fraud_detect
47           is_success
48           maximum_risk
49           path
50           port
51           require_avs
52           result_code
53           server
54           server_response
55           test_transaction
56           transaction_type
57           )
58     );
59
60     # new (via build_subs) automatically creates accessors for arguments
61     $obj = $package->new( $driver, "proc1" => "value1" );
62     can_ok( $package, "proc1" );
63     can_ok( $obj,     "proc1" );
64
65     # new (via build_subs) automatically creates accessors for arguments
66     $obj = $package->new( $driver, qw(key1 v1 Key2 v2 -Key3 v3 --KEY4 v4) );
67     can_ok( $package, qw(key1 key2 key3 key4) );
68     can_ok( $obj,     qw(key1 key2 key3 key4) );
69
70     # new makes all accessors lowercase and removes leading dash(es)
71     is( $obj->key1, "v1", "value of key1   (method key1) is v1" );
72     is( $obj->key2, "v2", "value of Key2   (method key2) is v2" );
73     is( $obj->key3, "v3", "value of -Key3  (method key3) is v3" );
74     is( $obj->key4, "v4", "value of --KEY4 (method key4) is v4" );
75 }
76
77 # XXX
78 # {    # _risk_detect }
79 # {    # _pre_submit }
80
81 {    # content
82     my $obj;
83
84     $obj = $package->new($driver);
85     can_ok( $package, qw(content) );
86     can_ok( $obj,     qw(content) );
87
88     is( $obj->content, (), "default content is empty" );
89
90     my %data = qw(k1 v1 type test -k2 v2 K3 v3);
91     is_deeply( { $obj->content(%data) }, \%data, "content is set properly" );
92     is( $obj->transaction_type, "test", "content sets transaction_type" );
93
94     %data = ( type => undef );
95     is_deeply( { $obj->content(%data) }, \%data, "content with type=>undef" );
96     is( $obj->transaction_type, "test", "transaction_type not reset" );
97 }
98
99 {    # required_fields
100     my $obj = $package->new($driver);
101     can_ok( $package, qw(required_fields) );
102     can_ok( $obj,     qw(required_fields) );
103
104     is( $obj->required_fields, 0, "no required fields" );
105
106     eval { $obj->required_fields("field1"); };
107     like( $@, qr/^missing required field/, "missing required_fields() croaks" );
108 }
109
110 {    # get_fields
111     my $obj = $package->new($driver);
112     can_ok( $package, qw(get_fields) );
113     can_ok( $obj,     qw(get_fields) );
114
115     my %data = ( a => 1, b => 2, c => undef, d => 4 );
116     $obj->content(%data);
117
118     my ( @want, %get );
119
120     @want = qw(a b);
121     %get = map { $_ => $data{$_} } @want;
122     is_deeply( { $obj->get_fields(@want) },
123         \%get, "get_fields with defined vals" );
124
125     @want = qw(a c d);
126     %get = map { defined $data{$_} ? ( $_ => $data{$_} ) : () } @want;
127
128     is_deeply( { $obj->get_fields(@want) },
129         \%get, "get_fields does not get fields with undef values" );
130 }
131
132 {    # remap_fields
133     my $obj = $package->new($driver);
134     can_ok( $package, qw(remap_fields) );
135     can_ok( $obj,     qw(remap_fields) );
136
137     my %data = ( a => 1, b => 2, c => undef, d => 4 );
138     $obj->content(%data);
139
140     my %map = ( a => "Aa", d => "Dd" );
141     my %get = ( a => 1, Aa => 1, b => 2, c => undef, d => 4, Dd => 4 );
142
143     $obj->remap_fields(%map);
144     is_deeply( { $obj->content }, \%get, "remap_fields" );
145 }
146
147 {    # submit
148     my $obj = $package->new($driver);
149     can_ok( $package, qw(submit) );
150     can_ok( $obj,     qw(submit) );
151
152
153     eval { $obj->submit; };
154     like( $@, qr/^Processor subclass did not /, "missing submit() croaks" );
155 }
156
157 {    # dump_contents
158     my $obj = $package->new($driver);
159     can_ok( $package, qw(dump_contents) );
160     can_ok( $obj,     qw(dump_contents) );
161 }
162
163 {    # build_subs
164     my $obj;
165
166     $obj = $package->new($driver);
167     can_ok( $package, qw(build_subs) );
168     can_ok( $obj,     qw(build_subs) );
169
170     # build_subs creates accessors for arguments
171     my %data = qw(key1 v1 Key2 v2 -Key3 v3 --KEY4 v4);
172     my @subs =
173       sort { lc( ( $a =~ /(\w+)/ )[0] ) cmp lc( ( $b =~ /(\w+)/ )[0] ) }
174       keys %data;
175
176     $obj->build_subs(@subs);
177
178     # perl does not allow dashes ("-") in subroutine names
179     foreach my $sub (@subs) {
180         if ( $sub !~ /^\w+/ ) {
181             is( ref $package->can($sub), "", "$package can NOT $sub" );
182             is( ref $obj->can($sub),     "", ref($obj) . " can NOT $sub" );
183         }
184         else {
185             can_ok( $package, $sub );
186             can_ok( $obj,     $sub );
187             $obj->$sub( $data{$sub} );
188             is( $obj->$sub, $data{$sub}, "$sub accessor returns $data{$sub}" );
189         }
190     }
191 }