mollie-api-ruby 2.1.0 → 2.2.0

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -2
  3. data/CHANGELOG.md +4 -0
  4. data/{README.mdown → README.md} +8 -8
  5. data/examples/1-new-payment.rb +4 -2
  6. data/examples/4-ideal-payment.rb +4 -2
  7. data/lib/mollie/api/client.rb +32 -13
  8. data/lib/mollie/api/client/version.rb +1 -1
  9. data/lib/mollie/api/object/customer/mandate.rb +37 -0
  10. data/lib/mollie/api/object/customer/subscription.rb +69 -0
  11. data/lib/mollie/api/object/organization.rb +28 -0
  12. data/lib/mollie/api/object/permission.rb +12 -0
  13. data/lib/mollie/api/object/profile.rb +78 -0
  14. data/lib/mollie/api/object/profile/apikey.rb +23 -0
  15. data/lib/mollie/api/object/settlement.rb +32 -0
  16. data/lib/mollie/api/resource/customers/mandates.rb +1 -1
  17. data/lib/mollie/api/resource/customers/subscriptions.rb +1 -1
  18. data/lib/mollie/api/resource/organizations.rb +11 -0
  19. data/lib/mollie/api/resource/permissions.rb +11 -0
  20. data/lib/mollie/api/resource/profiles.rb +11 -0
  21. data/lib/mollie/api/resource/profiles/apikeys.rb +27 -0
  22. data/lib/mollie/api/resource/settlements.rb +11 -0
  23. data/lib/mollie/api/util.rb +46 -30
  24. data/test/mollie/api/client_test.rb +9 -4
  25. data/test/mollie/api/object/customer/mandate_test.rb +47 -0
  26. data/test/mollie/api/object/customer/subscription_test.rb +70 -0
  27. data/test/mollie/api/object/organization_test.rb +51 -0
  28. data/test/mollie/api/object/permission_test.rb +25 -0
  29. data/test/mollie/api/object/profile/apikey_test.rb +35 -0
  30. data/test/mollie/api/object/profile_test.rb +72 -0
  31. data/test/mollie/api/object/settlement_test.rb +140 -0
  32. data/test/mollie/api/resource/customers/mandates_test.rb +1 -1
  33. data/test/mollie/api/resource/customers/subscriptions_test.rb +1 -1
  34. data/test/mollie/api/resource/organizations_test.rb +13 -0
  35. data/test/mollie/api/resource/permissions_test.rb +13 -0
  36. data/test/mollie/api/resource/profiles/apikeys_test.rb +23 -0
  37. data/test/mollie/api/resource/profiles_test.rb +13 -0
  38. data/test/mollie/api/resource/settlements_test.rb +13 -0
  39. data/test/mollie/api/util_test.rb +47 -0
  40. metadata +42 -10
  41. data/lib/mollie/api/object/mandate.rb +0 -35
  42. data/lib/mollie/api/object/subscription.rb +0 -67
  43. data/test/mollie/api/object/mandate_test.rb +0 -45
  44. data/test/mollie/api/object/subscription_test.rb +0 -68
@@ -0,0 +1,32 @@
1
+ module Mollie
2
+ module API
3
+ module Object
4
+ class Settlement < Base
5
+ attr_accessor :id,
6
+ :reference,
7
+ :settled_datetime,
8
+ :amount,
9
+ :periods,
10
+ :payment_ids,
11
+ :refund_ids,
12
+ :links
13
+
14
+ def settled_datetime=(settled_datetime)
15
+ @settled_datetime = Time.parse(settled_datetime.to_s) rescue nil
16
+ end
17
+
18
+ def amount=(amount)
19
+ @amount = BigDecimal.new(amount.to_s) if amount
20
+ end
21
+
22
+ def periods=(periods)
23
+ @periods = Util.nested_openstruct(periods) if periods.is_a?(Hash)
24
+ end
25
+
26
+ def payments
27
+ links && links['payments']
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -8,7 +8,7 @@ module Mollie
8
8
  @customer_id = nil
9
9
 
10
10
  def resource_object
11
- Object::Mandate
11
+ Object::Customer::Mandate
12
12
  end
13
13
 
14
14
  def resource_name
@@ -8,7 +8,7 @@ module Mollie
8
8
  @customer_id = nil
9
9
 
10
10
  def resource_object
11
- Object::Subscription
11
+ Object::Customer::Subscription
12
12
  end
13
13
 
14
14
  def resource_name
@@ -0,0 +1,11 @@
1
+ module Mollie
2
+ module API
3
+ module Resource
4
+ class Organizations < Base
5
+ def resource_object
6
+ Object::Organization
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Mollie
2
+ module API
3
+ module Resource
4
+ class Permissions < Base
5
+ def resource_object
6
+ Object::Permission
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Mollie
2
+ module API
3
+ module Resource
4
+ class Profiles < Base
5
+ def resource_object
6
+ Object::Profile
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ require 'open-uri'
2
+
3
+ module Mollie
4
+ module API
5
+ module Resource
6
+ class Profiles
7
+ class ApiKeys < Base
8
+ @profile_id = nil
9
+
10
+ def resource_object
11
+ Object::Profile::ApiKey
12
+ end
13
+
14
+ def resource_name
15
+ profile_id = URI::encode(@profile_id)
16
+ "profiles/#{profile_id}/apikeys"
17
+ end
18
+
19
+ def with(profile_or_id)
20
+ @profile_id = profile_or_id.is_a?(Object::Profile) ? profile_or_id.id : profile_or_id
21
+ self
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ module Mollie
2
+ module API
3
+ module Resource
4
+ class Settlements < Base
5
+ def resource_object
6
+ Object::Settlement
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,37 +1,53 @@
1
- module Util
2
- extend self
1
+ module Mollie
2
+ module API
3
+ module Util
4
+ extend self
3
5
 
4
- def nested_underscore_keys(hash)
5
- hash.each_with_object({}) do |(key, value), underscored|
6
- if value.is_a?(Hash)
7
- underscored[underscore(key)] = nested_underscore_keys(value)
8
- elsif value.is_a?(Array)
9
- underscored[underscore(key)] = value.map { |v| nested_underscore_keys(v) }
10
- else
11
- underscored[underscore(key)] = value
6
+ def nested_underscore_keys(obj)
7
+ if obj.is_a?(Hash)
8
+ obj.each_with_object({}) do |(key, value), underscored|
9
+ underscored[underscore(key)] = nested_underscore_keys(value)
10
+ end
11
+ elsif obj.is_a?(Array)
12
+ obj.map { |v| nested_underscore_keys(v) }
13
+ else
14
+ obj
15
+ end
12
16
  end
13
- end
14
- end
15
17
 
16
- def camelize_keys(hash)
17
- hash.each_with_object({}) do |(key, value), camelized|
18
- camelized[camelize(key)] = value
19
- end
20
- end
18
+ def camelize_keys(hash)
19
+ hash.each_with_object({}) do |(key, value), camelized|
20
+ camelized[camelize(key)] = value
21
+ end
22
+ end
21
23
 
22
- def underscore(string)
23
- string.to_s.gsub(/::/, '/').
24
- gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
25
- gsub(/([a-z\d])([A-Z])/, '\1_\2').
26
- tr("-", "_").
27
- downcase.to_s
28
- end
24
+ def underscore(string)
25
+ string.to_s.gsub(/::/, '/').
26
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
27
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
28
+ tr("-", "_").
29
+ downcase.to_s
30
+ end
31
+
32
+ def camelize(term)
33
+ string = term.to_s
34
+ string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { |match| match.downcase }
35
+ string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }
36
+ string.gsub!('/'.freeze, '::'.freeze)
37
+ string
38
+ end
29
39
 
30
- def camelize(term)
31
- string = term.to_s
32
- string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { |match| match.downcase }
33
- string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }
34
- string.gsub!('/'.freeze, '::'.freeze)
35
- string
40
+ def nested_openstruct(obj)
41
+ if obj.is_a?(Hash)
42
+ obj.each_with_object(OpenStruct.new) do |(key, value), openstructed|
43
+ openstructed[key] = nested_openstruct(value)
44
+ end
45
+ elsif obj.is_a?(Array)
46
+ obj.map { |v| nested_openstruct(v) }
47
+ else
48
+ obj
49
+ end
50
+ end
51
+ end
36
52
  end
37
53
  end
@@ -10,14 +10,19 @@ module Mollie
10
10
  def test_initialize
11
11
  assert_equal "test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM", client.api_key
12
12
 
13
- assert_kind_of Mollie::API::Resource::Payments, client.payments
14
- assert_kind_of Mollie::API::Resource::Issuers, client.issuers
15
- assert_kind_of Mollie::API::Resource::Methods, client.methods
16
- assert_kind_of Mollie::API::Resource::Payments::Refunds, client.payments_refunds
17
13
  assert_kind_of Mollie::API::Resource::Customers, client.customers
18
14
  assert_kind_of Mollie::API::Resource::Customers::Payments, client.customers_payments
19
15
  assert_kind_of Mollie::API::Resource::Customers::Mandates, client.customers_mandates
20
16
  assert_kind_of Mollie::API::Resource::Customers::Subscriptions, client.customers_subscriptions
17
+ assert_kind_of Mollie::API::Resource::Issuers, client.issuers
18
+ assert_kind_of Mollie::API::Resource::Methods, client.methods
19
+ assert_kind_of Mollie::API::Resource::Organizations, client.organizations
20
+ assert_kind_of Mollie::API::Resource::Payments, client.payments
21
+ assert_kind_of Mollie::API::Resource::Payments::Refunds, client.payments_refunds
22
+ assert_kind_of Mollie::API::Resource::Permissions, client.permissions
23
+ assert_kind_of Mollie::API::Resource::Profiles, client.profiles
24
+ assert_kind_of Mollie::API::Resource::Profiles::ApiKeys, client.profiles_api_keys
25
+ assert_kind_of Mollie::API::Resource::Settlements, client.settlements
21
26
  end
22
27
 
23
28
  def test_setting_the_api_endpoint
@@ -0,0 +1,47 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class Customer
7
+ class MandateTest < Test::Unit::TestCase
8
+ def test_setting_attributes
9
+ attributes = {
10
+ id: "mdt_qtUgejVgMN",
11
+ status: "valid",
12
+ method: "creditcard",
13
+ customer_id: "cst_R6JLAuqEgm",
14
+ details: {
15
+ card_holder: "John Doe",
16
+ card_expiry_date: "2016-03-31"
17
+ },
18
+ created_datetime: "2016-04-13T11:32:38.0Z"
19
+ }
20
+
21
+ mandate = Mandate.new(attributes)
22
+
23
+ assert_equal 'mdt_qtUgejVgMN', mandate.id
24
+ assert_equal 'valid', mandate.status
25
+ assert_equal 'creditcard', mandate.method
26
+ assert_equal 'cst_R6JLAuqEgm', mandate.customer_id
27
+ assert_equal Time.parse('2016-04-13T11:32:38.0Z'), mandate.created_datetime
28
+
29
+ assert_equal 'John Doe', mandate.details.card_holder
30
+ assert_equal '2016-03-31', mandate.details.card_expiry_date
31
+ assert_equal nil, mandate.details.non_existing
32
+ end
33
+
34
+ def test_valid_invalid
35
+ mandate = Mandate.new(status: Mandate::STATUS_VALID)
36
+ assert mandate.valid?
37
+ assert !mandate.invalid?
38
+
39
+ mandate = Mandate.new(status: Mandate::STATUS_INVALID)
40
+ assert !mandate.valid?
41
+ assert mandate.invalid?
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,70 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class Customer
7
+ class SubscriptionTest < Test::Unit::TestCase
8
+ def test_setting_attributes
9
+ attributes = {
10
+ id: "sub_rVKGtNd6s3",
11
+ customer_id: "cst_stTC2WHAuS",
12
+ mode: "live",
13
+ created_datetime: "2016-06-01T12:23:34.0Z",
14
+ status: "active",
15
+ amount: "25.00",
16
+ times: 4,
17
+ interval: "3 months",
18
+ description: "Quarterly payment",
19
+ method: "creditcard",
20
+ cancelled_datetime: "2016-06-01T12:23:34.0Z",
21
+ links: {
22
+ 'webhook_url' => "https://example.org/payments/webhook"
23
+ }
24
+ }
25
+
26
+ subscription = Subscription.new(attributes)
27
+
28
+ assert_equal "sub_rVKGtNd6s3", subscription.id
29
+ assert_equal "cst_stTC2WHAuS", subscription.customer_id
30
+ assert_equal "live", subscription.mode
31
+ assert_equal Time.parse("2016-06-01T12:23:34.0Z"), subscription.created_datetime
32
+ assert_equal "active", subscription.status
33
+ assert_equal BigDecimal.new(25, 2), subscription.amount
34
+ assert_equal 4, subscription.times
35
+ assert_equal "3 months", subscription.interval
36
+ assert_equal "Quarterly payment", subscription.description
37
+ assert_equal "creditcard", subscription.method
38
+ assert_equal Time.parse("2016-06-01T12:23:34.0Z"), subscription.cancelled_datetime
39
+ assert_equal "https://example.org/payments/webhook", subscription.webhook_url
40
+ end
41
+
42
+ def test_status_active
43
+ assert Subscription.new(status: Subscription::STATUS_ACTIVE).active?
44
+ assert !Subscription.new(status: 'not-active').active?
45
+ end
46
+
47
+ def test_status_pending
48
+ assert Subscription.new(status: Subscription::STATUS_PENDING).pending?
49
+ assert !Subscription.new(status: 'not-pending').pending?
50
+ end
51
+
52
+ def test_status_suspended
53
+ assert Subscription.new(status: Subscription::STATUS_SUSPENDED).suspended?
54
+ assert !Subscription.new(status: 'not-suspended').suspended?
55
+ end
56
+
57
+ def test_status_cancelled
58
+ assert Subscription.new(status: Subscription::STATUS_CANCELLED).cancelled?
59
+ assert !Subscription.new(status: 'not-cancelled').cancelled?
60
+ end
61
+
62
+ def test_status_completed
63
+ assert Subscription.new(status: Subscription::STATUS_COMPLETED).completed?
64
+ assert !Subscription.new(status: 'not-completed').completed?
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,51 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class OrganizationTest < Test::Unit::TestCase
7
+ def test_setting_attributes
8
+ attributes = {
9
+ id: 'org_1234567',
10
+ name: 'Mollie B.V.',
11
+ email: 'info@mollie.com',
12
+ address: 'Keizersgracht 313',
13
+ postal_code: '1016EE',
14
+ city: 'Amsterdam',
15
+ country: 'Netherlands',
16
+ country_code: 'NL',
17
+ registration_type: 'bv',
18
+ registration_number: '30204462',
19
+ registration_datetime: '2004-04-01T09:41:00.0Z',
20
+ verified_datetime: '2007-06-29T09:41:00.0Z'
21
+ }
22
+
23
+ organization = Organization.new(attributes)
24
+
25
+ assert_equal 'org_1234567', organization.id
26
+ assert_equal 'Mollie B.V.', organization.name
27
+ assert_equal 'info@mollie.com', organization.email
28
+ assert_equal 'Keizersgracht 313', organization.address
29
+ assert_equal '1016EE', organization.postal_code
30
+ assert_equal 'Amsterdam', organization.city
31
+ assert_equal 'Netherlands', organization.country
32
+ assert_equal 'NL', organization.country_code
33
+ assert_equal 'bv', organization.registration_type
34
+ assert_equal '30204462', organization.registration_number
35
+ assert_equal Time.parse('2004-04-01T09:41:00.0Z'), organization.registration_datetime
36
+ assert_equal Time.parse('2007-06-29T09:41:00.0Z'), organization.verified_datetime
37
+ end
38
+
39
+ def test_registration_datetime_required
40
+ assert_raise ArgumentError.new('no time information in ""') do
41
+ Organization.new(registration_datetime: nil)
42
+ end
43
+ end
44
+
45
+ def test_verified_datetime_optional
46
+ assert_equal nil, Organization.new(verified_datetime: nil).verified_datetime
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,25 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class PermissionTest < Test::Unit::TestCase
7
+ def test_setting_attributes
8
+ attributes = {
9
+ id: 'payments.read',
10
+ description: 'View your payments',
11
+ warning: nil,
12
+ granted: true
13
+ }
14
+
15
+ permission = Permission.new(attributes)
16
+
17
+ assert_equal 'payments.read', permission.id
18
+ assert_equal 'View your payments', permission.description
19
+ assert_equal nil, permission.warning
20
+ assert_equal true, permission.granted
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class Profile
7
+ class ApiKeyTest < Test::Unit::TestCase
8
+ def test_setting_attributes
9
+ attributes = {
10
+ id: "live",
11
+ key: "live_eSf9fQRwpsdfPY8y3tUFFmqjADRKyA",
12
+ created_datetime: "2017-04-20T12:19:48.0Z"
13
+ }
14
+
15
+ api_key = ApiKey.new(attributes)
16
+
17
+ assert_equal Mollie::API::Client::MODE_LIVE, api_key.id
18
+ assert_equal "live_eSf9fQRwpsdfPY8y3tUFFmqjADRKyA", api_key.key
19
+ assert_equal Time.parse("2017-04-20T12:19:48.0Z"), api_key.created_datetime
20
+ end
21
+
22
+ def test_testmode
23
+ assert ApiKey.new(id: Mollie::API::Client::MODE_TEST).testmode?
24
+ assert !ApiKey.new(id: 'not-test').testmode?
25
+ end
26
+
27
+ def test_livemode
28
+ assert ApiKey.new(id: Mollie::API::Client::MODE_LIVE).livemode?
29
+ assert !ApiKey.new(id: 'not-live').livemode?
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end