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.
Files changed (51) hide show
  1. data/History.txt +25 -0
  2. data/Manifest.txt +50 -0
  3. data/README.rdoc +127 -0
  4. data/Rakefile +25 -0
  5. data/lib/simplepay.rb +27 -0
  6. data/lib/simplepay/authentication.rb +41 -0
  7. data/lib/simplepay/constants.rb +64 -0
  8. data/lib/simplepay/errors.rb +16 -0
  9. data/lib/simplepay/helpers/form_helper.rb +29 -0
  10. data/lib/simplepay/helpers/notification_helper.rb +54 -0
  11. data/lib/simplepay/helpers/rails_helper.rb +40 -0
  12. data/lib/simplepay/rails.rb +9 -0
  13. data/lib/simplepay/service.rb +133 -0
  14. data/lib/simplepay/services/donation.rb +91 -0
  15. data/lib/simplepay/services/marketplace.rb +89 -0
  16. data/lib/simplepay/services/marketplace_policy.rb +54 -0
  17. data/lib/simplepay/services/standard.rb +58 -0
  18. data/lib/simplepay/services/subscription.rb +96 -0
  19. data/lib/simplepay/support.rb +16 -0
  20. data/lib/simplepay/support/amount.rb +55 -0
  21. data/lib/simplepay/support/billing_frequency.rb +14 -0
  22. data/lib/simplepay/support/boolean.rb +28 -0
  23. data/lib/simplepay/support/currency.rb +21 -0
  24. data/lib/simplepay/support/epoch.rb +39 -0
  25. data/lib/simplepay/support/field.rb +147 -0
  26. data/lib/simplepay/support/interval.rb +143 -0
  27. data/lib/simplepay/support/simple_amount.rb +37 -0
  28. data/lib/simplepay/support/subscription_period.rb +25 -0
  29. data/script/console +10 -0
  30. data/script/destroy +14 -0
  31. data/script/generate +14 -0
  32. data/simplepay.gemspec +41 -0
  33. data/test/simplepay/helpers/test_notifier.rb +32 -0
  34. data/test/simplepay/services/test_donation.rb +85 -0
  35. data/test/simplepay/services/test_marketplace.rb +85 -0
  36. data/test/simplepay/services/test_marketplace_policy.rb +52 -0
  37. data/test/simplepay/services/test_standard.rb +71 -0
  38. data/test/simplepay/services/test_subscription.rb +109 -0
  39. data/test/simplepay/support/test_amount.rb +46 -0
  40. data/test/simplepay/support/test_billing_frequency.rb +43 -0
  41. data/test/simplepay/support/test_boolean.rb +17 -0
  42. data/test/simplepay/support/test_epoch.rb +34 -0
  43. data/test/simplepay/support/test_field.rb +99 -0
  44. data/test/simplepay/support/test_interval.rb +92 -0
  45. data/test/simplepay/support/test_simple_amount.rb +28 -0
  46. data/test/simplepay/support/test_subscription_period.rb +49 -0
  47. data/test/simplepay/test_authentication.rb +25 -0
  48. data/test/simplepay/test_service.rb +118 -0
  49. data/test/test_helper.rb +87 -0
  50. data/test/test_simplepay.rb +11 -0
  51. 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