revo-remit 0.2.3

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 (100) hide show
  1. data/LICENSE +20 -0
  2. data/README.markdown +122 -0
  3. data/lib/remit.rb +132 -0
  4. data/lib/remit/common.rb +151 -0
  5. data/lib/remit/data_types.rb +265 -0
  6. data/lib/remit/error_codes.rb +118 -0
  7. data/lib/remit/get_pipeline.rb +286 -0
  8. data/lib/remit/inbound_request.rb +85 -0
  9. data/lib/remit/ipn_request.rb +8 -0
  10. data/lib/remit/operations/cancel.rb +20 -0
  11. data/lib/remit/operations/cancel_subscription_and_refund.rb +26 -0
  12. data/lib/remit/operations/cancel_token.rb +19 -0
  13. data/lib/remit/operations/fund_prepaid.rb +33 -0
  14. data/lib/remit/operations/get_account_activity.rb +31 -0
  15. data/lib/remit/operations/get_account_balance.rb +32 -0
  16. data/lib/remit/operations/get_all_credit_instruments.rb +20 -0
  17. data/lib/remit/operations/get_all_prepaid_instruments.rb +20 -0
  18. data/lib/remit/operations/get_debt_balance.rb +28 -0
  19. data/lib/remit/operations/get_outstanding_debt_balance.rb +25 -0
  20. data/lib/remit/operations/get_payment_instruction.rb +23 -0
  21. data/lib/remit/operations/get_prepaid_balance.rb +27 -0
  22. data/lib/remit/operations/get_recipient_verification_status.rb +25 -0
  23. data/lib/remit/operations/get_token_by_caller.rb +23 -0
  24. data/lib/remit/operations/get_token_usage.rb +22 -0
  25. data/lib/remit/operations/get_tokens.rb +24 -0
  26. data/lib/remit/operations/get_total_prepaid_liability.rb +26 -0
  27. data/lib/remit/operations/get_transaction.rb +18 -0
  28. data/lib/remit/operations/get_transaction_status.rb +28 -0
  29. data/lib/remit/operations/install_payment_instruction.rb +29 -0
  30. data/lib/remit/operations/pay.rb +31 -0
  31. data/lib/remit/operations/refund.rb +46 -0
  32. data/lib/remit/operations/reserve.rb +28 -0
  33. data/lib/remit/operations/settle.rb +21 -0
  34. data/lib/remit/operations/settle_debt.rb +28 -0
  35. data/lib/remit/operations/subscribe_for_caller_notification.rb +20 -0
  36. data/lib/remit/operations/unsubscribe_for_caller_notification.rb +19 -0
  37. data/lib/remit/operations/write_off_debt.rb +26 -0
  38. data/lib/remit/pipeline_response.rb +20 -0
  39. data/lib/remit/signature_utils_for_outbound.rb +74 -0
  40. data/lib/remit/verify_signature.rb +21 -0
  41. data/spec/integrations/get_account_activity_spec.rb +42 -0
  42. data/spec/integrations/get_tokens_spec.rb +39 -0
  43. data/spec/integrations/integrations_helper.rb +15 -0
  44. data/spec/integrations/ipn_request_spec.rb +40 -0
  45. data/spec/integrations/pipeline_response_spec.rb +27 -0
  46. data/spec/integrations/verify_signature_spec.rb +140 -0
  47. data/spec/mocks/CancelResponse.xml +13 -0
  48. data/spec/mocks/CancelSubscriptionAndRefundResponse.xml +10 -0
  49. data/spec/mocks/CancelTokenResponse.xml +6 -0
  50. data/spec/mocks/ErrorResponse.xml +15 -0
  51. data/spec/mocks/FundPrepaidResponse.xml +11 -0
  52. data/spec/mocks/GetAccountActivityResponse.xml +68 -0
  53. data/spec/mocks/GetAccountBalanceResponse.xml +34 -0
  54. data/spec/mocks/GetDebtBalanceResponse.xml +21 -0
  55. data/spec/mocks/GetOutstandingDebtBalanceResponse.xml +21 -0
  56. data/spec/mocks/GetPaymentInstructionResponse.xml +25 -0
  57. data/spec/mocks/GetPrepaidBalanceResponse.xml +21 -0
  58. data/spec/mocks/GetRecipientVerificationStatusResponse.xml +9 -0
  59. data/spec/mocks/GetTokenByCallerResponse.xml +22 -0
  60. data/spec/mocks/GetTokenUsageResponse.xml +28 -0
  61. data/spec/mocks/GetTokensResponse.xml +22 -0
  62. data/spec/mocks/GetTotalPrepaidLiabilityResponse.xml +21 -0
  63. data/spec/mocks/GetTransactionResponse.xml +76 -0
  64. data/spec/mocks/GetTransactionStatusResponse.xml +16 -0
  65. data/spec/mocks/InstallPaymentInstructionResponse.xml +10 -0
  66. data/spec/mocks/PayResponse.xml +11 -0
  67. data/spec/mocks/RefundResponse.xml +11 -0
  68. data/spec/mocks/ReserveResponse.xml +11 -0
  69. data/spec/mocks/SettleDebtResponse.xml +11 -0
  70. data/spec/mocks/SettleResponse.xml +11 -0
  71. data/spec/mocks/VerifySignatureResponse.xml +11 -0
  72. data/spec/mocks/WriteOffDebtResponse.xml +11 -0
  73. data/spec/mocks/errors/InvalidParameterValue.xml +10 -0
  74. data/spec/mocks/errors/InvalidParams_certificateUrl.xml +2 -0
  75. data/spec/mocks/errors/RequestExpired.xml +10 -0
  76. data/spec/spec_helper.rb +85 -0
  77. data/spec/units/cancel_subscription_and_refund_spec.rb +29 -0
  78. data/spec/units/cancel_token_spec.rb +24 -0
  79. data/spec/units/fund_prepaid_spec.rb +28 -0
  80. data/spec/units/get_account_activity_spec.rb +58 -0
  81. data/spec/units/get_account_balance_spec.rb +28 -0
  82. data/spec/units/get_debt_balance_spec.rb +29 -0
  83. data/spec/units/get_outstanding_debt_balance_spec.rb +29 -0
  84. data/spec/units/get_pipeline_spec.rb +181 -0
  85. data/spec/units/get_prepaid_balance_spec.rb +29 -0
  86. data/spec/units/get_recipient_verification_status_spec.rb +26 -0
  87. data/spec/units/get_token_by_caller_spec.rb +56 -0
  88. data/spec/units/get_token_usage_spec.rb +51 -0
  89. data/spec/units/get_tokens_spec.rb +56 -0
  90. data/spec/units/get_total_prepaid_liability_spec.rb +26 -0
  91. data/spec/units/get_transaction_spec.rb +103 -0
  92. data/spec/units/get_transaction_status_spec.rb +44 -0
  93. data/spec/units/pay_spec.rb +112 -0
  94. data/spec/units/refund_spec.rb +41 -0
  95. data/spec/units/reserve_spec.rb +41 -0
  96. data/spec/units/settle_debt_spec.rb +41 -0
  97. data/spec/units/settle_spec.rb +41 -0
  98. data/spec/units/units_helper.rb +25 -0
  99. data/spec/units/write_off_debt_spec.rb +41 -0
  100. metadata +236 -0
@@ -0,0 +1,29 @@
1
+ require 'units/units_helper'
2
+
3
+ describe "the CancelSubscriptionAndRefund API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/CancelSubscriptionAndRefundResponse.xml")
9
+
10
+ @response = Remit::CancelSubscriptionAndRefund::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata
15
+ end
16
+
17
+ it "has results" do
18
+ @response.cancel_subscription_and_refund_result.should_not be_nil
19
+ end
20
+
21
+ describe "the result" do
22
+ it "should have refund_transaction_id" do
23
+ @response.cancel_subscription_and_refund_result.refund_transaction_id.should == 'string'
24
+ end
25
+ end
26
+
27
+
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the GetTransaction API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/CancelTokenResponse.xml")
9
+
10
+ @response = Remit::CancelToken::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata
15
+ end
16
+
17
+ describe "metadata" do
18
+ it "has request_id" do
19
+ @response.response_metadata.request_id
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the FundPrepaid API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/FundPrepaidResponse.xml")
9
+
10
+ @response = Remit::FundPrepaid::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata.should_not be_nil
15
+ end
16
+
17
+ describe "metadata" do
18
+ it "has request_id" do
19
+ @response.response_metadata.request_id
20
+ end
21
+ end
22
+
23
+ it "has results" do
24
+ @response.fund_prepaid_result.should_not be_nil
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the GetAccountActivity API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before(:all) do
8
+ doc = File.read("spec/mocks/GetAccountActivityResponse.xml")
9
+
10
+ @response = Remit::GetAccountActivity::Response.new(doc)
11
+ end
12
+
13
+ it "has results" do
14
+ @response.get_account_activity_result.should_not be_nil
15
+ end
16
+
17
+ describe "the result" do
18
+ before(:all) do
19
+ @activity = @response.get_account_activity_result
20
+ end
21
+
22
+ it "should have transactions" do
23
+ @activity.transactions.should_not be_nil
24
+ end
25
+
26
+ it "should have transactions" do
27
+ @activity.transactions.size.should_not == 0
28
+ end
29
+
30
+ it "should have batch_size" do
31
+ @activity.batch_size.should_not be_nil
32
+ end
33
+
34
+ it "should have start_time_for_next_transaction" do
35
+ @activity.start_time_for_next_transaction.should_not be_nil
36
+ end
37
+
38
+ describe "a transaction" do
39
+ before(:all) do
40
+ @transaction = @activity.transactions.first
41
+ end
42
+ it "should have transaction_status" do
43
+ @transaction.transaction_status.should == "string"
44
+ end
45
+
46
+ it "should have status_code" do
47
+ @transaction.status_code.should == "string"
48
+ end
49
+
50
+ it "should have status_message" do
51
+ @transaction.status_message.should_not be_nil
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the GetAccountBalance API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/GetAccountBalanceResponse.xml")
9
+
10
+ @response = Remit::GetAccountBalance::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata.should_not be_nil
15
+ end
16
+
17
+ it "has results" do
18
+ @response.get_account_balance_result.should_not be_nil
19
+ end
20
+
21
+ describe "the result" do
22
+ it "should have a total_balance" do
23
+ @response.get_account_balance_result.account_balance.total_balance.value.should == 0
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the GetDebtBalance API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/GetDebtBalanceResponse.xml")
9
+
10
+ @response = Remit::GetDebtBalance::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata.should_not be_nil
15
+ end
16
+
17
+ it "has results" do
18
+ @response.get_debt_balance_result.should_not be_nil
19
+ end
20
+
21
+ describe "the result" do
22
+ it "should have an available_balance" do
23
+ @response.get_debt_balance_result.debt_balance.available_balance.value.should == 0
24
+ end
25
+ end
26
+
27
+
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the GetOutstandingDebtBalance API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/GetOutstandingDebtBalanceResponse.xml")
9
+
10
+ @response = Remit::GetOutstandingDebtBalance::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata.should_not be_nil
15
+ end
16
+
17
+ it "has results" do
18
+ @response.get_outstanding_debt_balance_result.should_not be_nil
19
+ end
20
+
21
+ describe "the result" do
22
+ it "should have refund_transaction_id" do
23
+ @response.get_outstanding_debt_balance_result.outstanding_debt.outstanding_balance.value.should == 0
24
+ end
25
+ end
26
+
27
+
28
+ end
29
+ end
@@ -0,0 +1,181 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe 'A pipeline', :shared => true do
4
+ before do
5
+ @pipeline_options = {
6
+ :return_url => 'http://example.com/'
7
+ }
8
+ @pipeline = remit.get_single_use_pipeline(@pipeline_options)
9
+ end
10
+
11
+ describe 'with signed url' do
12
+ before(:each) do
13
+ @uri = URI.parse(@pipeline.url)
14
+ end
15
+ it "should have a signature" do
16
+ @uri.query.should =~ /signature=/
17
+ end
18
+ it "should specify a signature version" do
19
+ @uri.query.should =~ /signatureVersion=2/
20
+ end
21
+ it "should specify a signature method" do
22
+ @uri.query.should =~ /signatureMethod=HmacSHA256/
23
+ end
24
+ end
25
+
26
+ it 'should sign its URL' do
27
+ uri = URI.parse(@pipeline.url)
28
+ pipeline = Remit::SignedQuery.parse(uri, remit.secret_key, uri.query)
29
+ query = Relax::Query.parse(uri)
30
+
31
+ pipeline[:awsSignature].should == query[:awsSignature]
32
+ end
33
+ end
34
+
35
+ describe 'A single-use pipeline' do
36
+ it_should_behave_like 'A pipeline'
37
+
38
+ before do
39
+ @pipeline_options.merge!({
40
+ :transaction_amount => 10,
41
+ :caller_reference => 'N2PCBEIA5864E27EL7C86PJL1FGUGPBL61QTJJM5GQK265SPEN8ZKIJPMQARDVJK',
42
+ :recipient_token => 'N5PCME5A5Q6FE2QEB7CD64JLGFTUGXBE61HTCJMGGAK2R5IPEQ8EKIVP3QAVD7JP'
43
+ })
44
+
45
+ @pipeline = remit.get_single_use_pipeline(@pipeline_options)
46
+ end
47
+
48
+ it 'should ignore unused parameters' do
49
+ uri = URI.parse(@pipeline.url)
50
+ query = Relax::Query.parse(uri)
51
+
52
+ query[:paymentReason].should be_nil
53
+ end
54
+
55
+ it 'should have the right name' do
56
+ @pipeline.pipeline_name.should == Remit::PipelineName::SINGLE_USE
57
+ end
58
+ end
59
+
60
+ describe 'A multi-use pipeline' do
61
+ it_should_behave_like 'A pipeline'
62
+
63
+ before do
64
+ @pipeline_options.merge!({
65
+ :transaction_amount => 10,
66
+ :caller_reference => 'N2PCBEIA5864E27EL7C86PJL1FGUGPBL61QTJJM5GQK265SPEN8ZKIJPMQARDVJK',
67
+ :recipient_token_list => 'N5PCME5A5Q6FE2QEB7CD64JLGFTUGXBE61HTCJMGGAK2R5IPEQ8EKIVP3QAVD7JP'
68
+ })
69
+
70
+ @pipeline = remit.get_multi_use_pipeline(@pipeline_options)
71
+ end
72
+
73
+ it 'should ignore unused parameters' do
74
+ uri = URI.parse(@pipeline.url)
75
+ query = Relax::Query.parse(uri)
76
+
77
+ query[:paymentReason].should be_nil
78
+ end
79
+
80
+ it 'should have the right name' do
81
+ @pipeline.pipeline_name.should == Remit::PipelineName::MULTI_USE
82
+ end
83
+ end
84
+
85
+ describe 'A recipient pipeline' do
86
+ it_should_behave_like 'A pipeline'
87
+
88
+ before do
89
+ @validity_start = Time.now + (3600 * 24) # 1 day from now
90
+ @validity_expiry = Time.now + (2600 * 24 * 180) # ~6 months from now
91
+
92
+ @pipeline_options.merge!({
93
+ :validity_start => @validity_start,
94
+ :validity_expiry => @validity_expiry,
95
+ :caller_reference => 'N2PCBEIA5864E27EL7C86PJL1FGUGPBL61QTJJM5GQK265SPEN8ZKIJPMQARDVJK',
96
+ :max_variable_fee => '0.25',
97
+ :recipient_pays_fee => true
98
+ })
99
+
100
+ @pipeline = remit.get_recipient_pipeline(@pipeline_options)
101
+ end
102
+
103
+ it 'should have the recipient pay marketplace fees' do
104
+ @pipeline.url.should match(/recipientPaysFee=true/)
105
+ end
106
+
107
+ it 'should have the right name' do
108
+ @pipeline.pipeline_name.should == Remit::PipelineName::RECIPIENT
109
+ end
110
+ end
111
+
112
+ describe 'A recurring-use pipeline' do
113
+ it_should_behave_like 'A pipeline'
114
+
115
+ before do
116
+ @validity_start = Time.now + (3600 * 24) # 1 day from now
117
+ @validity_expiry = Time.now + (3600 * 24 * 180) # ~6 months from now
118
+ @recurring_period = '1 Month'
119
+
120
+ @pipeline_options.merge!({
121
+ :validity_start => @validity_start,
122
+ :validity_expiry => @validity_expiry,
123
+ :recurring_period => @recurring_period,
124
+ :transaction_amount => 10,
125
+ :caller_reference => 'N2PCBEIA5864E27EL7C86PJL1FGUGPBL61QTJJM5GQK265SPEN8ZKIJPMQARDVJK',
126
+ :recipient_token => 'N5PCME5A5Q6FE2QEB7CD64JLGFTUGXBE61HTCJMGGAK2R5IPEQ8EKIVP3QAVD7JP'
127
+ })
128
+
129
+ @pipeline = remit.get_recurring_use_pipeline(@pipeline_options)
130
+ end
131
+
132
+ it 'should convert times to seconds from epoch' do
133
+ uri = URI.parse(@pipeline.url)
134
+ query = Relax::Query.parse(uri)
135
+
136
+ @validity_start.to_i.to_s.should == query[:validityStart]
137
+ @validity_expiry.to_i.to_s.should == query[:validityExpiry]
138
+ end
139
+
140
+ it 'should allow time in seconds' do
141
+ options = @pipeline_options.merge({
142
+ :validity_start => @validity_start.to_i,
143
+ :validity_expiry => @validity_expiry.to_i
144
+ })
145
+ @pipeline = remit.get_recurring_use_pipeline(options)
146
+
147
+ uri = URI.parse(@pipeline.url)
148
+ query = Relax::Query.parse(uri)
149
+
150
+ @validity_start.to_i.to_s.should == query[:validityStart]
151
+ @validity_expiry.to_i.to_s.should == query[:validityExpiry]
152
+ end
153
+
154
+ it 'should have the right name' do
155
+ @pipeline.pipeline_name.should == Remit::PipelineName::RECURRING
156
+ end
157
+ end
158
+
159
+ describe 'A postpaid pipeline' do
160
+ it_should_behave_like 'A pipeline'
161
+
162
+ before do
163
+ @credit_limit = 100
164
+ @global_amount_limit = 100
165
+
166
+ @pipeline_options.merge!({
167
+ :credit_limit => @credit_limit,
168
+ :global_amount_limit => @global_amount_limit
169
+ })
170
+
171
+ @pipeline = remit.get_postpaid_pipeline(@pipeline_options)
172
+ end
173
+
174
+ it 'should create a PostpaidPipeline' do
175
+ @pipeline.class.should == Remit::GetPipeline::PostpaidPipeline
176
+ end
177
+
178
+ it 'should have the right name' do
179
+ @pipeline.pipeline_name.should == Remit::PipelineName::SETUP_POSTPAID
180
+ end
181
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the GetPrepaidBalance API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/GetPrepaidBalanceResponse.xml")
9
+
10
+ @response = Remit::GetPrepaidBalance::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata.should_not be_nil
15
+ end
16
+
17
+ it "has results" do
18
+ @response.get_prepaid_balance_result.should_not be_nil
19
+ end
20
+
21
+ describe "the result" do
22
+ it "should have refund_transaction_id" do
23
+ @response.get_prepaid_balance_result.prepaid_balance.available_balance.value.should == 0
24
+ end
25
+ end
26
+
27
+
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "the GetRecipientVerificationStatus API" do
4
+ describe "a successful response" do
5
+ it_should_behave_like 'a successful response'
6
+
7
+ before do
8
+ doc = File.read("spec/mocks/GetRecipientVerificationStatusResponse.xml")
9
+
10
+ @response = Remit::GetRecipientVerificationStatus::Response.new(doc)
11
+ end
12
+
13
+ it "has metadata" do
14
+ @response.response_metadata.should_not be_nil
15
+ end
16
+
17
+ it "has results" do
18
+ @response.get_recipient_verification_status_result.should_not be_nil
19
+ end
20
+
21
+ it "has status" do
22
+ @response.get_recipient_verification_status_result.recipient_verification_status.should_not be_nil
23
+ end
24
+
25
+ end
26
+ end