bborn-simplepay 0.2.2
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.
- 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
|