mollie-api-ruby 4.0.1 → 4.1.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +6 -0
  3. data/examples/captures/get-payment.rb +2 -0
  4. data/examples/captures/get-settlement.rb +2 -0
  5. data/examples/captures/get-shipment.rb +2 -0
  6. data/examples/captures/get.rb +4 -0
  7. data/examples/captures/list.rb +1 -0
  8. data/examples/orders/cancel-lines.rb +2 -0
  9. data/examples/orders/cancel.rb +5 -0
  10. data/examples/orders/create-refund.rb +15 -0
  11. data/examples/orders/create.rb +88 -0
  12. data/examples/orders/get.rb +1 -0
  13. data/examples/orders/list-refunds.rb +1 -0
  14. data/examples/orders/list.rb +1 -0
  15. data/examples/orders/update.rb +15 -0
  16. data/examples/payments/get-order.rb +2 -0
  17. data/examples/refunds/get-order.rb +2 -0
  18. data/examples/shipments/create.rb +17 -0
  19. data/examples/shipments/get-order.rb +2 -0
  20. data/examples/shipments/get.rb +4 -0
  21. data/examples/shipments/list.rb +1 -0
  22. data/examples/shipments/update.rb +9 -0
  23. data/lib/mollie.rb +5 -0
  24. data/lib/mollie/base.rb +2 -0
  25. data/lib/mollie/exception.rb +1 -1
  26. data/lib/mollie/list.rb +8 -0
  27. data/lib/mollie/order.rb +142 -0
  28. data/lib/mollie/order/line.rb +95 -0
  29. data/lib/mollie/order/refund.rb +6 -0
  30. data/lib/mollie/order/shipment.rb +34 -0
  31. data/lib/mollie/payment.rb +17 -6
  32. data/lib/mollie/payment/capture.rb +43 -0
  33. data/lib/mollie/refund.rb +11 -0
  34. data/lib/mollie/version.rb +1 -1
  35. data/test/fixtures/captures/get.json +39 -0
  36. data/test/fixtures/captures/list.json +58 -0
  37. data/test/fixtures/orders/cancel_line.json +8 -0
  38. data/test/fixtures/orders/cancel_line_qty.json +8 -0
  39. data/test/fixtures/orders/create.json +88 -0
  40. data/test/fixtures/orders/create_refund.json +9 -0
  41. data/test/fixtures/orders/get.json +218 -0
  42. data/test/fixtures/orders/list.json +34 -0
  43. data/test/fixtures/orders/list_refunds.json +85 -0
  44. data/test/fixtures/orders/refund.json +63 -0
  45. data/test/fixtures/orders/refund_all.json +3 -0
  46. data/test/fixtures/orders/update.json +14 -0
  47. data/test/fixtures/refunds/get.json +111 -0
  48. data/test/fixtures/shipments/create.json +16 -0
  49. data/test/fixtures/shipments/get.json +101 -0
  50. data/test/fixtures/shipments/list.json +74 -0
  51. data/test/fixtures/shipments/update.json +7 -0
  52. data/test/helper.rb +4 -0
  53. data/test/mollie/list_test.rb +3 -0
  54. data/test/mollie/order/line_test.rb +45 -0
  55. data/test/mollie/order/shipment_test.rb +143 -0
  56. data/test/mollie/order_test.rb +289 -0
  57. data/test/mollie/payment/capture_test.rb +77 -0
  58. data/test/mollie/payment_test.rb +33 -0
  59. data/test/mollie/refund_test.rb +64 -0
  60. metadata +101 -34
@@ -0,0 +1,16 @@
1
+ {
2
+ "lines": [
3
+ {
4
+ "id": "odl_dgtxyl",
5
+ "quantity": 1
6
+ },
7
+ {
8
+ "id": "odl_jp31jz"
9
+ }
10
+ ],
11
+ "tracking": {
12
+ "carrier": "PostNL",
13
+ "code": "3SKABA000000000",
14
+ "url": "http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C"
15
+ }
16
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "resource": "shipment",
3
+ "id": "shp_3wmsgCJN4U",
4
+ "orderId": "ord_kEn1PlbGa",
5
+ "createdAt": "2018-08-09T14:33:54+00:00",
6
+ "tracking": {
7
+ "carrier": "PostNL",
8
+ "code": "3SKABA000000000",
9
+ "url": "http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C"
10
+ },
11
+ "lines": [
12
+ {
13
+ "resource": "orderline",
14
+ "id": "odl_dgtxyl",
15
+ "orderId": "ord_kEn1PlbGa",
16
+ "name": "LEGO 42083 Bugatti Chiron",
17
+ "sku": "5702016116977",
18
+ "type": "physical",
19
+ "status": "shipping",
20
+ "isCancelable": true,
21
+ "quantity": 2,
22
+ "unitPrice": {
23
+ "value": "399.00",
24
+ "currency": "EUR"
25
+ },
26
+ "vatRate": "21.00",
27
+ "vatAmount": {
28
+ "value": "121.14",
29
+ "currency": "EUR"
30
+ },
31
+ "totalAmount": {
32
+ "value": "698.00",
33
+ "currency": "EUR"
34
+ },
35
+ "createdAt": "2018-09-23T17:23:13+00:00",
36
+ "discountAmount": {
37
+ "value": "100.00",
38
+ "currency": "EUR"
39
+ },
40
+ "_links": {
41
+ "productUrl": {
42
+ "href": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
43
+ "type": "text/html"
44
+ },
45
+ "imageUrl": {
46
+ "href": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
47
+ "type": "text/html"
48
+ }
49
+ }
50
+ },
51
+ {
52
+ "resource": "orderline",
53
+ "id": "odl_j3eusr",
54
+ "orderId": "ord_kEn1PlbGa",
55
+ "name": "LEGO 42056 Porsche 911 GT3 RS",
56
+ "sku": "5702015594028",
57
+ "type": "physical",
58
+ "status": "shipping",
59
+ "isCancelable": true,
60
+ "quantity": 1,
61
+ "unitPrice": {
62
+ "value": "329.99",
63
+ "currency": "EUR"
64
+ },
65
+ "vatRate": "21.00",
66
+ "vatAmount": {
67
+ "value": "57.27",
68
+ "currency": "EUR"
69
+ },
70
+ "totalAmount": {
71
+ "value": "329.99",
72
+ "currency": "EUR"
73
+ },
74
+ "createdAt": "2018-09-23T17:23:13+00:00",
75
+ "_links": {
76
+ "productUrl": {
77
+ "href": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
78
+ "type": "text/html"
79
+ },
80
+ "imageUrl": {
81
+ "href": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
82
+ "type": "text/html"
83
+ }
84
+ }
85
+ }
86
+ ],
87
+ "_links": {
88
+ "self": {
89
+ "href": "https://api.mollie.com/v2/shipments/shp_bjylrn",
90
+ "type": "application/hal+json"
91
+ },
92
+ "order": {
93
+ "href": "https://api.mollie.com/v2/orders/ord_kEn1PlbGa",
94
+ "type": "application/hal+json"
95
+ },
96
+ "documentation": {
97
+ "href": "https://docs.mollie.com/reference/v2/shipments-api/get-shipment",
98
+ "type": "text/html"
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "count": 1,
3
+ "_embedded": {
4
+ "shipments": [
5
+ {
6
+ "resource": "shipment",
7
+ "id": "shp_3wmsgCJN4U",
8
+ "orderId": "ord_kEn1PlbGa",
9
+ "createdAt": "2018-08-09T14:33:54+00:00",
10
+ "tracking": {
11
+ "carrier": "PostNL",
12
+ "code": "3SKABA000000000",
13
+ "url": "http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C"
14
+ },
15
+ "lines": [
16
+ {
17
+ "resource": "orderline",
18
+ "id": "odl_dgtxyl",
19
+ "orderId": "ord_pbjz8x",
20
+ "name": "LEGO 42083 Bugatti Chiron",
21
+ "productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
22
+ "imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
23
+ "sku": "5702016116977",
24
+ "type": "physical",
25
+ "status": "shipping",
26
+ "quantity": 2,
27
+ "unitPrice": {
28
+ "value": "399.00",
29
+ "currency": "EUR"
30
+ },
31
+ "vatRate": "21.00",
32
+ "vatAmount": {
33
+ "value": "121.14",
34
+ "currency": "EUR"
35
+ },
36
+ "discountAmount": {
37
+ "value": "100.00",
38
+ "currency": "EUR"
39
+ },
40
+ "totalAmount": {
41
+ "value": "698.00",
42
+ "currency": "EUR"
43
+ },
44
+ "createdAt": "2018-08-02T09:29:56+00:00"
45
+ }
46
+ ],
47
+ "_links": {
48
+ "self": {
49
+ "href": "https://api.mollie.com/v2/order/ord_kEn1PlbGa/shipments/shp_3wmsgCJN4U",
50
+ "type": "application/hal+json"
51
+ },
52
+ "order": {
53
+ "href": "https://api.mollie.com/v2/orders/ord_kEn1PlbGa",
54
+ "type": "application/hal+json"
55
+ },
56
+ "documentation": {
57
+ "href": "https://docs.mollie.com/reference/v2/shipments-api/get-shipment",
58
+ "type": "text/html"
59
+ }
60
+ }
61
+ }
62
+ ]
63
+ },
64
+ "_links": {
65
+ "self": {
66
+ "href": "https://api.mollie.com/v2/order/ord_kEn1PlbGa/shipments",
67
+ "type": "application/hal+json"
68
+ },
69
+ "documentation": {
70
+ "href": "https://docs.mollie.com/reference/v2/shipments-api/list-shipments",
71
+ "type": "text/html"
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "tracking": {
3
+ "carrier": "PostNL",
4
+ "code": "3SKABA000000000",
5
+ "url": "http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C"
6
+ }
7
+ }
@@ -6,3 +6,7 @@ require 'mollie'
6
6
  Mollie::Client.configure do |config|
7
7
  config.api_key = 'test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM'
8
8
  end
9
+
10
+ def read_fixture(path)
11
+ File.read(File.join(File.dirname(__FILE__), 'fixtures', path))
12
+ end
@@ -32,11 +32,14 @@ module Mollie
32
32
  list = Mollie::List.new(attributes, Payment)
33
33
 
34
34
  assert_equal 2, list.count
35
+ assert_equal 2, list.size
35
36
  assert_kind_of Payment, list.to_a[0]
36
37
  assert_equal 'tr_1', list.to_a[0].id
38
+ assert_equal 'tr_1', list[0].id
37
39
 
38
40
  assert_kind_of Payment, list.to_a[1]
39
41
  assert_equal 'tr_2', list.to_a[1].id
42
+ assert_equal 'tr_2', list[1].id
40
43
  end
41
44
 
42
45
  def test_next_page
@@ -0,0 +1,45 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ class Order
5
+ class LineTest < Test::Unit::TestCase
6
+ GET_ORDER = read_fixture('orders/get.json')
7
+ CANCEL_LINE = read_fixture('orders/cancel_line.json')
8
+ CANCEL_QTY = read_fixture('orders/cancel_line_qty.json')
9
+
10
+ def test_discounted
11
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
12
+ .to_return(status: 200, body: GET_ORDER, headers: {})
13
+
14
+ order = Order.get('ord_kEn1PlbGa')
15
+ assert order.lines[0].discounted?
16
+ assert order.lines[1].discounted? == false
17
+ end
18
+
19
+ def test_cancel_order_line
20
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
21
+ .to_return(status: 200, body: GET_ORDER, headers: {})
22
+
23
+ stub_request(:delete, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/lines')
24
+ .with(body: JSON.parse(CANCEL_LINE).to_json)
25
+ .to_return(status: 204, body: GET_ORDER, headers: {})
26
+
27
+ order = Order.get('ord_kEn1PlbGa')
28
+ assert_nil order.lines.first.cancel
29
+ end
30
+
31
+ def test_cancel_order_line_with_quantity
32
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
33
+ .to_return(status: 200, body: GET_ORDER, headers: {})
34
+
35
+ stub_request(:delete, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/lines')
36
+ .with(body: JSON.parse(CANCEL_QTY).to_json)
37
+ .to_return(status: 204, body: GET_ORDER, headers: {})
38
+
39
+ order = Order.get('ord_kEn1PlbGa')
40
+ assert_nil order.lines.first.cancel(quantity: 1)
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,143 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ class Order
5
+ class ShipmentTest < Test::Unit::TestCase
6
+ GET_ORDER = read_fixture('orders/get.json')
7
+ GET_SHIPMENT = read_fixture('shipments/get.json')
8
+ CREATE_SHIPMENT = read_fixture('shipments/create.json')
9
+ LIST_SHIPMENTS = read_fixture('shipments/list.json')
10
+ UPDATE_SHIPMENT = read_fixture('shipments/update.json')
11
+
12
+ def test_get_shipment
13
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments/shp_3wmsgCJN4U')
14
+ .to_return(status: 200, body: GET_SHIPMENT, headers: {})
15
+
16
+ shipment = Order::Shipment.get('shp_3wmsgCJN4U', order_id: 'ord_kEn1PlbGa')
17
+ assert_equal 'shp_3wmsgCJN4U', shipment.id
18
+ assert_equal 'ord_kEn1PlbGa', shipment.order_id
19
+ assert_equal Time.parse('2018-08-09T14:33:54+00:00'), shipment.created_at
20
+ end
21
+
22
+ def test_tracking_details
23
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments/shp_3wmsgCJN4U')
24
+ .to_return(status: 200, body: GET_SHIPMENT, headers: {})
25
+
26
+ shipment = Order::Shipment.get('shp_3wmsgCJN4U', order_id: 'ord_kEn1PlbGa')
27
+ assert_equal 'shp_3wmsgCJN4U', shipment.id
28
+ assert_equal 'PostNL', shipment.tracking.carrier
29
+ assert_equal '3SKABA000000000', shipment.tracking.code
30
+ assert_equal 'http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C', shipment.tracking.url
31
+ end
32
+
33
+ def test_nil_tracking_details
34
+ body = %({ "resource": "shipment", "id": "shp_3wmsgCJN4U" })
35
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments/shp_3wmsgCJN4U')
36
+ .to_return(status: 200, body: body, headers: {})
37
+
38
+ shipment = Order::Shipment.get('shp_3wmsgCJN4U', order_id: 'ord_kEn1PlbGa')
39
+ assert_equal 'shp_3wmsgCJN4U', shipment.id
40
+ assert_nil shipment.tracking.carrier
41
+ end
42
+
43
+ def test_order_lines
44
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments/shp_3wmsgCJN4U')
45
+ .to_return(status: 200, body: GET_SHIPMENT, headers: {})
46
+
47
+ shipment = Order::Shipment.get('shp_3wmsgCJN4U', order_id: 'ord_kEn1PlbGa')
48
+ assert shipment.lines.size == 2
49
+
50
+ line = shipment.lines.first
51
+ assert_equal 'odl_dgtxyl', line.id
52
+ assert_equal 'ord_kEn1PlbGa', line.order_id
53
+ assert_equal 'LEGO 42083 Bugatti Chiron', line.name
54
+ assert_equal 'https://shop.lego.com/nl-NL/Bugatti-Chiron-42083', line.product_url
55
+ assert_equal 'https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$', line.image_url
56
+ assert_equal '5702016116977', line.sku
57
+ assert_equal 'physical', line.type
58
+ assert_equal 'shipping', line.status
59
+ assert_equal true, line.is_cancelable
60
+ assert_equal true, line.cancelable?
61
+ assert_equal 2, line.quantity
62
+ assert_equal BigDecimal('399.00'), line.unit_price.value
63
+ assert_equal 'EUR', line.unit_price.currency
64
+ assert_equal '21.00', line.vat_rate
65
+ assert_equal BigDecimal('121.14'), line.vat_amount.value
66
+ assert_equal 'EUR', line.vat_amount.currency
67
+ assert_equal BigDecimal('100.00'), line.discount_amount.value
68
+ assert_equal 'EUR', line.discount_amount.currency
69
+ assert_equal BigDecimal('698.00'), line.total_amount.value
70
+ assert_equal 'EUR', line.total_amount.currency
71
+ assert_equal Time.parse('2018-09-23T17:23:13+00:00'), line.created_at
72
+ end
73
+
74
+ def test_create_shipment
75
+ stub_request(:post, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments')
76
+ .with(body: CREATE_SHIPMENT.delete("\n "))
77
+ .to_return(status: 201, body: GET_SHIPMENT, headers: {})
78
+
79
+ shipment = Order::Shipment.create(
80
+ order_id: 'ord_kEn1PlbGa',
81
+ lines: [
82
+ {
83
+ id: 'odl_dgtxyl',
84
+ quantity: 1
85
+ },
86
+ {
87
+ id: 'odl_jp31jz'
88
+ }
89
+ ],
90
+ tracking: {
91
+ carrier: 'PostNL',
92
+ code: '3SKABA000000000',
93
+ url: 'http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C'
94
+ }
95
+ )
96
+
97
+ assert_kind_of Order::Shipment, shipment
98
+ assert_equal 'shp_3wmsgCJN4U', shipment.id
99
+ end
100
+
101
+ def test_list_shipments
102
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments')
103
+ .to_return(status: 200, body: LIST_SHIPMENTS, headers: {})
104
+
105
+ shipments = Order::Shipment.all(order_id: 'ord_kEn1PlbGa')
106
+ assert_equal 1, shipments.size
107
+ assert_equal 'shp_3wmsgCJN4U', shipments.first.id
108
+ assert_equal 'ord_kEn1PlbGa', shipments.first.order_id
109
+ end
110
+
111
+ def test_update_shipment
112
+ stub_request(:patch, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments/shp_3wmsgCJN4U')
113
+ .with(body: UPDATE_SHIPMENT.delete("\n "))
114
+ .to_return(status: 200, body: GET_SHIPMENT, headers: {})
115
+
116
+ shipment = Order::Shipment.update(
117
+ 'shp_3wmsgCJN4U',
118
+ order_id: 'ord_kEn1PlbGa',
119
+ tracking: {
120
+ carrier: 'PostNL',
121
+ code: '3SKABA000000000',
122
+ url: 'http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C'
123
+ }
124
+ )
125
+
126
+ assert_kind_of Order::Shipment, shipment
127
+ assert_equal 'shp_3wmsgCJN4U', shipment.id
128
+ end
129
+
130
+ def test_get_order
131
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/shipments/shp_3wmsgCJN4U')
132
+ .to_return(status: 200, body: GET_SHIPMENT, headers: {})
133
+
134
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
135
+ .to_return(status: 200, body: GET_ORDER, headers: {})
136
+
137
+ shipment = Order::Shipment.get('shp_3wmsgCJN4U', order_id: 'ord_kEn1PlbGa')
138
+ order = shipment.order
139
+ assert_equal 'ord_kEn1PlbGa', order.id
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,289 @@
1
+ require 'helper'
2
+
3
+ module Mollie
4
+ class OrderTest < Test::Unit::TestCase
5
+ CREATE_ORDER = read_fixture('orders/create.json')
6
+ GET_ORDER = read_fixture('orders/get.json')
7
+ UPDATE_ORDER = read_fixture('orders/update.json')
8
+ LIST_ORDER = read_fixture('orders/list.json')
9
+
10
+ # Refunds
11
+ CREATE_ORDER_REFUND = read_fixture('orders/create_refund.json')
12
+ REFUND_ALL_LINES = read_fixture('orders/refund_all.json')
13
+ LIST_ORDER_REFUNDS = read_fixture('orders/list_refunds.json')
14
+ GET_ORDER_REFUND = read_fixture('orders/refund.json')
15
+
16
+ def test_status_pending
17
+ assert Order.new(status: Order::STATUS_PENDING).pending?
18
+ assert !Order.new(status: 'not-pending').pending?
19
+ end
20
+
21
+ def test_status_authorized
22
+ assert Order.new(status: Order::STATUS_AUTHORIZED).authorized?
23
+ assert !Order.new(status: 'not-authorized').authorized?
24
+ end
25
+
26
+ def test_status_paid
27
+ assert Order.new(status: Order::STATUS_PAID).paid?
28
+ assert !Order.new(status: 'not-paid').paid?
29
+ end
30
+
31
+ def test_status_shipping
32
+ assert Order.new(status: Order::STATUS_SHIPPING).shipping?
33
+ assert !Order.new(status: 'not-shipping').shipping?
34
+ end
35
+
36
+ def test_status_expired
37
+ assert Order.new(status: Order::STATUS_EXPIRED).expired?
38
+ assert !Order.new(status: 'not-expired').expired?
39
+ end
40
+
41
+ def test_status_canceled
42
+ assert Order.new(status: Order::STATUS_CANCELED).canceled?
43
+ assert !Order.new(status: 'not-canceled').canceled?
44
+ end
45
+
46
+ def test_status_completed
47
+ assert Order.new(status: Order::STATUS_COMPLETED).completed?
48
+ assert !Order.new(status: 'not-completed').completed?
49
+ end
50
+
51
+ def test_get_order
52
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
53
+ .to_return(status: 200, body: GET_ORDER, headers: {})
54
+
55
+ order = Order.get('ord_kEn1PlbGa')
56
+ assert_equal 'ord_kEn1PlbGa', order.id
57
+ assert_equal 'pfl_URR55HPMGx', order.profile_id
58
+ assert_equal 'ideal', order.method
59
+ assert_equal 'live', order.mode
60
+ assert_equal BigDecimal('1027.99'), order.amount.value
61
+ assert_equal 'EUR', order.amount.currency
62
+ assert_equal BigDecimal('1002.99'), order.amount_captured.value
63
+ assert_equal 'EUR', order.amount_captured.currency
64
+ assert_equal BigDecimal('25.0'), order.amount_refunded.value
65
+ assert_equal 'EUR', order.amount_refunded.currency
66
+ assert_equal 'created', order.status
67
+ assert_equal true, order.is_cancelable
68
+ assert_equal '18475', order.order_number
69
+ assert_equal 'nl_NL', order.locale
70
+ assert_equal '1337', order.metadata.order_id
71
+ assert_equal 'Lego cars', order.metadata.description
72
+ assert_equal 'https://example.org/redirect', order.redirect_url
73
+ assert_equal 'https://example.org/webhook', order.webhook_url
74
+ assert_equal Time.parse('2018-08-02T09:29:56+00:00'), order.created_at
75
+ assert_equal Time.parse('2018-08-30T09:29:56+00:00'), order.expires_at
76
+ assert_equal Time.parse('2018-08-30T09:29:56+00:02'), order.expired_at
77
+ assert_equal Time.parse('2018-08-26T09:29:56+00:00'), order.paid_at
78
+ assert_equal Time.parse('2018-08-25T09:29:56+00:00'), order.authorized_at
79
+ assert_equal Time.parse('2018-08-27T09:29:56+00:00'), order.canceled_at
80
+ assert_equal Time.parse('2018-08-28T09:29:56+00:00'), order.completed_at
81
+ end
82
+
83
+ def test_cancelable?
84
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
85
+ .to_return(status: 200, body: GET_ORDER, headers: {})
86
+
87
+ order = Order.get('ord_kEn1PlbGa')
88
+ assert_equal true, order.is_cancelable
89
+ assert_equal true, order.cancelable?
90
+ end
91
+
92
+ def test_checkout_url
93
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
94
+ .to_return(status: 200, body: GET_ORDER, headers: {})
95
+
96
+ order = Order.get('ord_kEn1PlbGa')
97
+ assert_equal 'https://www.mollie.com/payscreen/order/checkout/kEn1PlbGa', order.checkout_url
98
+ end
99
+
100
+ def test_billing_address
101
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
102
+ .to_return(status: 200, body: GET_ORDER, headers: {})
103
+
104
+ order = Order.get('ord_kEn1PlbGa')
105
+ assert_equal 'Keizersgracht 313', order.billing_address.street_and_number
106
+ assert_equal '1016 EE', order.billing_address.postal_code
107
+ assert_equal 'Amsterdam', order.billing_address.city
108
+ assert_equal 'nl', order.billing_address.country
109
+ assert_equal 'Luke', order.billing_address.given_name
110
+ assert_equal 'Skywalker', order.billing_address.family_name
111
+ assert_equal 'luke@skywalker.com', order.billing_address.email
112
+ end
113
+
114
+ def test_shipping_address
115
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
116
+ .to_return(status: 200, body: GET_ORDER, headers: {})
117
+
118
+ order = Order.get('ord_kEn1PlbGa')
119
+ assert_equal 'Keizersgracht 313', order.shipping_address.street_and_number
120
+ assert_equal '1016 EE', order.shipping_address.postal_code
121
+ assert_equal 'Amsterdam', order.shipping_address.city
122
+ assert_equal 'nl', order.shipping_address.country
123
+ assert_equal 'Luke', order.shipping_address.given_name
124
+ assert_equal 'Skywalker', order.shipping_address.family_name
125
+ assert_equal 'luke@skywalker.com', order.shipping_address.email
126
+ end
127
+
128
+ def test_order_lines
129
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
130
+ .to_return(status: 200, body: GET_ORDER, headers: {})
131
+
132
+ order = Order.get('ord_kEn1PlbGa')
133
+ line = order.lines.first
134
+ assert order.lines.size == 2
135
+
136
+ assert_equal 'odl_dgtxyl', line.id
137
+ assert_equal 'ord_kEn1PlbGa', line.order_id
138
+ assert_equal 'LEGO 42083 Bugatti Chiron', line.name
139
+ assert_equal 'https://shop.lego.com/nl-NL/Bugatti-Chiron-42083', line.product_url
140
+ assert_equal 'https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$', line.image_url
141
+ assert_equal '5702016116977', line.sku
142
+ assert_equal 'physical', line.type
143
+ assert_equal 'created', line.status
144
+ assert_equal true, line.is_cancelable
145
+ assert_equal true, line.cancelable?
146
+ assert_equal 2, line.quantity
147
+ assert_equal 0, line.quantity_shipped
148
+ assert_equal 0, line.quantity_refunded
149
+ assert_equal 0, line.quantity_canceled
150
+ assert_equal '21.00', line.vat_rate
151
+
152
+ assert_equal BigDecimal('0'), line.amount_shipped.value
153
+ assert_equal 'EUR', line.amount_shipped.currency
154
+
155
+ assert_equal BigDecimal('0'), line.amount_refunded.value
156
+ assert_equal 'EUR', line.amount_refunded.currency
157
+
158
+ assert_equal BigDecimal('0'), line.amount_canceled.value
159
+ assert_equal 'EUR', line.amount_canceled.currency
160
+
161
+ assert_equal BigDecimal('399.0'), line.unit_price.value
162
+ assert_equal 'EUR', line.unit_price.currency
163
+
164
+ assert_equal 0, line.shippable_quantity
165
+ assert_equal 0, line.refundable_quantity
166
+ assert_equal 2, line.cancelable_quantity
167
+ assert_equal false, line.shippable?
168
+ assert_equal false, line.refundable?
169
+ assert_equal true, line.cancelable?
170
+
171
+ assert_equal BigDecimal('100.0'), line.discount_amount.value
172
+ assert_equal 'EUR', line.discount_amount.currency
173
+
174
+ assert_equal BigDecimal('698.0'), line.total_amount.value
175
+ assert_equal 'EUR', line.total_amount.currency
176
+
177
+ assert_equal BigDecimal('121.14'), line.vat_amount.value
178
+ assert_equal 'EUR', line.vat_amount.currency
179
+
180
+ assert_equal Time.parse('2018-08-02T09:29:56+00:00'), line.created_at
181
+ end
182
+
183
+ def test_create_order
184
+ minified_body = JSON.parse(CREATE_ORDER).to_json
185
+ stub_request(:post, 'https://api.mollie.com/v2/orders')
186
+ .with(body: minified_body)
187
+ .to_return(status: 201, body: GET_ORDER, headers: {})
188
+
189
+ order = Order.create(JSON.parse(CREATE_ORDER))
190
+
191
+ assert_kind_of Order, order
192
+ assert_equal 'ord_kEn1PlbGa', order.id
193
+ end
194
+
195
+ def test_update_order
196
+ minified_body = JSON.parse(UPDATE_ORDER).to_json
197
+ stub_request(:patch, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
198
+ .with(body: minified_body)
199
+ .to_return(status: 200, body: GET_ORDER, headers: {})
200
+
201
+ order = Order.update('ord_kEn1PlbGa', JSON.parse(UPDATE_ORDER))
202
+
203
+ assert_kind_of Order, order
204
+ assert_equal 'ord_kEn1PlbGa', order.id
205
+ end
206
+
207
+ def test_cancel_order
208
+ stub_request(:delete, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
209
+ .to_return(status: 200, body: GET_ORDER, headers: {})
210
+
211
+ order = Order.cancel('ord_kEn1PlbGa')
212
+ assert_nil order
213
+ end
214
+
215
+ def test_cancel_order_instance
216
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
217
+ .to_return(status: 200, body: GET_ORDER, headers: {})
218
+
219
+ stub_request(:delete, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
220
+ .to_return(status: 200, body: GET_ORDER, headers: {})
221
+
222
+ order = Order.get('ord_kEn1PlbGa')
223
+ assert_nil order.cancel
224
+ end
225
+
226
+ def test_list_orders
227
+ stub_request(:get, 'https://api.mollie.com/v2/orders')
228
+ .to_return(status: 200, body: LIST_ORDER, headers: {})
229
+
230
+ orders = Order.all
231
+ assert_equal 3, orders.size
232
+ assert_equal 'ord_one', orders[0].id
233
+ assert_equal 'ord_two', orders[1].id
234
+ assert_equal 'ord_three', orders[2].id
235
+ end
236
+
237
+ def test_create_order_refund
238
+ request_body = JSON.parse(CREATE_ORDER_REFUND, symbolize_names: true)
239
+
240
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
241
+ .to_return(status: 200, body: GET_ORDER, headers: {})
242
+
243
+ stub_request(:post, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/refunds')
244
+ .with(body: request_body.to_json)
245
+ .to_return(status: 201, body: GET_ORDER_REFUND, headers: {})
246
+
247
+ order = Order.get('ord_kEn1PlbGa')
248
+ refund = order.refund!(request_body)
249
+
250
+ assert_kind_of Order::Refund, refund
251
+ assert_equal 're_4qqhO89gsT', refund.id
252
+ assert_equal 'ord_kEn1PlbGa', refund.order_id
253
+ end
254
+
255
+ def test_refund_all_lines
256
+ request_body = JSON.parse(REFUND_ALL_LINES, symbolize_names: true)
257
+
258
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
259
+ .to_return(status: 200, body: GET_ORDER, headers: {})
260
+
261
+ stub_request(:post, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/refunds')
262
+ .with(body: request_body.to_json)
263
+ .to_return(status: 201, body: GET_ORDER_REFUND, headers: {})
264
+
265
+ order = Order.get('ord_kEn1PlbGa')
266
+ refund = order.refund!
267
+
268
+ assert_kind_of Order::Refund, refund
269
+ assert_equal 're_4qqhO89gsT', refund.id
270
+ assert_equal 'ord_kEn1PlbGa', refund.order_id
271
+ end
272
+
273
+ def test_list_order_refunds
274
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa')
275
+ .to_return(status: 200, body: GET_ORDER, headers: {})
276
+
277
+ stub_request(:get, 'https://api.mollie.com/v2/orders/ord_kEn1PlbGa/refunds')
278
+ .to_return(status: 200, body: LIST_ORDER_REFUNDS, headers: {})
279
+
280
+ order = Order.get('ord_kEn1PlbGa')
281
+ refunds = order.refunds
282
+
283
+ assert_equal 1, refunds.size
284
+ assert_kind_of Order::Refund, refunds.first
285
+ assert_equal 're_4qqhO89gsT', refunds.first.id
286
+ assert_equal 'ord_kEn1PlbGa', refunds.first.order_id
287
+ end
288
+ end
289
+ end