harleytt-simplepay 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +25 -0
- data/Manifest.txt +50 -0
- data/README.rdoc +127 -0
- data/Rakefile +25 -0
- data/lib/simplepay.rb +27 -0
- data/lib/simplepay/authentication.rb +41 -0
- data/lib/simplepay/constants.rb +64 -0
- data/lib/simplepay/errors.rb +16 -0
- data/lib/simplepay/helpers/form_helper.rb +29 -0
- data/lib/simplepay/helpers/notification_helper.rb +54 -0
- data/lib/simplepay/helpers/rails_helper.rb +40 -0
- data/lib/simplepay/rails.rb +9 -0
- data/lib/simplepay/service.rb +133 -0
- data/lib/simplepay/services/donation.rb +91 -0
- data/lib/simplepay/services/marketplace.rb +89 -0
- data/lib/simplepay/services/marketplace_policy.rb +54 -0
- data/lib/simplepay/services/standard.rb +58 -0
- data/lib/simplepay/services/subscription.rb +96 -0
- data/lib/simplepay/support.rb +16 -0
- data/lib/simplepay/support/amount.rb +55 -0
- data/lib/simplepay/support/billing_frequency.rb +14 -0
- data/lib/simplepay/support/boolean.rb +28 -0
- data/lib/simplepay/support/currency.rb +21 -0
- data/lib/simplepay/support/epoch.rb +39 -0
- data/lib/simplepay/support/field.rb +147 -0
- data/lib/simplepay/support/interval.rb +143 -0
- data/lib/simplepay/support/simple_amount.rb +37 -0
- data/lib/simplepay/support/subscription_period.rb +25 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/simplepay.gemspec +41 -0
- data/test/simplepay/helpers/test_notifier.rb +32 -0
- data/test/simplepay/services/test_donation.rb +85 -0
- data/test/simplepay/services/test_marketplace.rb +85 -0
- data/test/simplepay/services/test_marketplace_policy.rb +52 -0
- data/test/simplepay/services/test_standard.rb +71 -0
- data/test/simplepay/services/test_subscription.rb +109 -0
- data/test/simplepay/support/test_amount.rb +46 -0
- data/test/simplepay/support/test_billing_frequency.rb +43 -0
- data/test/simplepay/support/test_boolean.rb +17 -0
- data/test/simplepay/support/test_epoch.rb +34 -0
- data/test/simplepay/support/test_field.rb +99 -0
- data/test/simplepay/support/test_interval.rb +92 -0
- data/test/simplepay/support/test_simple_amount.rb +28 -0
- data/test/simplepay/support/test_subscription_period.rb +49 -0
- data/test/simplepay/test_authentication.rb +25 -0
- data/test/simplepay/test_service.rb +118 -0
- data/test/test_helper.rb +87 -0
- data/test/test_simplepay.rb +11 -0
- metadata +184 -0
@@ -0,0 +1,109 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
require 'simplepay/services/subscription'
|
3
|
+
|
4
|
+
class Simplepay::Services::TestSubscription < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def self.model_class; Simplepay::Services::Subscription; end
|
7
|
+
|
8
|
+
context 'Simplepay::Services::Subscription' do
|
9
|
+
|
10
|
+
should_have_service_field :immediate_return,
|
11
|
+
:class => Simplepay::Support::Boolean,
|
12
|
+
:as => 'immediateReturn',
|
13
|
+
:required => false
|
14
|
+
|
15
|
+
should_have_service_field :number_of_promotion_transactions,
|
16
|
+
:as => 'noOfPromotionTransactions',
|
17
|
+
:required => false
|
18
|
+
|
19
|
+
should_have_service_field :start_date,
|
20
|
+
:class => Simplepay::Support::Epoch,
|
21
|
+
:as => 'recurringStartDate',
|
22
|
+
:required => false
|
23
|
+
|
24
|
+
should_have_service_field :collect_shipping_address,
|
25
|
+
:as => 'collectShippingAddress',
|
26
|
+
:required => false,
|
27
|
+
:class => Simplepay::Support::Boolean
|
28
|
+
|
29
|
+
should_have_service_field :promotion_amount,
|
30
|
+
:as => 'promotionAmount',
|
31
|
+
:required => false,
|
32
|
+
:class => Simplepay::Support::Amount
|
33
|
+
|
34
|
+
should_have_service_field :access_key,
|
35
|
+
:as => 'accessKey',
|
36
|
+
:required => true
|
37
|
+
|
38
|
+
should_have_service_field :subscription_period,
|
39
|
+
:as => 'subscriptionPeriod',
|
40
|
+
:required => false,
|
41
|
+
:class => Simplepay::Support::SubscriptionPeriod
|
42
|
+
|
43
|
+
should_have_service_field :reference_id,
|
44
|
+
:as => 'referenceId',
|
45
|
+
:required => false
|
46
|
+
|
47
|
+
should_have_service_field :recurring_frequency,
|
48
|
+
:as => 'recurringFrequency',
|
49
|
+
:required => true,
|
50
|
+
:class => Simplepay::Support::BillingFrequency
|
51
|
+
|
52
|
+
should_have_service_field :amount,
|
53
|
+
:as => 'amount',
|
54
|
+
:required => true,
|
55
|
+
:class => Simplepay::Support::Amount
|
56
|
+
|
57
|
+
should_have_service_field :variable_marketplace_fee,
|
58
|
+
:as => 'variableMarketplaceFee',
|
59
|
+
:required => false
|
60
|
+
|
61
|
+
should_have_service_field :signature,
|
62
|
+
:as => 'signature',
|
63
|
+
:required => true
|
64
|
+
|
65
|
+
should_have_service_field :donation_widget,
|
66
|
+
:as => 'isDonationWidget',
|
67
|
+
:required => false
|
68
|
+
|
69
|
+
should_have_service_field :fixed_marketplace_fee,
|
70
|
+
:as => 'fixedMarketplaceFee',
|
71
|
+
:required => false
|
72
|
+
|
73
|
+
should_have_service_field :auto_renew,
|
74
|
+
:as => 'isAutoRenewal',
|
75
|
+
:required => false,
|
76
|
+
:class => Simplepay::Support::Boolean
|
77
|
+
|
78
|
+
should_have_service_field :description,
|
79
|
+
:as => 'description',
|
80
|
+
:required => true
|
81
|
+
|
82
|
+
should_have_service_field :account_id,
|
83
|
+
:as => 'amazonPaymentsAccountId',
|
84
|
+
:required => true
|
85
|
+
|
86
|
+
should_have_service_field :ipn_url,
|
87
|
+
:as => 'ipnUrl',
|
88
|
+
:required => false
|
89
|
+
|
90
|
+
should_have_service_field :return_url,
|
91
|
+
:as => 'returnUrl',
|
92
|
+
:required => false
|
93
|
+
|
94
|
+
should_have_service_field :process_immediately,
|
95
|
+
:as => 'processImmediate',
|
96
|
+
:required => false,
|
97
|
+
:class => Simplepay::Support::Boolean
|
98
|
+
|
99
|
+
should_have_service_field :cobranding_style,
|
100
|
+
:as => 'cobrandingStyle',
|
101
|
+
:required => true
|
102
|
+
|
103
|
+
should_have_service_field :abandon_url,
|
104
|
+
:as => 'abandonUrl',
|
105
|
+
:required => false
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
require 'simplepay/support/amount'
|
3
|
+
|
4
|
+
class Simplepay::Support::TestAmount < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context 'Simplepay::Support::Amount' do
|
7
|
+
|
8
|
+
should 'convert to Amazon formatted string' do
|
9
|
+
assert_equal 'USD 5.00', new_amount(5).to_s
|
10
|
+
assert_equal 'USD 6.10', new_amount(6.1).to_s
|
11
|
+
assert_equal 'USD 5.25', new_amount(5.25).to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'raise an error for negative amounts' do
|
15
|
+
assert_raise(ArgumentError) { new_amount(-1) }
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'be able to set your desired currency by code' do
|
19
|
+
amount = new_amount(1, 'USD')
|
20
|
+
assert_equal 'USD', amount.currency.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'raise an error when using an unrecognized currency code' do
|
24
|
+
assert_raise(ArgumentError) { new_amount(1, 'BADCURRENCYCODE') }
|
25
|
+
end
|
26
|
+
|
27
|
+
should 'be able to use a custom currency by object' do
|
28
|
+
custom = Simplepay::Support::Currency.new('Test Currency', 'TEST', "%d")
|
29
|
+
amount = new_amount(1, custom)
|
30
|
+
assert_equal custom, amount.currency
|
31
|
+
assert_equal "TEST 1", amount.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
|
40
|
+
def new_amount(amount, currency = nil)
|
41
|
+
currency ?
|
42
|
+
Simplepay::Support::Amount.new(amount, currency) :
|
43
|
+
Simplepay::Support::Amount.new(amount)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
require 'simplepay/support/billing_frequency'
|
3
|
+
|
4
|
+
class Simplepay::Support::TestBillingFrequency < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context 'Simplepay::Support::BillingFrequency' do
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@interval = Simplepay::Support::BillingFrequency.new
|
10
|
+
end
|
11
|
+
|
12
|
+
should 'not set default values' do
|
13
|
+
assert_nil @interval.interval
|
14
|
+
assert_nil @interval.quantity
|
15
|
+
end
|
16
|
+
|
17
|
+
should 'only allow defined intervals' do
|
18
|
+
intervals = ['day', 'week', 'month', 'year']
|
19
|
+
added = @interval.class.allowed_intervals - intervals
|
20
|
+
missed = intervals - @interval.class.allowed_intervals
|
21
|
+
assert added.empty?, "#{@interval.class.name} defines unexpected intervals: #{added.inspect}"
|
22
|
+
assert missed.empty?, "#{@interval.class.name} failed to define expected intervals: #{missed.inspect}"
|
23
|
+
end
|
24
|
+
|
25
|
+
should 'limit quantities to two digits' do
|
26
|
+
assert_raise(ArgumentError) { @interval.quantity = 100 }
|
27
|
+
end
|
28
|
+
|
29
|
+
should 'disallow 0 quantity' do
|
30
|
+
assert_raise(ArgumentError) { @interval.quantity = 0 }
|
31
|
+
end
|
32
|
+
|
33
|
+
should 'disallow negative quantities' do
|
34
|
+
assert_raise(ArgumentError) { @interval.quantity = -1 }
|
35
|
+
end
|
36
|
+
|
37
|
+
should 'convert to String' do
|
38
|
+
assert_equal '5 year', @interval.class.new(5, 'year').to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
class Simplepay::Support::BooleanTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context 'Simplepay::Support::Boolean' do
|
6
|
+
|
7
|
+
should 'use "1" for true' do
|
8
|
+
assert_equal '1', Simplepay::Support::Boolean.new(true).to_s
|
9
|
+
end
|
10
|
+
|
11
|
+
should 'use "0" for false' do
|
12
|
+
assert_equal '0', Simplepay::Support::Boolean.new(false).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
require 'simplepay/support/epoch'
|
3
|
+
|
4
|
+
class Simplepay::Support::TestEpoch < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "Simplepay::Support::Epoch" do
|
7
|
+
|
8
|
+
should 'return time as an integer' do
|
9
|
+
time = Time.now
|
10
|
+
assert_equal time.to_i.to_s, new_epoch(time).to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
should 'parse a given string for Time' do
|
14
|
+
assert_equal "1199150625", new_epoch("2008-01-01 01:23:45Z").to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
should 'represent seconds since January 1, 1970' do
|
18
|
+
time = Time.parse("1970-01-01 00:00:00Z")
|
19
|
+
now = Time.now
|
20
|
+
seconds = (now - time).to_i
|
21
|
+
assert_equal seconds.to_s, new_epoch(now).to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
|
30
|
+
def new_epoch(value)
|
31
|
+
Simplepay::Support::Epoch.new(value)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
require 'simplepay/support/field'
|
3
|
+
|
4
|
+
class DelegateTest
|
5
|
+
def initialize(v); end
|
6
|
+
def to_s; end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Simplepay::Support::TestField < Test::Unit::TestCase
|
10
|
+
|
11
|
+
context 'Simplepay::Support::Field' do
|
12
|
+
|
13
|
+
should 'raise error for invalid options' do
|
14
|
+
assert_raise(Simplepay::InvalidOptions) { new_field(:bad, {:bad_field => 'foo'}) }
|
15
|
+
end
|
16
|
+
|
17
|
+
should 'set the value via options' do
|
18
|
+
assert_equal 'set value', new_field(:test, :value => 'set value').value
|
19
|
+
end
|
20
|
+
|
21
|
+
should 'camelize the service name when given a symbol' do
|
22
|
+
assert_equal 'testField', new_field(:test_field).service_name
|
23
|
+
end
|
24
|
+
|
25
|
+
should 'use the given string name as service name' do
|
26
|
+
assert_equal 'TestField', new_field('TestField').service_name
|
27
|
+
assert_equal 'test_field', new_field('test_field').service_name
|
28
|
+
end
|
29
|
+
|
30
|
+
should 'use the :as option to override the service name' do
|
31
|
+
assert_equal 'Overridden', new_field(:original, :as => 'Overridden').service_name
|
32
|
+
end
|
33
|
+
|
34
|
+
should 'use the service name when converted to String' do
|
35
|
+
field = new_field(:test_field)
|
36
|
+
assert_equal field.service_name, field.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
should 'not be required by default' do
|
40
|
+
assert !new_field(:optional_field).required?
|
41
|
+
end
|
42
|
+
|
43
|
+
should 'be required' do
|
44
|
+
assert new_field(:required_field, :required => true).required?
|
45
|
+
end
|
46
|
+
|
47
|
+
should 'change the service parent for cloned objects' do
|
48
|
+
field1 = new_field(:clone)
|
49
|
+
field2 = field1.clone_for(new_service)
|
50
|
+
assert_equal field1.name, field2.name
|
51
|
+
assert_equal field1.value, field2.value
|
52
|
+
assert_not_equal field1.service, field2.service
|
53
|
+
end
|
54
|
+
|
55
|
+
should 'be equivalent' do
|
56
|
+
field1 = new_field(:equal, {})
|
57
|
+
field2 = new_field(:equal, {}, field1.service)
|
58
|
+
assert_equal field1, field2
|
59
|
+
end
|
60
|
+
|
61
|
+
should 'not be equivalent' do
|
62
|
+
field1 = new_field(:equal, {}, new_service)
|
63
|
+
field2 = new_field(:equal, {}, new_service)
|
64
|
+
assert_not_equal field1, field2
|
65
|
+
end
|
66
|
+
|
67
|
+
should 'correctly sort' do
|
68
|
+
fielda, fieldb, fieldc = new_field(:a), new_field(:b), new_field(:c)
|
69
|
+
assert_equal [fielda, fieldb, fieldc], [fieldc, fielda, fieldb].sort
|
70
|
+
end
|
71
|
+
|
72
|
+
should 'pass itself as a proc parameter if value is a proc' do
|
73
|
+
field = new_field(:test, {:value => Proc.new { |f| f}})
|
74
|
+
assert_equal field, field.value
|
75
|
+
end
|
76
|
+
|
77
|
+
should 'be able to delegate value handling to another class' do
|
78
|
+
delegate = DelegateTest.new('foo')
|
79
|
+
DelegateTest.expects(:new).with('foo').once.returns(delegate)
|
80
|
+
delegate.expects(:to_s).times(2).returns('mocked')
|
81
|
+
field = new_field(:delegated, {:class => DelegateTest, :value => 'foo'})
|
82
|
+
assert_equal delegate.to_s, field.value
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
|
91
|
+
def new_field(name, options = {}, service = new_service)
|
92
|
+
Simplepay::Support::Field.new(service, name, options)
|
93
|
+
end
|
94
|
+
|
95
|
+
def new_service
|
96
|
+
Simplepay::Service.new
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
require 'simplepay/support/interval'
|
3
|
+
|
4
|
+
class TestInterval < Simplepay::Support::Interval
|
5
|
+
ALLOWED_QUANTITY_RANGE = (1..200)
|
6
|
+
ALLOWED_INTERVALS = ['testinterval', 'testinterval2']
|
7
|
+
DEFAULT_QUANTITY = 3
|
8
|
+
DEFAULT_INTERVAL = 'testinterval'
|
9
|
+
end
|
10
|
+
|
11
|
+
class Simplepay::Support::TestInterval < Test::Unit::TestCase
|
12
|
+
|
13
|
+
context 'Simplepay::Support::Interval' do
|
14
|
+
|
15
|
+
setup do
|
16
|
+
@interval = TestInterval.new
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'set the default quantity' do
|
20
|
+
assert_equal 3, @interval.quantity
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'set the default interval' do
|
24
|
+
assert_equal 'testinterval', @interval.interval
|
25
|
+
end
|
26
|
+
|
27
|
+
should 'properly convert to string' do
|
28
|
+
assert_equal '3 testinterval', @interval.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
should 'return nil with converted to a string with no interval set' do
|
32
|
+
@interval.interval = nil
|
33
|
+
assert_nil @interval.to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
should 'raise an error for quantities outside of the allowed range' do
|
37
|
+
assert_raises(ArgumentError) {
|
38
|
+
@interval.quantity = @interval.class.allowed_quantity_range.last + 1
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
should 'accept valid quantities' do
|
43
|
+
assert_nothing_raised(Exception) {
|
44
|
+
@interval.quantity = @interval.class.allowed_quantity_range.first
|
45
|
+
@interval.quantity = @interval.class.allowed_quantity_range.first + 1
|
46
|
+
@interval.quantity = @interval.class.allowed_quantity_range.last - 1
|
47
|
+
@interval.quantity = @interval.class.allowed_quantity_range.last
|
48
|
+
}
|
49
|
+
assert_equal @interval.class.allowed_quantity_range.last, @interval.quantity
|
50
|
+
end
|
51
|
+
|
52
|
+
should 'raise an error for intervals which are not allowed' do
|
53
|
+
assert_raises(ArgumentError) {
|
54
|
+
@interval.interval = 'badtestinterval'
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
should 'accept valid intervals' do
|
59
|
+
assert_nothing_raised(Exception) {
|
60
|
+
@interval.interval = @interval.class.allowed_intervals.first
|
61
|
+
@interval.interval = @interval.class.allowed_intervals.last
|
62
|
+
}
|
63
|
+
assert_equal @interval.class.allowed_intervals.last, @interval.interval
|
64
|
+
end
|
65
|
+
|
66
|
+
should 'be definable by string' do
|
67
|
+
interval = TestInterval.new("5 testinterval2")
|
68
|
+
assert_equal 5, interval.quantity
|
69
|
+
assert_equal 'testinterval2', interval.interval
|
70
|
+
end
|
71
|
+
|
72
|
+
should 'raise an error for an improperly formatted string' do
|
73
|
+
assert_raise(ArgumentError) {
|
74
|
+
TestInterval.new("Bad String")
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
should 'be definable by parameter' do
|
79
|
+
interval = TestInterval.new(5, 'testinterval2')
|
80
|
+
assert_equal 5, interval.quantity
|
81
|
+
assert_equal 'testinterval2', interval.interval
|
82
|
+
end
|
83
|
+
|
84
|
+
should 'be definable by a hash' do
|
85
|
+
interval = TestInterval.new({:quantity => 5, :interval => 'testinterval2'})
|
86
|
+
assert_equal 5, interval.quantity
|
87
|
+
assert_equal 'testinterval2', interval.interval
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|