ruby_psigate 0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. data/CHANGELOG +2 -0
  2. data/Gemfile +12 -0
  3. data/LICENSE +0 -0
  4. data/Manifest +45 -0
  5. data/README.markdown +99 -0
  6. data/Rakefile +28 -0
  7. data/lib/certs/cacert.pem +2633 -0
  8. data/lib/ruby_psigate/account.rb +152 -0
  9. data/lib/ruby_psigate/account_manager_api.rb +137 -0
  10. data/lib/ruby_psigate/account_methods.rb +5 -0
  11. data/lib/ruby_psigate/address.rb +54 -0
  12. data/lib/ruby_psigate/connection.rb +96 -0
  13. data/lib/ruby_psigate/credit_card.rb +104 -0
  14. data/lib/ruby_psigate/credit_card_methods.rb +12 -0
  15. data/lib/ruby_psigate/error.rb +33 -0
  16. data/lib/ruby_psigate/gateway.rb +126 -0
  17. data/lib/ruby_psigate/hash_variables.rb +58 -0
  18. data/lib/ruby_psigate/item.rb +65 -0
  19. data/lib/ruby_psigate/item_option.rb +10 -0
  20. data/lib/ruby_psigate/number_validation_methods.rb +12 -0
  21. data/lib/ruby_psigate/order.rb +120 -0
  22. data/lib/ruby_psigate/recurring_charge.rb +53 -0
  23. data/lib/ruby_psigate/recurring_item.rb +26 -0
  24. data/lib/ruby_psigate/response.rb +109 -0
  25. data/lib/ruby_psigate/serializer.rb +59 -0
  26. data/lib/ruby_psigate/transaction_methods.rb +21 -0
  27. data/lib/ruby_psigate/utils.rb +18 -0
  28. data/lib/ruby_psigate.rb +57 -0
  29. data/ruby_psigate.gemspec +31 -0
  30. data/test/remote/remote_account_test.rb +33 -0
  31. data/test/remote/remote_gateway_test.rb +32 -0
  32. data/test/test_helper.rb +144 -0
  33. data/test/unit/account_manager_api_test.rb +96 -0
  34. data/test/unit/account_test.rb +388 -0
  35. data/test/unit/address_test.rb +99 -0
  36. data/test/unit/connection_test.rb +153 -0
  37. data/test/unit/credit_card_test.rb +152 -0
  38. data/test/unit/gateway_test.rb +112 -0
  39. data/test/unit/item_option_test.rb +19 -0
  40. data/test/unit/item_test.rb +106 -0
  41. data/test/unit/order_test.rb +491 -0
  42. data/test/unit/recurring_charge_test.rb +89 -0
  43. data/test/unit/recurring_item_test.rb +62 -0
  44. data/test/unit/response_test.rb +110 -0
  45. data/test/unit/serializer_test.rb +89 -0
  46. data/test/unit/xml_api_test.rb +25 -0
  47. metadata +154 -0
@@ -0,0 +1,152 @@
1
+ module RubyPsigate
2
+ class CreditCardTest < Test::Unit::TestCase
3
+
4
+ def setup
5
+ @valid_attributes = {
6
+ :number => "4111111111111111",
7
+ :month => "12",
8
+ :year => "2020",
9
+ :verification_value => "123",
10
+ :name => "Bob John"
11
+ }
12
+ @cc = CreditCard.new(@valid_attributes)
13
+ end
14
+
15
+ should "respond to number" do
16
+ assert @cc.respond_to?(:number)
17
+ assert @cc.respond_to?(:number=)
18
+ end
19
+
20
+ should "respond to month" do
21
+ assert @cc.respond_to?(:month)
22
+ assert @cc.respond_to?(:month=)
23
+ end
24
+
25
+ should "respond to year" do
26
+ assert @cc.respond_to?(:year)
27
+ assert @cc.respond_to?(:year=)
28
+ end
29
+
30
+ should "respond to verification_value" do
31
+ assert @cc.respond_to?(:verification_value)
32
+ assert @cc.respond_to?(:verification_value=)
33
+ end
34
+
35
+ should "respond to type" do
36
+ assert @cc.respond_to?(:type)
37
+ end
38
+
39
+ should "respond_to name" do
40
+ assert @cc.respond_to?(:name)
41
+ assert @cc.respond_to?(:name=)
42
+ end
43
+
44
+ %w( number month year name ).each do |p|
45
+ should "raise error if #{p} is not included" do
46
+ @valid_attributes.delete(p.to_sym)
47
+ assert_raises(ArgumentError) { CreditCard.new(@valid_attributes) }
48
+ end
49
+ end
50
+
51
+ context "cc numbers" do
52
+ %w( 4111111111111111 ).each do |n|
53
+ should "#{n} be a valid" do
54
+ @valid_attributes[:number] = n
55
+ assert_nothing_raised { CreditCard.new(@valid_attributes) }
56
+ end
57
+ end
58
+
59
+ %w( 1234567890123456 ).each do |n|
60
+ should "#{n} not be valid" do
61
+ @valid_attributes[:number] = n
62
+ assert_raises(CreditCardNumberInvalid) { CreditCard.new(@valid_attributes) }
63
+ end
64
+ end
65
+ end
66
+
67
+ context "cc type" do
68
+ %w( visa mastercard american_express ).each do |type|
69
+ should "support #{type}" do
70
+ String.any_instance.expects(:creditcard_type).returns(type)
71
+ assert_nothing_raised { CreditCard.new(@valid_attributes) }
72
+ end
73
+ end
74
+
75
+ %w( diners_club bankcard jcb enroute switch ).each do |type|
76
+ should "not support #{type}" do
77
+ String.any_instance.expects(:creditcard_type).returns(type)
78
+ assert_raises(CreditCardNotSupported) { CreditCard.new(@valid_attributes) }
79
+ end
80
+ end
81
+ end
82
+
83
+ should "raise error if name is blank" do
84
+ @valid_attributes[:name] = nil
85
+ assert_raises(CreditCardOwnerNameMissing) { CreditCard.new(@valid_attributes) }
86
+ end
87
+
88
+ context "expiry date" do
89
+ %w( 13 14 15 16 ).each do |month|
90
+ should "raise CreditCardExpiryInvalid when the month is #{month}" do
91
+ @valid_attributes[:month] = month
92
+ assert_raises(CreditCardExpiryInvalid) { CreditCard.new(@valid_attributes) }
93
+ end
94
+ end
95
+
96
+ %w( 1990 1999 2008 2009 ).each do |year|
97
+ should "raise CreditCardExpiryInvalid when month is #{year}" do
98
+ @valid_attributes[:year] = year
99
+ assert_raises(CreditCardExpiryInvalid) { CreditCard.new(@valid_attributes) }
100
+ end
101
+ end
102
+
103
+ should "raise CreditCardExpired when expiry is #{Time.now.month-1}/#{Time.now.year}" do
104
+ @valid_attributes[:month] = ((Time.now.month)-1)
105
+ @valid_attributes[:year] = Time.now.year
106
+ assert_raises(CreditCardExpired) { CreditCard.new(@valid_attributes) }
107
+ end
108
+
109
+ %w( 1 2 3 4 5 6 7 8 9 10 11 12 ).each do |month|
110
+ should "not raise CreditCardExpired when expiry is #{month}/2010 and today's date is the last day of the same month" do
111
+ @valid_attributes[:month] = month
112
+ @valid_attributes[:year] = 2010
113
+ last_day = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month.to_i]
114
+ mock_today = Time.new(2010, month, last_day)
115
+ Time.stubs(:now).returns(mock_today)
116
+ assert_nothing_raised { CreditCard.new(@valid_attributes) }
117
+ end
118
+ end
119
+
120
+ should "not raise CreditCardExpired when expiry is 2/2012 and today's date is 2/29/2010 (leap year)" do
121
+ @valid_attributes[:month] = 2
122
+ @valid_attributes[:year] = 2012
123
+ mock_today = Time.new(2010, 2, 29)
124
+ Time.stubs(:now).returns(mock_today)
125
+ assert_nothing_raised { CreditCard.new(@valid_attributes) }
126
+ end
127
+ end
128
+
129
+ should "return a hash" do
130
+ @expectation = {
131
+ :PaymentType => "CC",
132
+ :CardNumber => @cc.number,
133
+ :CardExpMonth => @cc.month,
134
+ :CardExpYear => @cc.year[2..3],
135
+ :CardIDNumber => @cc.verification_value
136
+ }
137
+ assert_equal @expectation, @cc.to_hash
138
+ end
139
+
140
+ should "return a hash for CardInfo hash (used in the account manager API)" do
141
+ @expectation = {
142
+ :CardHolder => "Bob John",
143
+ :CardNumber => "4111111111111111",
144
+ :CardExpMonth => "12",
145
+ :CardExpYear => "20"
146
+ }
147
+
148
+ assert_equal @expectation, @cc.to_hash(:card_info)
149
+ end
150
+
151
+ end
152
+ end
@@ -0,0 +1,112 @@
1
+ require 'test_helper'
2
+
3
+ module RubyPsigate
4
+ class GatewayTest < Test::Unit::TestCase
5
+
6
+ should "default to TEST environment" do
7
+ assert_equal :test, Gateway.env
8
+ end
9
+
10
+ should "set Gateway.env to :live" do
11
+ Gateway.live!
12
+ assert_equal :live, Gateway.env
13
+ end
14
+
15
+ should "set Gateway.env to :test" do
16
+ Gateway.test!
17
+ assert_equal :test, Gateway.env
18
+ end
19
+
20
+ should "set mode based on information passed to object instantiation" do
21
+ @gateway = Gateway.new(:store_id => "teststore", :passphrase => "psigate1234")
22
+ assert_equal :transaction, @gateway.mode
23
+ end
24
+
25
+ should "manually set mode" do
26
+ @gateway = Gateway.new
27
+ @gateway.mode = :account_manager
28
+ assert_equal :account_manager, @gateway.mode
29
+ end
30
+
31
+ should "set mode when parameter entered is a string" do
32
+ @gateway = Gateway.new
33
+ @gateway.mode = "account_manager"
34
+ assert_equal :account_manager, @gateway.mode
35
+ end
36
+
37
+ should "raise error if mode is invalid" do
38
+ @gateway = Gateway.new
39
+ assert_raises(InvalidGatewayMode) do
40
+ @gateway.mode = :unsupported
41
+ end
42
+ end
43
+
44
+ context "transaction interface" do
45
+ setup do
46
+ @gateway = Gateway.new(:store_id => "teststore", :passphrase => "psigate1234")
47
+ end
48
+
49
+ should "be set to transaction mode" do
50
+ assert_equal :transaction, @gateway.mode
51
+ end
52
+
53
+ should "respond to order getter/setter" do
54
+ assert @gateway.respond_to?(:order)
55
+ assert @gateway.respond_to?(:order=)
56
+ end
57
+
58
+ should "set the order" do
59
+ order = RubyPsigate::Order.new
60
+ assert @gateway.order.nil?
61
+ @gateway.order = order
62
+ assert_equal order, @gateway.order
63
+ end
64
+
65
+ should "raise error if mode not set before post" do
66
+ @gateway = Gateway.new
67
+ assert_nil @gateway.mode
68
+ assert_raises(InvalidGatewayMode) { @gateway.commit! }
69
+ end
70
+
71
+ should "raise error if mode is :transaction and passphrase is missing" do
72
+ @gateway = Gateway.new(:store_id => "teststore", :passphrase => nil)
73
+ @gateway.mode = :transaction
74
+ assert_raises(InvalidCredentials) { @gateway.commit! }
75
+ end
76
+
77
+ should "raise error if mode is :transaction and store_id is missing" do
78
+ @gateway = Gateway.new(:store_id => nil, :passphrase => "password")
79
+ @gateway.mode = :transaction
80
+ assert_raises(InvalidCredentials) { @gateway.commit! }
81
+ end
82
+
83
+ should "raise error if order not valid" do
84
+ @order = Order.new
85
+ @order.expects(:valid?).returns(false)
86
+ @gateway.order = @order
87
+ assert_raises(InvalidOrder) { @gateway.commit! }
88
+ end
89
+ end
90
+
91
+ context "account manager" do
92
+ should "raise error if mode is :account_manager and cid is missing" do
93
+ @gateway = Gateway.new(:cid => nil, :user_id => "teststore", :password => "password")
94
+ @gateway.mode = :account_manager
95
+ assert_raises(InvalidCredentials) { @gateway.commit! }
96
+ end
97
+
98
+ should "raise error if mode is :account_manager and user_id is missing" do
99
+ @gateway = Gateway.new(:cid => "1000001", :user_id => nil, :password => "password")
100
+ @gateway.mode = :account_manager
101
+ assert_raises(InvalidCredentials) { @gateway.commit! }
102
+ end
103
+
104
+ should "raise error if mode is :account_manager and password is missing" do
105
+ @gateway = Gateway.new(:cid => "1000001", :user_id => "teststore", :password => nil)
106
+ @gateway.mode = :account_manager
107
+ assert_raises(InvalidCredentials) { @gateway.commit! }
108
+ end
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ module RubyPsigate
4
+ class ItemOptionTest < Test::Unit::TestCase
5
+
6
+ should "return a key-value hash pair" do
7
+ hash = { :colour => "Pink" }
8
+ @item_option = ItemOption.new(hash)
9
+ assert_equal hash, @item_option.instance_variable_get(:@option)
10
+ end
11
+
12
+ should "accept multiple option parameters" do
13
+ hash = { :color => "Black", :size => "Large", :style => "modern" }
14
+ @item_option = ItemOption.new(hash)
15
+ assert_equal hash, @item_option.instance_variable_get(:@option)
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,106 @@
1
+ require 'test_helper'
2
+
3
+ module RubyPsigate
4
+ class ItemTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @item = Item.new
8
+ end
9
+
10
+ %w( unique_id desc qty price ).each do |field|
11
+ should "respond to #{field}" do
12
+ assert @item.respond_to?(field.downcase.to_sym)
13
+ setter = field.downcase + "="
14
+ assert @item.respond_to?(setter.to_sym)
15
+ end
16
+ end
17
+
18
+ should "raise error if qty is less than 0" do
19
+ assert_raises(NumberLessThanZero) do
20
+ @item.qty = -3
21
+ end
22
+ end
23
+
24
+ should "not raise error if qty is 0" do
25
+ assert_nothing_raised do
26
+ @item.qty = 0
27
+ end
28
+ end
29
+
30
+ should "not raise error if qty above 0" do
31
+ assert_nothing_raised do
32
+ @item.qty = 1
33
+ end
34
+ end
35
+
36
+ should "set a whole number for qty" do
37
+ @item.qty = "1.33"
38
+ assert_equal "1.33".to_i, @item.qty
39
+ end
40
+
41
+ should "respond to price getter/setter" do
42
+ assert @item.respond_to?(:price)
43
+ assert @item.respond_to?(:price=)
44
+ end
45
+
46
+ should "set the amount to 100.00" do
47
+ @item.price = "100.00"
48
+ assert_equal Money.new(100.00*100), @item.price
49
+ end
50
+
51
+ should "respond to options" do
52
+ assert @item.respond_to?(:options)
53
+ end
54
+
55
+ should "add options via << method" do
56
+ assert_equal 0, @item.options.count
57
+ @item << ItemOption.new(:color => "pink")
58
+ assert_equal [{ :color => "pink"}], @item.options
59
+ end
60
+
61
+ should "raise an error unless added option is a ItemOption class" do
62
+ assert_raises(InvalidItemOption) do
63
+ @item << { :color => "pink" }
64
+ end
65
+ end
66
+
67
+ should "return a simple item hash" do
68
+ @item.unique_id = "PSI-BOOK"
69
+ @item.desc = "XML Interface Doc"
70
+ @item.qty = 2
71
+ @item.price = 10.00
72
+
73
+ @expectation = {
74
+ :ItemID => "PSI-BOOK",
75
+ :ItemDescription => "XML Interface Doc",
76
+ :ItemQty => 2,
77
+ :ItemPrice => 10.00
78
+ }
79
+
80
+ assert_equal @expectation, @item.to_hash
81
+ end
82
+
83
+ should "return a nested item hash (with options)" do
84
+ @item.unique_id = "PSI-BOOK"
85
+ @item.desc = "XML Interface Doc"
86
+ @item.qty = 2
87
+ @item.price = 10.00
88
+ @item << ItemOption.new(:color => "pink")
89
+ @item << ItemOption.new(:size => "Extra Large")
90
+
91
+ @expectation = {
92
+ :ItemID => "PSI-BOOK",
93
+ :ItemDescription => "XML Interface Doc",
94
+ :ItemQty => 2,
95
+ :ItemPrice => 10.00,
96
+ :Option => {
97
+ :color => "pink",
98
+ :size => "Extra Large"
99
+ }
100
+ }
101
+
102
+ assert_equal @expectation, @item.to_hash
103
+ end
104
+
105
+ end
106
+ end