mollie-api-ruby 1.4.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +12 -0
  3. data/CHANGELOG.md +6 -0
  4. data/README.mdown +5 -5
  5. data/Rakefile +6 -0
  6. data/examples/1-new-payment.rb +4 -5
  7. data/examples/2-webhook-verification.rb +2 -2
  8. data/examples/4-ideal-payment.rb +3 -3
  9. data/examples/5-payments-history.rb +3 -3
  10. data/examples/6-list-activated-methods.rb +3 -3
  11. data/examples/7-refund-payment.rb +5 -5
  12. data/lib/{Mollie/API → mollie/api}/cacert.pem +0 -0
  13. data/lib/mollie/api/client.rb +120 -0
  14. data/lib/{Mollie/API/Client/Version.rb → mollie/api/client/version.rb} +1 -1
  15. data/lib/{Mollie/API/Exception.rb → mollie/api/exception.rb} +0 -0
  16. data/lib/mollie/api/object/base.rb +18 -0
  17. data/lib/mollie/api/object/customer.rb +28 -0
  18. data/lib/{Mollie/API/Object/Issuer.rb → mollie/api/object/issuer.rb} +1 -3
  19. data/lib/mollie/api/object/list.rb +44 -0
  20. data/lib/mollie/api/object/mandate.rb +35 -0
  21. data/lib/{Mollie/API/Object/Method.rb → mollie/api/object/method.rb} +12 -4
  22. data/lib/mollie/api/object/payment.rb +123 -0
  23. data/lib/mollie/api/object/payment/refund.rb +43 -0
  24. data/lib/mollie/api/object/subscription.rb +67 -0
  25. data/lib/{Mollie/API/Resource/Base.rb → mollie/api/resource/base.rb} +8 -8
  26. data/lib/{Mollie/API/Resource/Customers.rb → mollie/api/resource/customers.rb} +2 -2
  27. data/lib/{Mollie/API/Resource/Customers/Mandates.rb → mollie/api/resource/customers/mandates.rb} +5 -5
  28. data/lib/{Mollie/API/Resource/Customers/Payments.rb → mollie/api/resource/customers/payments.rb} +5 -5
  29. data/lib/mollie/api/resource/customers/subscriptions.rb +27 -0
  30. data/lib/{Mollie/API/Resource/Issuers.rb → mollie/api/resource/issuers.rb} +2 -2
  31. data/lib/{Mollie/API/Resource/Methods.rb → mollie/api/resource/methods.rb} +2 -2
  32. data/lib/{Mollie/API/Resource/Payments.rb → mollie/api/resource/payments.rb} +2 -2
  33. data/lib/{Mollie/API/Resource/Payments/Refunds.rb → mollie/api/resource/payments/refunds.rb} +5 -5
  34. data/lib/mollie/api/util.rb +37 -0
  35. data/mollie.gemspec +16 -14
  36. data/test/helper.rb +4 -0
  37. data/test/mollie/api/client_test.rb +99 -0
  38. data/test/mollie/api/object/base_test.rb +21 -0
  39. data/test/mollie/api/object/customer_test.rb +35 -0
  40. data/test/mollie/api/object/issuer_test.rb +23 -0
  41. data/test/mollie/api/object/list_test.rb +44 -0
  42. data/test/mollie/api/object/mandate_test.rb +45 -0
  43. data/test/mollie/api/object/method_test.rb +33 -0
  44. data/test/mollie/api/object/payment/refund_test.rb +46 -0
  45. data/test/mollie/api/object/payment_test.rb +91 -0
  46. data/test/mollie/api/object/subscription_test.rb +68 -0
  47. data/test/mollie/api/resource/base_test.rb +83 -0
  48. data/test/mollie/api/resource/customers/mandates_test.rb +23 -0
  49. data/test/mollie/api/resource/customers/payments_test.rb +23 -0
  50. data/test/mollie/api/resource/customers/subscriptions_test.rb +23 -0
  51. data/test/mollie/api/resource/customers_test.rb +13 -0
  52. data/test/mollie/api/resource/issuers_test.rb +13 -0
  53. data/test/mollie/api/resource/methods_test.rb +13 -0
  54. data/test/mollie/api/resource/payments/refunds_test.rb +23 -0
  55. data/test/mollie/api/resource/payments_test.rb +13 -0
  56. data/test/run-test.rb +15 -0
  57. metadata +99 -52
  58. data/lib/Mollie/API/Client.rb +0 -130
  59. data/lib/Mollie/API/Object/Base.rb +0 -18
  60. data/lib/Mollie/API/Object/Customer.rb +0 -16
  61. data/lib/Mollie/API/Object/List.rb +0 -35
  62. data/lib/Mollie/API/Object/Mandate.rb +0 -22
  63. data/lib/Mollie/API/Object/Payment.rb +0 -68
  64. data/lib/Mollie/API/Object/Payment/Refund.rb +0 -15
  65. data/lib/Mollie/API/Object/Subscription.rb +0 -26
  66. data/lib/Mollie/API/Resource/Customers/Subscriptions.rb +0 -27
@@ -0,0 +1,27 @@
1
+ require 'open-uri'
2
+
3
+ module Mollie
4
+ module API
5
+ module Resource
6
+ class Customers
7
+ class Subscriptions < Base
8
+ @customer_id = nil
9
+
10
+ def resource_object
11
+ Object::Subscription
12
+ end
13
+
14
+ def resource_name
15
+ customer_id = URI::encode(@customer_id)
16
+ "customers/#{customer_id}/subscriptions"
17
+ end
18
+
19
+ def with(customer_or_id)
20
+ @customer_id = customer_or_id.is_a?(Object::Customer) ? customer_or_id.id : customer_or_id
21
+ self
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -2,8 +2,8 @@ module Mollie
2
2
  module API
3
3
  module Resource
4
4
  class Issuers < Base
5
- def getResourceObject
6
- Mollie::API::Object::Issuer
5
+ def resource_object
6
+ Object::Issuer
7
7
  end
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module Mollie
2
2
  module API
3
3
  module Resource
4
4
  class Methods < Base
5
- def getResourceObject
6
- Mollie::API::Object::Method
5
+ def resource_object
6
+ Object::Method
7
7
  end
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module Mollie
2
2
  module API
3
3
  module Resource
4
4
  class Payments < Base
5
- def getResourceObject
6
- Mollie::API::Object::Payment
5
+ def resource_object
6
+ Object::Payment
7
7
  end
8
8
  end
9
9
  end
@@ -7,17 +7,17 @@ module Mollie
7
7
  class Refunds < Base
8
8
  @payment_id = nil
9
9
 
10
- def getResourceObject
11
- Mollie::API::Object::Payment::Refund
10
+ def resource_object
11
+ Object::Payment::Refund
12
12
  end
13
13
 
14
- def getResourceName
14
+ def resource_name
15
15
  payment_id = URI::encode(@payment_id)
16
16
  "payments/#{payment_id}/refunds"
17
17
  end
18
18
 
19
- def with(payment)
20
- @payment_id = payment.id
19
+ def with(payment_or_id)
20
+ @payment_id = payment_or_id.is_a?(Object::Payment) ? payment_or_id.id : payment_or_id
21
21
  self
22
22
  end
23
23
  end
@@ -0,0 +1,37 @@
1
+ module Util
2
+ extend self
3
+
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
12
+ end
13
+ end
14
+ end
15
+
16
+ def camelize_keys(hash)
17
+ hash.each_with_object({}) do |(key, value), camelized|
18
+ camelized[camelize(key)] = value
19
+ end
20
+ end
21
+
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
29
+
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
36
+ end
37
+ end
data/mollie.gemspec CHANGED
@@ -1,24 +1,26 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
1
+ $:.push File.expand_path('../lib', __FILE__)
2
2
 
3
- require 'Mollie/API/Client/Version'
3
+ require 'mollie/api/client/version'
4
4
 
5
- spec = Gem::Specification.new do |s|
5
+ Gem::Specification.new do |s|
6
6
  s.name = 'mollie-api-ruby'
7
- s.version = Mollie::API::Client::CLIENT_VERSION
7
+ s.version = Mollie::API::Client::VERSION
8
8
  s.summary = 'Official Mollie API Client for Ruby'
9
- s.description = 'Accepting iDEAL, Bancontact/Mister Cash, SOFORT Banking, Creditcard, SEPA Bank transfer, SEPA Direct debit, Bitcoin, PayPal, KBC Payment Button, CBC Payment Button, Belfius Direct Net, paysafecard and PODIUM Cadeaukaart online payments without fixed monthly costs or any punishing registration procedures.'
10
- s.authors = ['Rick Wong']
9
+ s.description = %(Accepting iDEAL, Bancontact/Mister Cash, SOFORT Banking,
10
+ Creditcard, SEPA Bank transfer, SEPA Direct debit, Bitcoin,
11
+ PayPal, KBC Payment Button, CBC Payment Button, Belfius Direct
12
+ Net, paysafecard and PODIUM Cadeaukaart online payments without
13
+ fixed monthly costs or any punishing registration procedures.')
14
+ s.authors = ['Mollie B.V.']
11
15
  s.email = ['info@mollie.nl']
12
16
  s.homepage = 'https://github.com/mollie/mollie-api-ruby'
13
17
  s.license = 'BSD'
14
- s.required_ruby_version = '>= 1.9.3'
15
-
16
- s.add_dependency('rest-client', '~> 1.8')
17
- s.add_dependency('json', '~> 1.8')
18
- s.add_dependency('mime-types', '< 3')
18
+ s.required_ruby_version = '>= 2.0.0'
19
19
 
20
20
  s.files = `git ls-files`.split("\n")
21
- s.test_files = `git ls-files -- test/*`.split("\n")
22
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
- s.require_paths = ['lib']
21
+ s.test_files = Dir['test/**/*']
22
+
23
+ s.add_development_dependency("rake")
24
+ s.add_development_dependency("test-unit")
25
+ s.add_development_dependency("webmock")
24
26
  end
data/test/helper.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'test/unit'
2
+ require 'webmock/test_unit'
3
+
4
+ require 'mollie/api/client'
@@ -0,0 +1,99 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ class ClientTest < Test::Unit::TestCase
6
+ def client
7
+ Client.new("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM")
8
+ end
9
+
10
+ def test_initialize
11
+ assert_equal "test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM", client.api_key
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
+ assert_kind_of Mollie::API::Resource::Customers, client.customers
18
+ assert_kind_of Mollie::API::Resource::Customers::Payments, client.customers_payments
19
+ assert_kind_of Mollie::API::Resource::Customers::Mandates, client.customers_mandates
20
+ assert_kind_of Mollie::API::Resource::Customers::Subscriptions, client.customers_subscriptions
21
+ end
22
+
23
+ def test_setting_the_api_endpoint
24
+ client = self.client
25
+ client.api_endpoint = "http://my.endpoint/"
26
+ assert_equal "http://my.endpoint", client.api_endpoint
27
+ end
28
+
29
+ def test_perform_http_call_defaults
30
+ stub_request(:any, "https://api.mollie.nl/v1/my-method")
31
+ .with(:headers => { 'Accept' => 'application/json',
32
+ 'Authorization' => 'Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM',
33
+ 'User-Agent' => /^Mollie\/#{Mollie::API::Client::VERSION} Ruby\/#{RUBY_VERSION} OpenSSL\/.*$/ })
34
+ .to_return(:status => 200, :body => "{}", :headers => {})
35
+ client.perform_http_call("GET", "my-method", nil, {})
36
+ end
37
+
38
+ def test_get_requests_convert_to_snake_case
39
+ response_body = <<-JSON
40
+ {
41
+ "someCamelCased" : {
42
+ "alsoNested": "camelCaseValue"
43
+ },
44
+ "evenLists": [
45
+ {
46
+ "withCamelCase": "camelCaseValue"
47
+ }
48
+ ]
49
+ }
50
+ JSON
51
+
52
+ expected_response = {
53
+ 'some_camel_cased' =>
54
+ { 'also_nested' => "camelCaseValue" },
55
+ 'even_lists' => [
56
+ { 'with_camel_case' => "camelCaseValue" }
57
+ ]
58
+ }
59
+
60
+ stub_request(:get, "https://api.mollie.nl/v1/my-method")
61
+ .to_return(:status => 200, :body => response_body, :headers => {})
62
+ response = client.perform_http_call("GET", "my-method", nil, {})
63
+
64
+ assert_equal expected_response, response
65
+ end
66
+
67
+ def test_post_requests_convert_to_camel_case
68
+ expected_body = %{{"redirectUrl":"my-url"}}
69
+
70
+ stub_request(:post, "https://api.mollie.nl/v1/my-method")
71
+ .with(body: expected_body)
72
+ .to_return(:status => 200, :body => "{}", :headers => {})
73
+
74
+ client.perform_http_call("POST", "my-method", nil, redirect_url: "my-url")
75
+ end
76
+
77
+ def test_delete_requests_with_no_content_responses
78
+ stub_request(:delete, "https://api.mollie.nl/v1/my-method/1")
79
+ .to_return(:status => 204, :body => "", :headers => {})
80
+
81
+ client.perform_http_call("DELETE", "my-method", "1")
82
+ end
83
+
84
+ def test_error_response
85
+ response = <<-JSON
86
+ {"error": {"message": "Error on field", "field": "my-field"}}
87
+ JSON
88
+ stub_request(:post, "https://api.mollie.nl/v1/my-method")
89
+ .to_return(:status => 500, :body => response, :headers => {})
90
+
91
+ e = assert_raise Mollie::API::Exception.new("Error on field") do
92
+ client.perform_http_call("POST", "my-method", nil, {})
93
+ end
94
+
95
+ assert_equal "my-field", e.field
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,21 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class TestObject < Base
7
+ attr_accessor :my_field
8
+ end
9
+
10
+ class BaseTest < Test::Unit::TestCase
11
+ def test_setting_attributes
12
+ attributes = {my_field: "my value", extra_field: "extra"}
13
+ object = TestObject.new(attributes)
14
+
15
+ assert_equal "my value", object.my_field
16
+ assert_equal attributes, object.attributes
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class CustomerTest < Test::Unit::TestCase
7
+ def test_setting_attributes
8
+ attributes = {
9
+ id: 'cst_vsKJpSsabw',
10
+ mode: 'test',
11
+ name: 'Customer A',
12
+ email: 'customer@example.org',
13
+ locale: 'nl_NL',
14
+ metadata: { my_field: 'value' },
15
+ recently_used_methods: 'creditcard',
16
+ created_datetime: '2016-04-06T13:23:21.0Z'
17
+ }
18
+
19
+ customer = Customer.new(attributes)
20
+
21
+ assert_equal 'cst_vsKJpSsabw', customer.id
22
+ assert_equal 'test', customer.mode
23
+ assert_equal 'Customer A', customer.name
24
+ assert_equal 'customer@example.org', customer.email
25
+ assert_equal 'nl_NL', customer.locale
26
+ assert_equal ['creditcard'], customer.recently_used_methods
27
+ assert_equal Time.parse('2016-04-06T13:23:21.0Z'), customer.created_datetime
28
+
29
+ assert_equal 'value', customer.metadata.my_field
30
+ assert_equal nil, customer.metadata.non_existing
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class IssuerTest < Test::Unit::TestCase
7
+ def test_setting_attributes
8
+ attributes = {
9
+ id: 'ideal_ABNANL2A',
10
+ name: 'ABN AMRO',
11
+ method: 'ideal'
12
+ }
13
+
14
+ customer = Issuer.new(attributes)
15
+
16
+ assert_equal 'ideal_ABNANL2A', customer.id
17
+ assert_equal 'ABN AMRO', customer.name
18
+ assert_equal 'ideal', customer.method
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,44 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class ListTest < Test::Unit::TestCase
7
+ def test_setting_attributes
8
+ attributes = {
9
+ 'total_count' => 280,
10
+ 'offset' => 0,
11
+ 'count' => 10,
12
+ 'data' => [
13
+ { 'id' => "tr_1" },
14
+ { 'id' => "tr_2" },
15
+ ],
16
+ 'links' => {
17
+ 'first' => "https://api.mollie.nl/v1/payments?count=10&offset=0",
18
+ 'previous' => nil,
19
+ 'next' => "https://api.mollie.nl/v1/payments?count=10&offset=10",
20
+ 'last' => "https://api.mollie.nl/v1/payments?count=10&offset=270"
21
+ }
22
+ }
23
+
24
+ list = List.new(attributes, Payment)
25
+
26
+ assert_equal 280, list.total_count
27
+ assert_equal 0, list.offset
28
+ assert_equal 10, list.count
29
+
30
+ assert_kind_of Payment, list.to_a[0]
31
+ assert_equal "tr_1", list.to_a[0].id
32
+
33
+ assert_kind_of Payment, list.to_a[1]
34
+ assert_equal "tr_2", list.to_a[1].id
35
+
36
+ assert_equal "https://api.mollie.nl/v1/payments?count=10&offset=0", list.first_url
37
+ assert_equal nil, list.previous_url
38
+ assert_equal "https://api.mollie.nl/v1/payments?count=10&offset=10", list.next_url
39
+ assert_equal "https://api.mollie.nl/v1/payments?count=10&offset=270", list.last_url
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,45 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ module API
5
+ module Object
6
+ class MandateTest < Test::Unit::TestCase
7
+ def test_setting_attributes
8
+ attributes = {
9
+ id: "mdt_qtUgejVgMN",
10
+ status: "valid",
11
+ method: "creditcard",
12
+ customer_id: "cst_R6JLAuqEgm",
13
+ details: {
14
+ card_holder: "John Doe",
15
+ card_expiry_date: "2016-03-31"
16
+ },
17
+ created_datetime: "2016-04-13T11:32:38.0Z"
18
+ }
19
+
20
+ mandate = Mandate.new(attributes)
21
+
22
+ assert_equal 'mdt_qtUgejVgMN', mandate.id
23
+ assert_equal 'valid', mandate.status
24
+ assert_equal 'creditcard', mandate.method
25
+ assert_equal 'cst_R6JLAuqEgm', mandate.customer_id
26
+ assert_equal Time.parse('2016-04-13T11:32:38.0Z'), mandate.created_datetime
27
+
28
+ assert_equal 'John Doe', mandate.details.card_holder
29
+ assert_equal '2016-03-31', mandate.details.card_expiry_date
30
+ assert_equal nil, mandate.details.non_existing
31
+ end
32
+
33
+ def test_valid_invalid
34
+ mandate = Mandate.new(status: Mandate::STATUS_VALID)
35
+ assert mandate.valid?
36
+ assert !mandate.invalid?
37
+
38
+ mandate = Mandate.new(status: Mandate::STATUS_INVALID)
39
+ assert !mandate.valid?
40
+ assert mandate.invalid?
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end