amazon_flex_pay 0.9.14 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
- require File.dirname(__FILE__) + '/test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
- class AmazonFlexPayTest < AmazonFlexPay::Test
3
+ class AmazonFlexPay::DataTypesTest < AmazonFlexPay::Test
4
4
  include AmazonFlexPay::DataTypes
5
5
  include ResponseSamples
6
6
 
@@ -27,4 +27,4 @@ class AmazonFlexPayTest < AmazonFlexPay::Test
27
27
 
28
28
  assert_equal 'abc123', related.full.transaction_id
29
29
  end
30
- end
30
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class AmazonFlexPay::Pipelines::BaseTest < AmazonFlexPay::Test
4
+
5
+ class TestPipeline < AmazonFlexPay::Pipelines::Base
6
+ attribute :foo
7
+ end
8
+
9
+ should "hash pipelines" do
10
+ pipeline = TestPipeline.new(:foo => 'bar', :return_url => 'http://example.com/return')
11
+ hash = pipeline.to_hash
12
+
13
+ assert_equal 'TestPipeline', hash['pipelineName']
14
+ assert_equal '2009-01-09', hash['version']
15
+ assert_equal 'http://example.com/return', hash['returnURL']
16
+ end
17
+
18
+ should "parameterize signed pipelines" do
19
+ Time.stubs(:now).returns(Time.parse('Jan 1 2011')) # so the signature remains constant
20
+
21
+ pipeline = TestPipeline.new(:foo => 'bar', :return_url => 'http://example.com/return')
22
+ param = pipeline.to_param
23
+
24
+ {
25
+ 'foo' => 'bar',
26
+ 'callerKey' => 'foo',
27
+ 'signatureVersion' => 2,
28
+ 'signatureMethod' => 'HmacSHA256',
29
+ 'signature' => 'OuUJQqFBJhezmcWOAhDGcsD%2F6OXpOLVlcbF3XMIZO3U%3D'
30
+ }.each do |key, value|
31
+ assert param.match(/#{key}=#{value}/), "#{param} should contain #{key}=#{value}"
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../test_helper'
2
+
3
+ class AmazonFlexPay::PipelinesTest < AmazonFlexPay::Test
4
+ should "build a edit token pipeline" do
5
+ AmazonFlexPay.expects(:cbui).with do |pipeline|
6
+ assert pipeline.is_a? AmazonFlexPay::Pipelines::EditToken
7
+ assert_equal 'pipe1', pipeline.caller_reference
8
+ assert_equal 'token', pipeline.token_id
9
+ end
10
+ AmazonFlexPay.edit_token_pipeline('pipe1', 'http://example.com/return',
11
+ :token_id => 'token'
12
+ )
13
+ end
14
+
15
+ should "build a multi use pipeline" do
16
+ AmazonFlexPay.expects(:cbui).with do |pipeline|
17
+ assert pipeline.is_a? AmazonFlexPay::Pipelines::MultiUse
18
+ assert_equal 'pipe2', pipeline.caller_reference
19
+ assert_equal '50.00', pipeline.global_amount_limit
20
+ assert_equal 'Count', pipeline.usage_limit_type1
21
+ assert_equal '2', pipeline.usage_limit_value1
22
+ end
23
+ AmazonFlexPay.multi_use_pipeline('pipe2', 'http://example.com/return',
24
+ :global_amount_limit => "50.00",
25
+ :usage_limit_type1 => 'Count',
26
+ :usage_limit_value1 => '2'
27
+ )
28
+ end
29
+
30
+ should "build a recipient pipeline" do
31
+ AmazonFlexPay.expects(:cbui).with do |pipeline|
32
+ assert pipeline.is_a? AmazonFlexPay::Pipelines::Recipient
33
+ assert_equal 'pipe3', pipeline.caller_reference
34
+ assert_equal true, pipeline.recipient_pays_fee
35
+ end
36
+ AmazonFlexPay::recipient_pipeline('pipe3', 'http://example.com/return',
37
+ :recipient_pays_fee => true
38
+ )
39
+ end
40
+
41
+ should "build a single use pipeline" do
42
+ AmazonFlexPay.expects(:cbui).with do |pipeline|
43
+ assert pipeline.is_a? AmazonFlexPay::Pipelines::SingleUse
44
+ assert_equal 'pipe4', pipeline.caller_reference
45
+ assert_equal 'token', pipeline.recipient_token
46
+ assert_equal '25.00', pipeline.transaction_amount
47
+ assert_equal true, pipeline.disable_guest
48
+ end
49
+ AmazonFlexPay.single_use_pipeline('pipe4', 'http://example.com/return',
50
+ :recipient_token => 'token',
51
+ :transaction_amount => '25.00',
52
+ :disable_guest => true
53
+ )
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ require_relative '../test_helper'
2
+
3
+ class AmazonFlexPay::SignatureTest < AmazonFlexPay::Test
4
+ should "generate a valid v2 signature" do
5
+ # NOTE: I'm not sure of a supplied signature example that I can copy, so
6
+ # I set this one up by making sure signatures were being accepted by
7
+ # Amazon and then generating and saving my own example. Kinda backwards
8
+ # but good enough for regression testing.
9
+ assert_equal "Ro7iH0M+1hIR/SXGvT1kmF6Tg5uUKRSUd1AWaJHOcpE=", AmazonFlexPay::Signature.new('bar', 'http://example.com/api', :hello => 'world').generate
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../test_helper'
2
+
3
+ class AmazonFlexPay::UtilTest < AmazonFlexPay::Test
4
+ should "create a sorted query string" do
5
+ assert_equal "a=1&b=2&c=3&d=4&e=5", AmazonFlexPay.query_string(:a => 1, :b => 2, :c => 3, :d => 4, :e => 5)
6
+ end
7
+
8
+ should "flatten nested hashes into a query string using periods" do
9
+ assert_equal "a.a=1&a.b=2&b=3", AmazonFlexPay.query_string(:b => 3, :a => {:a => 1, :b => 2})
10
+ end
11
+
12
+ should "percent-encode spaces and other characters for a query string" do
13
+ assert_equal 'a=hello%20world%21', AmazonFlexPay.query_string(:a => 'hello world!')
14
+ end
15
+ end
@@ -5,11 +5,9 @@ gem 'rails', '3.2.5'
5
5
  require 'mocha'
6
6
 
7
7
  # load the gem
8
- root = File.dirname(__FILE__) + '/../lib'
9
- $LOAD_PATH.unshift root
10
- require root + '/amazon_flex_pay'
8
+ require_relative '../lib/amazon_flex_pay'
11
9
 
12
- require 'response_samples'
10
+ require_relative 'response_samples'
13
11
 
14
12
  class AmazonFlexPay::Test < Test::Unit::TestCase
15
13
  def default_test; end # quiet Test::Unit
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amazon_flex_pay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.14
4
+ version: 0.10.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-11 00:00:00.000000000 Z
12
+ date: 2013-02-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
16
- requirement: &70229461297120 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 1.6.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70229461297120
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.6.1
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: multi_xml
27
- requirement: &70229461296460 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 0.5.2
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70229461296460
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.5.2
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: activesupport
38
- requirement: &70229461295880 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 3.0.14
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70229461295880
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 3.0.14
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: mocha
49
- requirement: &70229461295380 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,7 +69,12 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70229461295380
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  description: A straight-forward REST API for Amazon's Flexible Payments Services.
59
79
  email: lance@kickstarter.com
60
80
  executables: []
@@ -88,15 +108,19 @@ files:
88
108
  - lib/amazon_flex_pay/pipelines/recipient.rb
89
109
  - lib/amazon_flex_pay/pipelines/single_use.rb
90
110
  - lib/amazon_flex_pay/pipelines.rb
91
- - lib/amazon_flex_pay/signing.rb
111
+ - lib/amazon_flex_pay/signature.rb
112
+ - lib/amazon_flex_pay/util.rb
92
113
  - lib/amazon_flex_pay.rb
93
114
  - LICENSE
94
115
  - README.rdoc
95
116
  - Rakefile
96
- - test/amazon_flex_pay_test.rb
97
- - test/api_test.rb
98
- - test/data_types_test.rb
99
- - test/pipelines_test.rb
117
+ - test/amazon_flex_pay/api/base_request_test.rb
118
+ - test/amazon_flex_pay/api_test.rb
119
+ - test/amazon_flex_pay/data_types_test.rb
120
+ - test/amazon_flex_pay/pipelines/base_test.rb
121
+ - test/amazon_flex_pay/pipelines_test.rb
122
+ - test/amazon_flex_pay/signature_test.rb
123
+ - test/amazon_flex_pay/util_test.rb
100
124
  - test/response_samples.rb
101
125
  - test/test_helper.rb
102
126
  homepage: http://github.com/kickstarter/amazon_flex_pay
@@ -119,15 +143,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
143
  version: '0'
120
144
  requirements: []
121
145
  rubyforge_project:
122
- rubygems_version: 1.8.11
146
+ rubygems_version: 1.8.24
123
147
  signing_key:
124
148
  specification_version: 3
125
149
  summary: API layer for Amazon FPS
126
150
  test_files:
127
- - test/amazon_flex_pay_test.rb
128
- - test/api_test.rb
129
- - test/data_types_test.rb
130
- - test/pipelines_test.rb
151
+ - test/amazon_flex_pay/api/base_request_test.rb
152
+ - test/amazon_flex_pay/api_test.rb
153
+ - test/amazon_flex_pay/data_types_test.rb
154
+ - test/amazon_flex_pay/pipelines/base_test.rb
155
+ - test/amazon_flex_pay/pipelines_test.rb
156
+ - test/amazon_flex_pay/signature_test.rb
157
+ - test/amazon_flex_pay/util_test.rb
131
158
  - test/response_samples.rb
132
159
  - test/test_helper.rb
133
160
  has_rdoc:
@@ -1,179 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class AmazonFlexPayTest < AmazonFlexPay::Test
4
- ## signing
5
-
6
- should "generate a valid v2 signature" do
7
- # NOTE: I'm not sure of a supplied signature example that I can copy, so
8
- # I set this one up by making sure signatures were being accepted by
9
- # Amazon and then generating and saving my own example. Kinda backwards
10
- # but good enough for regression testing.
11
- assert_equal "Ro7iH0M+1hIR/SXGvT1kmF6Tg5uUKRSUd1AWaJHOcpE=", AmazonFlexPay.signature('http://example.com/api', {:hello => 'world'})
12
- end
13
-
14
- ## query strings
15
-
16
- should "create a sorted query string" do
17
- assert_equal "a=1&b=2&c=3&d=4&e=5", AmazonFlexPay.query_string(:a => 1, :b => 2, :c => 3, :d => 4, :e => 5)
18
- end
19
-
20
- should "flatten nested hashes into a query string using periods" do
21
- assert_equal "a.a=1&a.b=2&b=3", AmazonFlexPay.query_string(:b => 3, :a => {:a => 1, :b => 2})
22
- end
23
-
24
- should "percent-encode spaces and other characters for a query string" do
25
- assert_equal 'a=hello%20world%21', AmazonFlexPay.query_string(:a => 'hello world!')
26
- end
27
-
28
- ## verifying a request
29
-
30
- should "verify a GET request" do
31
- request = stub(:get? => true, :protocol => 'http://', :host_with_port => 'example.com', :path => '/foo/bar', :query_string => 'a=1&b=2')
32
- AmazonFlexPay.expects(:verify_signature).with('http://example.com/foo/bar', 'a=1&b=2').returns(true)
33
- assert AmazonFlexPay.verify_request(request)
34
- end
35
-
36
- should "verify a POST request" do
37
- request = stub(:get? => false, :protocol => 'http://', :host_with_port => 'example.com', :path => '/foo/bar', :raw_post => 'a=1&b=2')
38
- AmazonFlexPay.expects(:verify_signature).with('http://example.com/foo/bar', 'a=1&b=2').returns(true)
39
- assert AmazonFlexPay.verify_request(request)
40
- end
41
-
42
- # api basics
43
-
44
- class TestRequest < AmazonFlexPay::API::BaseRequest
45
- attribute :foo
46
- attribute :amount, :type => :amount
47
- attribute :stuffs, :collection => :amount
48
- attribute :method, :enumeration => :payment_method
49
-
50
- class Response < AmazonFlexPay::API::BaseRequest::BaseResponse; end
51
- end
52
-
53
- should "respond with data structures even when models are empty" do
54
- tr = TestRequest.new
55
- assert tr.stuffs.is_a?(Array)
56
- assert tr.amount.respond_to?(:value)
57
- assert !tr.to_hash.has_key?('Stuffs')
58
- assert !tr.to_hash.has_key?('Amount')
59
- end
60
-
61
- should "add necessary fields and sign api requests" do
62
- Time.stubs(:now).returns(Time.parse('Jan 1 2011')) # so the signature remains constant
63
-
64
- request = TestRequest.new(:foo => 'bar', :amount => {:value => '3.14', :currency_code => 'USD'})
65
- params = request.to_params
66
-
67
- # simple attributes
68
- assert_equal 'bar', params['Foo']
69
-
70
- # complex attributes
71
- assert_equal '3.14', params['Amount']['Value']
72
- assert_equal 'USD', params['Amount']['CurrencyCode']
73
-
74
- # standard additions
75
- assert_equal 'foo', params['AWSAccessKeyId']
76
- assert_equal 'TestRequest', params['Action']
77
- assert_equal '2011-09-20', params['Version']
78
-
79
- # the signature is backwards-calculated for regression testing
80
- assert_equal 'WVrkmK7qt/T+gtHWcdzqtkLRH8c06l/mPv3ZfxyvNyg=', params['Signature']
81
- assert_equal 'HmacSHA256', params['SignatureMethod']
82
- assert_equal 2, params['SignatureVersion']
83
- end
84
-
85
- should "store the request in the response" do
86
- RestClient.expects(:get).returns(stub(:body => cancel_token_response, :code => 200))
87
- response = TestRequest.new(:foo => 'bar').submit
88
- assert_equal 'bar', response.request.foo
89
- end
90
-
91
- should "instrument successful responses" do
92
- events = []
93
- callback = proc{ |*args| events << ActiveSupport::Notifications::Event.new(*args) }
94
-
95
- ActiveSupport::Notifications.subscribed(callback, "amazon_flex_pay.api") do
96
- RestClient.expects(:get).returns(stub(:body => cancel_token_response, :code => 200))
97
- TestRequest.new(:foo => 'bar').submit
98
- end
99
-
100
- assert_equal 1, events.size
101
- assert_equal 'TestRequest', events.first.payload[:action]
102
- assert_equal 200, events.first.payload[:code]
103
- assert events.first.payload.has_key?(:request)
104
- assert events.first.payload.has_key?(:response)
105
- assert events.first.duration > 0.1, events.first.duration.to_s
106
- end
107
-
108
- should "catch and parse errors" do
109
- net_http_res = stub(:code => 400)
110
- http_response = RestClient::Response.create(error_response, net_http_res, nil)
111
- RestClient.expects(:get).raises(RestClient::BadRequest.new(http_response))
112
-
113
- error = nil
114
- begin
115
- TestRequest.new(:foo => 'bar').submit
116
- rescue AmazonFlexPay::API::InvalidParams => e
117
- error = e
118
- end
119
- assert error.request_id
120
- assert_equal 'InvalidParams', error.code
121
- assert error.message.match(/has to be a valid/)
122
- end
123
-
124
- should "instrument error responses" do
125
- events = []
126
- callback = proc{ |*args| events << ActiveSupport::Notifications::Event.new(*args) }
127
-
128
- ActiveSupport::Notifications.subscribed(callback, "amazon_flex_pay.api") do
129
- net_http_res = stub(:code => 400)
130
- http_response = RestClient::Response.create(error_response, net_http_res, nil)
131
- RestClient.expects(:get).raises(RestClient::BadRequest.new(http_response))
132
-
133
- TestRequest.new(:foo => 'bar').submit rescue AmazonFlexPay::API::Error
134
- end
135
-
136
- assert_equal 1, events.size
137
- assert_equal 'TestRequest', events.first.payload[:action]
138
- assert_equal 400, events.first.payload[:code]
139
- assert events.first.payload.has_key?(:request)
140
- assert events.first.payload.has_key?(:response)
141
- assert events.first.duration > 0.1, events.first.duration.to_s
142
- end
143
-
144
- should "not allow unknown values for enumerated attributes" do
145
- assert_raises ArgumentError do TestRequest.new(:method => 'UNKOWN') end
146
- end
147
-
148
- should "allow value sets for enumerated attributes" do
149
- assert_nothing_raised do
150
- TestRequest.new(:method => ['CC', 'ACH'])
151
- end
152
- end
153
-
154
- should "convert value sets into comma-separated lists" do
155
- assert_equal 'a,b', TestRequest.new(:foo => ['a', 'b']).to_hash['Foo']
156
- end
157
-
158
- # pipeline basics
159
-
160
- class TestPipeline < AmazonFlexPay::Pipelines::Base
161
- attribute :foo
162
- end
163
-
164
- should "add necessary fields and sign pipeline urls" do
165
- Time.stubs(:now).returns(Time.parse('Jan 1 2011')) # so the signature remains constant
166
-
167
- pipeline = TestPipeline.new(:foo => 'bar')
168
- params = pipeline.to_params('http://example.com/return')
169
-
170
- assert_equal 'TestPipeline', params['pipelineName']
171
- assert_equal 'foo', params['callerKey']
172
- assert_equal '2009-01-09', params['version']
173
- assert_equal 'http://example.com/return', params['returnURL']
174
-
175
- assert_equal 2, params['signatureVersion']
176
- assert_equal 'HmacSHA256', params['signatureMethod']
177
- assert_equal 'OuUJQqFBJhezmcWOAhDGcsD/6OXpOLVlcbF3XMIZO3U=', params['signature']
178
- end
179
- end