global_collect 0.1.0

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 (90) hide show
  1. data/COPYING +11 -0
  2. data/README.markdown +109 -0
  3. data/Rakefile +34 -0
  4. data/VERSION +1 -0
  5. data/examples/cancel_payment.rb +14 -0
  6. data/examples/convert_amount.rb +14 -0
  7. data/examples/get_order_status.rb +15 -0
  8. data/examples/insert_order_with_payment.rb +37 -0
  9. data/examples/process_challenged.rb +13 -0
  10. data/examples/set_payment.rb +23 -0
  11. data/examples/test_connection.rb +13 -0
  12. data/global_collect.gemspec +170 -0
  13. data/lib/global_collect/api_client.rb +71 -0
  14. data/lib/global_collect/builders/do_refund/credit_card_payment.rb +12 -0
  15. data/lib/global_collect/builders/do_refund/payment.rb +39 -0
  16. data/lib/global_collect/builders/insert_order_with_payment/credit_card_online_payment.rb +38 -0
  17. data/lib/global_collect/builders/insert_order_with_payment/hosted_credit_card_online_payment.rb +4 -0
  18. data/lib/global_collect/builders/insert_order_with_payment/order.rb +75 -0
  19. data/lib/global_collect/builders/insert_order_with_payment/payment.rb +25 -0
  20. data/lib/global_collect/builders/set_payment/payment.rb +23 -0
  21. data/lib/global_collect/const/payment_product.rb +38 -0
  22. data/lib/global_collect/const/payment_status.rb +90 -0
  23. data/lib/global_collect/field_validator.rb +47 -0
  24. data/lib/global_collect/request_models/base.rb +37 -0
  25. data/lib/global_collect/request_models/do_refund/credit_card_payment.rb +12 -0
  26. data/lib/global_collect/request_models/do_refund/payment.rb +39 -0
  27. data/lib/global_collect/request_models/insert_order_with_payment/credit_card_online_payment.rb +44 -0
  28. data/lib/global_collect/request_models/insert_order_with_payment/hosted_credit_card_online_payment.rb +19 -0
  29. data/lib/global_collect/request_models/insert_order_with_payment/order.rb +67 -0
  30. data/lib/global_collect/request_models/insert_order_with_payment/payment.rb +17 -0
  31. data/lib/global_collect/request_models/set_payment/payment.rb +17 -0
  32. data/lib/global_collect/requests/base.rb +43 -0
  33. data/lib/global_collect/requests/cancel_payment.rb +22 -0
  34. data/lib/global_collect/requests/composite.rb +23 -0
  35. data/lib/global_collect/requests/convert_amount.rb +29 -0
  36. data/lib/global_collect/requests/do_refund.rb +8 -0
  37. data/lib/global_collect/requests/get_order_status.rb +24 -0
  38. data/lib/global_collect/requests/insert_order_with_payment.rb +10 -0
  39. data/lib/global_collect/requests/process_challenged.rb +22 -0
  40. data/lib/global_collect/requests/set_payment.rb +9 -0
  41. data/lib/global_collect/requests/simple.rb +39 -0
  42. data/lib/global_collect/requests/test_connection.rb +8 -0
  43. data/lib/global_collect/responses/base.rb +73 -0
  44. data/lib/global_collect/responses/convert_amount/response_methods.rb +8 -0
  45. data/lib/global_collect/responses/do_refund/response_methods.rb +24 -0
  46. data/lib/global_collect/responses/get_order_status/v1_response_methods.rb +49 -0
  47. data/lib/global_collect/responses/get_order_status/v2_response_methods.rb +67 -0
  48. data/lib/global_collect/responses/insert_order_with_payment/credit_card_online_payment_response_methods.rb +31 -0
  49. data/lib/global_collect/responses/insert_order_with_payment/hosted_merchant_link_payment_response_methods.rb +16 -0
  50. data/lib/global_collect/responses/success_row.rb +15 -0
  51. data/lib/global_collect.rb +81 -0
  52. data/spec/api_client_spec.rb +93 -0
  53. data/spec/builders/do_refund/credit_card_payment_spec.rb +32 -0
  54. data/spec/builders/do_refund/payment_spec.rb +51 -0
  55. data/spec/builders/insert_order_with_payment/credit_card_online_payment_spec.rb +59 -0
  56. data/spec/builders/insert_order_with_payment/hosted_credit_card_online_payment_spec.rb +59 -0
  57. data/spec/builders/insert_order_with_payment/order_spec.rb +88 -0
  58. data/spec/builders/insert_order_with_payment/payment_spec.rb +37 -0
  59. data/spec/builders/set_payment/payment_spec.rb +35 -0
  60. data/spec/field_validator_spec.rb +79 -0
  61. data/spec/global_collect_spec.rb +43 -0
  62. data/spec/request_models/base_spec.rb +31 -0
  63. data/spec/request_models/insert_order_with_payment/credit_card_online_payment_spec.rb +11 -0
  64. data/spec/request_models/insert_order_with_payment/hosted_credit_card_online_payment_spec.rb +38 -0
  65. data/spec/requests/base_spec.rb +40 -0
  66. data/spec/requests/composite_spec.rb +48 -0
  67. data/spec/requests/convert_amount.rb +34 -0
  68. data/spec/requests/insert_order_with_payment_spec.rb +60 -0
  69. data/spec/requests/simple_spec.rb +37 -0
  70. data/spec/responses/base_spec.rb +59 -0
  71. data/spec/responses/convert_amount/response_methods_spec.rb +13 -0
  72. data/spec/responses/do_refund/response_methods_spec.rb +15 -0
  73. data/spec/responses/get_order_status/v1_response_methods_spec.rb +28 -0
  74. data/spec/responses/get_order_status/v2_response_methods_spec.rb +28 -0
  75. data/spec/responses/insert_order_with_payment/credit_card_online_payment_response_methods_spec.rb +13 -0
  76. data/spec/responses/insert_order_with_payment/hosted_merchant_link_payment_response_methods_spec.rb +13 -0
  77. data/spec/responses/succcess_row_spec.rb +26 -0
  78. data/spec/spec_helper.rb +130 -0
  79. data/spec/support/challenged_iowp_response.xml +51 -0
  80. data/spec/support/successful_convert_amount_response.xml +29 -0
  81. data/spec/support/successful_do_refund_response.xml +36 -0
  82. data/spec/support/successful_get_order_status_v1_response.xml +72 -0
  83. data/spec/support/successful_get_order_status_v2_response.xml +50 -0
  84. data/spec/support/successful_hosted_iowp_response.xml +60 -0
  85. data/spec/support/successful_iowp_response.xml +49 -0
  86. data/spec/support/successful_process_challenged_response.xml +26 -0
  87. data/spec/support/unsuccessful_do_refund_response.xml +29 -0
  88. data/spec/support/unsuccessful_iowp_response.xml +42 -0
  89. data/spec/support/unsuccessful_process_challenged_response.xml +30 -0
  90. metadata +213 -0
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe "the DO_REFUND credit card payment builder" do
4
+ before(:each) do
5
+ @node = Builder::XmlMarkup.new
6
+ end
7
+ it "should not build unknown keys" do
8
+ @builder = GlobalCollect::Builders::DoRefund::CreditCardPayment.new('foo' => 'bar')
9
+ @builder.build(@node)
10
+ xml = @node.target!
11
+
12
+ xml.should have_xpath("/PAYMENT")
13
+ xml.should_not have_xpath("/PAYMENT/foo")
14
+ end
15
+
16
+ it "should build cc-specific keys" do
17
+ fields = %w[
18
+ PAYMENTPRODUCTID
19
+ CREDITCARDNUMBER
20
+ EXPIRYDATE
21
+ ]
22
+ @builder = GlobalCollect::Builders::DoRefund::CreditCardPayment.new(
23
+ fields.inject({}) {|m,k| m[k] = k; m }
24
+ )
25
+ @builder.build(@node)
26
+ xml = @node.target!
27
+ xml.should have_xpath("/PAYMENT")
28
+ fields.each do |field|
29
+ xml.should match_xpath("/PAYMENT/#{field}", field)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,51 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe "the DO_REFUND payment builder" do
4
+ before(:each) do
5
+ @node = Builder::XmlMarkup.new
6
+ end
7
+ it "should not build unknown keys" do
8
+ @builder = GlobalCollect::Builders::DoRefund::Payment.new('foo' => 'bar')
9
+ @builder.build(@node)
10
+ xml = @node.target!
11
+
12
+ xml.should have_xpath("/PAYMENT")
13
+ xml.should_not have_xpath("/PAYMENT/foo")
14
+ end
15
+
16
+ it "should build known keys" do
17
+ fields = %w[
18
+ ORDERID
19
+ EFFORTID
20
+ MERCHANTREFERENCE
21
+ REFERENCEORIGPAYMENT
22
+ CURRENCYCODE
23
+ AMOUNT
24
+ COUNTRYCODE
25
+ REFUNDDATE
26
+ SURNAME
27
+ FIRSTNAME
28
+ PREFIXSURNAME
29
+ TITLE
30
+ COMPANYNAME
31
+ COMPANYDATA
32
+ STREET
33
+ HOUSENUMBER
34
+ ADDITIONALADDRESSINFO
35
+ ZIP
36
+ CITY
37
+ STATE
38
+ EMAILADDRESS
39
+ EMAILTYPEINDICATOR
40
+ ]
41
+ @builder = GlobalCollect::Builders::DoRefund::Payment.new(
42
+ fields.inject({}) {|m,k| m[k] = k; m }
43
+ )
44
+ @builder.build(@node)
45
+ xml = @node.target!
46
+ xml.should have_xpath("/PAYMENT")
47
+ fields.each do |field|
48
+ xml.should match_xpath("/PAYMENT/#{field}", field)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,59 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe "the IOWP credit card online payment builder" do
4
+ before(:each) do
5
+ @node = Builder::XmlMarkup.new
6
+ end
7
+ it "should not build unknown keys" do
8
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::CreditCardOnlinePayment.new('foo' => 'bar')
9
+ @builder.build(@node)
10
+ xml = @node.target!
11
+
12
+ xml.should have_xpath("/PAYMENT")
13
+ xml.should_not have_xpath("/PAYMENT/foo")
14
+ end
15
+
16
+ it "should build cc-specific keys" do
17
+ fields = %w[
18
+ EXPIRYDATE
19
+ CREDITCARDNUMBER
20
+ ISSUENUMBER
21
+ CVV
22
+ CVVINDICATOR
23
+ AVSINDICATOR
24
+ AUTHENTICATIONINDICATOR
25
+ STTINDICATOR
26
+ FIRSTNAME
27
+ PREFIXSURNAME
28
+ SURNAME
29
+ STREET
30
+ HOUSENUMBER
31
+ CUSTOMERIPADDRESS
32
+ ADDITIONALADDRESSINFO
33
+ ZIP
34
+ CITY
35
+ STATE
36
+ PHONENUMBER
37
+ EMAIL
38
+ BIRTHDATE
39
+ DCCINDICATOR
40
+ ISSUERAMOUNT
41
+ ISSUERCURRENCYCODE
42
+ MARGINRATEPERCENTAGE
43
+ EXCHANGERATESOURCENAME
44
+ EXCHANGERATE
45
+ EXCHANGERATEVALIDTO
46
+ MAC
47
+ ]
48
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::CreditCardOnlinePayment.new(
49
+ fields.inject({}) {|m,k| m[k] = k; m }
50
+ )
51
+ @builder.build(@node)
52
+ xml = @node.target!
53
+
54
+ xml.should have_xpath("/PAYMENT")
55
+ fields.each do |field|
56
+ xml.should match_xpath("/PAYMENT/#{field}", field)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,59 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe "the hosted IOWP credit card online payment builder" do
4
+ before(:each) do
5
+ @node = Builder::XmlMarkup.new
6
+ end
7
+ it "should not build unknown keys" do
8
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::HostedCreditCardOnlinePayment.new('foo' => 'bar')
9
+ @builder.build(@node)
10
+ xml = @node.target!
11
+
12
+ xml.should have_xpath("/PAYMENT")
13
+ xml.should_not have_xpath("/PAYMENT/foo")
14
+ end
15
+
16
+ it "should build hosted cc-specific keys" do
17
+ fields = %w[
18
+ EXPIRYDATE
19
+ CREDITCARDNUMBER
20
+ ISSUENUMBER
21
+ CVV
22
+ CVVINDICATOR
23
+ AVSINDICATOR
24
+ AUTHENTICATIONINDICATOR
25
+ STTINDICATOR
26
+ FIRSTNAME
27
+ PREFIXSURNAME
28
+ SURNAME
29
+ STREET
30
+ HOUSENUMBER
31
+ CUSTOMERIPADDRESS
32
+ ADDITIONALADDRESSINFO
33
+ ZIP
34
+ CITY
35
+ STATE
36
+ PHONENUMBER
37
+ EMAIL
38
+ BIRTHDATE
39
+ DCCINDICATOR
40
+ ISSUERAMOUNT
41
+ ISSUERCURRENCYCODE
42
+ MARGINRATEPERCENTAGE
43
+ EXCHANGERATESOURCENAME
44
+ EXCHANGERATE
45
+ EXCHANGERATEVALIDTO
46
+ MAC
47
+ ]
48
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::HostedCreditCardOnlinePayment.new(
49
+ fields.inject({}) {|m,k| m[k] = k; m }
50
+ )
51
+ @builder.build(@node)
52
+ xml = @node.target!
53
+
54
+ xml.should have_xpath("/PAYMENT")
55
+ fields.each do |field|
56
+ xml.should match_xpath("/PAYMENT/#{field}", field)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,88 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe "the IOWP order builder" do
4
+ before(:each) do
5
+ @node = Builder::XmlMarkup.new
6
+ end
7
+ it "should not build unknown keys" do
8
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::Order.new('foo' => 'bar')
9
+ @builder.build(@node)
10
+ xml = @node.target!
11
+
12
+ xml.should have_xpath("/ORDER")
13
+ xml.should_not have_xpath("/ORDER/foo")
14
+ end
15
+
16
+ it "should build known keys" do
17
+ fields = %w[
18
+ ORDERID
19
+ ORDERTYPE
20
+ AMOUNT
21
+ AMOUNTSIGN
22
+ CURRENCYCODE
23
+ LANGUAGECODE
24
+ COUNTRYCODE
25
+ OVERWRITEPAYMENTREFERNCE
26
+ IPADDRESSCUSTOMER
27
+ CUSTOMERID
28
+ MANDATE
29
+ TITLE
30
+ FIRSTNAME
31
+ PREFIXSURNAME
32
+ SURNAME
33
+ STREET
34
+ HOUSENUMBER
35
+ ADDITIONALADDRESSINFO
36
+ ZIP
37
+ CITY
38
+ STATE
39
+ SHIPPINGTITLE
40
+ SHIPPINGFIRSTNAME
41
+ SHIPPINGPREFIXSURNAME
42
+ SHIPPINGSURNAME
43
+ SHIPPINGSTREET
44
+ SHIPPINGHOUSENUMBER
45
+ SHIPPINGADDITIONALADDRESSINFO
46
+ SHIPPINGZIP
47
+ SHIPPINGCITY
48
+ SHIPPINGSTATE
49
+ SHIPPINGCOUNTRYCODE
50
+ MERCHANTREFERENCE
51
+ DESCRIPTOR
52
+ RESELLERID
53
+ EMAIL
54
+ EMAILTYPEINDICATOR
55
+ COMPANYNAME
56
+ COMPANYDATA
57
+ SEX
58
+ VATNUMBER
59
+ PHONENUMBER
60
+ FAXNUMBER
61
+ INVOICENUMBER
62
+ INVOICETYPE
63
+ INVOICEDATE
64
+ INVOICECLASS
65
+ ORDERDATE
66
+ BIRTHDATE
67
+ TEXTQUALIFIER1
68
+ TEXTQUALIFIER2
69
+ TEXTQUALIFIER3
70
+ ADDITIONALDATA
71
+ STARTDATE
72
+ ENDDATE
73
+ NUMBEROFPAYMENTS
74
+ STEPWEEK
75
+ STEPMONTH
76
+ ]
77
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::Order.new(
78
+ Hash[*fields.zip(fields)]
79
+ )
80
+ @builder.build(@node)
81
+ xml = @node.target!
82
+
83
+ xml.should have_xpath("/ORDER")
84
+ fields.each do |field|
85
+ xml.should match_xpath("/ORDER/#{field}", field)
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe "the IOWP payment builder" do
4
+ before(:each) do
5
+ @node = Builder::XmlMarkup.new
6
+ end
7
+ it "should not build unknown keys" do
8
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::Payment.new('foo' => 'bar')
9
+ @builder.build(@node)
10
+ xml = @node.target!
11
+
12
+ xml.should have_xpath("/PAYMENT")
13
+ xml.should_not have_xpath("/PAYMENT/foo")
14
+ end
15
+
16
+ it "should build known keys" do
17
+ fields = %w[
18
+ PAYMENTPRODUCTID
19
+ AMOUNT
20
+ AMOUNTSIGN
21
+ CURRENCYCODE
22
+ LANGUAGECODE
23
+ COUNTRYCODE
24
+ HOSTEDINDICATOR
25
+ RETURNURL
26
+ ]
27
+ @builder = GlobalCollect::Builders::InsertOrderWithPayment::Payment.new(
28
+ fields.inject({}) {|m,k| m[k] = k; m }
29
+ )
30
+ @builder.build(@node)
31
+ xml = @node.target!
32
+ xml.should have_xpath("/PAYMENT")
33
+ fields.each do |field|
34
+ xml.should match_xpath("/PAYMENT/#{field}", field)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe "the SET_PAYMENT payment builder" do
4
+ before(:each) do
5
+ @node = Builder::XmlMarkup.new
6
+ end
7
+ it "should not build unknown keys" do
8
+ @builder = GlobalCollect::Builders::SetPayment::Payment.new('foo' => 'bar')
9
+ @builder.build(@node)
10
+ xml = @node.target!
11
+
12
+ xml.should have_xpath("/PAYMENT")
13
+ xml.should_not have_xpath("/PAYMENT/foo")
14
+ end
15
+
16
+ it "should build known keys" do
17
+ fields = %w[
18
+ ORDERID
19
+ EFFORTID
20
+ PAYMENTPRODUCTID
21
+ AMOUNT
22
+ CURRENCYCODE
23
+ DATECOLLECT
24
+ ]
25
+ @builder = GlobalCollect::Builders::SetPayment::Payment.new(
26
+ fields.inject({}) {|m,k| m[k] = k; m }
27
+ )
28
+ @builder.build(@node)
29
+ xml = @node.target!
30
+ xml.should have_xpath("/PAYMENT")
31
+ fields.each do |field|
32
+ xml.should match_xpath("/PAYMENT/#{field}", field)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ describe "the model validator" do
4
+ it "should accept nil when the field is not required" do
5
+ GlobalCollect::FieldValidator.new("D", "O").validate(nil).should be_true
6
+ GlobalCollect::FieldValidator.new("N1", "O").validate(nil).should be_true
7
+ GlobalCollect::FieldValidator.new("AN1", "O").validate(nil).should be_true
8
+ end
9
+
10
+ it "should validate good dates" do
11
+ validator = GlobalCollect::FieldValidator.new("D", "R")
12
+ validator.to_sym.should == :datetime
13
+ # random good dates from the spec
14
+ validator.validate("20070830120000").should be_true
15
+ validator.validate("20010101000000").should be_true
16
+ validator.validate("19990413012344").should be_true
17
+ end
18
+
19
+ it "should not validate bad dates" do
20
+ validator = GlobalCollect::FieldValidator.new("D", "R")
21
+ validator.to_sym.should == :datetime
22
+ # too short
23
+ validator.validate("1111").should be_false
24
+ # invalid second
25
+ validator.validate("20100101000099").should be_false
26
+ # invalid minute
27
+ validator.validate("20100101009900").should be_false
28
+ # invalid hour
29
+ validator.validate("20100101990000").should be_false
30
+ # invalid day
31
+ validator.validate("20100199000000").should be_false
32
+ # invalid month
33
+ validator.validate("20109901000000").should be_false
34
+ # bad prefix
35
+ validator.validate("a20100101123456").should be_false
36
+ # bad suffix
37
+ validator.validate("20100101123456a").should be_false
38
+ end
39
+
40
+ it "should validate good alphanumerics" do
41
+ validator = GlobalCollect::FieldValidator.new("AN4", "R")
42
+ validator.to_sym.should == :alphanumeric
43
+ validator.validate("a1b2").should be_true
44
+ validator.validate("A1B2").should be_true
45
+ validator.validate("A1b2").should be_true
46
+ validator.validate("aaa").should be_true
47
+ validator.validate("111").should be_true
48
+ validator.validate("a b2").should be_true
49
+ validator.validate("A-B2").should be_true
50
+ validator.validate("A1b2").should be_true
51
+ validator.validate("").should be_true
52
+ validator.validate(" ").should be_true
53
+ end
54
+
55
+ it "should not validate bad alphanumerics" do
56
+ validator = GlobalCollect::FieldValidator.new("AN4", "R")
57
+ validator.to_sym.should == :alphanumeric
58
+ # too long
59
+ validator.validate("aaa213123123123").should be_false
60
+ end
61
+
62
+ it "should validate good numerics" do
63
+ validator = GlobalCollect::FieldValidator.new("N4", "R")
64
+ validator.to_sym.should == :numeric
65
+ validator.validate("1").should be_true
66
+ validator.validate("12").should be_true
67
+ validator.validate("123").should be_true
68
+ validator.validate("1234").should be_true
69
+ end
70
+
71
+ it "should not validate bad numerics" do
72
+ validator = GlobalCollect::FieldValidator.new("N4", "R")
73
+ validator.to_sym.should == :numeric
74
+ validator.validate("").should be_false
75
+ validator.validate("a12").should be_false
76
+ validator.validate("a").should be_false
77
+ validator.validate(" ").should be_false
78
+ end
79
+ end