shopify_api 4.9.0 → 5.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +5 -5
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/probots.yml +2 -0
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +8 -0
  6. data/.travis.yml +0 -4
  7. data/CHANGELOG +63 -0
  8. data/README.md +36 -14
  9. data/lib/active_resource/detailed_log_subscriber.rb +25 -2
  10. data/lib/shopify_api/connection.rb +5 -3
  11. data/lib/shopify_api/limits.rb +1 -2
  12. data/lib/shopify_api/resources/abandoned_checkout.rb +7 -0
  13. data/lib/shopify_api/resources/access_scope.rb +5 -0
  14. data/lib/shopify_api/resources/api_permission.rb +9 -0
  15. data/lib/shopify_api/resources/asset.rb +8 -8
  16. data/lib/shopify_api/resources/billing_address.rb +1 -1
  17. data/lib/shopify_api/resources/checkout.rb +27 -1
  18. data/lib/shopify_api/resources/collection_publication.rb +10 -0
  19. data/lib/shopify_api/resources/currency.rb +6 -0
  20. data/lib/shopify_api/resources/custom_collection.rb +3 -3
  21. data/lib/shopify_api/resources/{customer_invite_message.rb → customer_invite.rb} +0 -0
  22. data/lib/shopify_api/resources/graphql.rb +22 -0
  23. data/lib/shopify_api/resources/image.rb +2 -2
  24. data/lib/shopify_api/resources/inventory_item.rb +6 -0
  25. data/lib/shopify_api/resources/inventory_level.rb +55 -0
  26. data/lib/shopify_api/resources/line_item.rb +9 -1
  27. data/lib/shopify_api/resources/location.rb +4 -0
  28. data/lib/shopify_api/resources/o_auth.rb +8 -0
  29. data/lib/shopify_api/resources/order.rb +16 -4
  30. data/lib/shopify_api/resources/payment.rb +7 -0
  31. data/lib/shopify_api/resources/ping.rb +3 -0
  32. data/lib/shopify_api/resources/ping/conversation.rb +42 -0
  33. data/lib/shopify_api/resources/ping/delivery_confirmation_details.rb +10 -0
  34. data/lib/shopify_api/resources/ping/message.rb +8 -0
  35. data/lib/shopify_api/resources/product.rb +4 -4
  36. data/lib/shopify_api/resources/product_publication.rb +10 -0
  37. data/lib/shopify_api/resources/publication.rb +5 -0
  38. data/lib/shopify_api/resources/shipping_line.rb +1 -1
  39. data/lib/shopify_api/resources/shipping_rate.rb +7 -0
  40. data/lib/shopify_api/resources/shop.rb +4 -4
  41. data/lib/shopify_api/resources/smart_collection.rb +6 -2
  42. data/lib/shopify_api/resources/tender_transaction.rb +6 -0
  43. data/lib/shopify_api/session.rb +1 -1
  44. data/lib/shopify_api/version.rb +1 -1
  45. data/service.yml +8 -0
  46. data/shopify_api.gemspec +4 -1
  47. data/test/abandoned_checkouts_test.rb +29 -0
  48. data/test/api_permission_test.rb +9 -0
  49. data/test/checkouts_test.rb +72 -4
  50. data/test/collection_publication_test.rb +40 -0
  51. data/test/currency_test.rb +21 -0
  52. data/test/detailed_log_subscriber_test.rb +19 -1
  53. data/test/fixtures/abandoned_checkout.json +184 -0
  54. data/test/fixtures/abandoned_checkouts.json +186 -0
  55. data/test/fixtures/checkout.json +160 -0
  56. data/test/fixtures/checkouts.json +25 -49
  57. data/test/fixtures/collection_publication.json +11 -0
  58. data/test/fixtures/collection_publications.json +13 -0
  59. data/test/fixtures/currencies.json +25 -0
  60. data/test/fixtures/inventory_level.json +7 -0
  61. data/test/fixtures/inventory_levels.json +24 -0
  62. data/test/fixtures/order_with_properties.json +373 -0
  63. data/test/fixtures/payment.json +7 -0
  64. data/test/fixtures/payments.json +9 -0
  65. data/test/fixtures/ping/conversation.json +1 -0
  66. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  67. data/test/fixtures/ping/message.json +1 -0
  68. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  69. data/test/fixtures/product_publication.json +11 -0
  70. data/test/fixtures/product_publications.json +13 -0
  71. data/test/fixtures/publications.json +9 -0
  72. data/test/fixtures/shipping_rates.json +12 -0
  73. data/test/fixtures/smart_collection_products.json +155 -0
  74. data/test/fixtures/tender_transactions.json +52 -0
  75. data/test/inventory_level_test.rb +59 -0
  76. data/test/location_test.rb +14 -0
  77. data/test/order_test.rb +29 -1
  78. data/test/payment_test.rb +19 -0
  79. data/test/ping/conversation_test.rb +71 -0
  80. data/test/ping/message_test.rb +23 -0
  81. data/test/product_publication_test.rb +40 -0
  82. data/test/publication_test.rb +12 -0
  83. data/test/session_test.rb +11 -11
  84. data/test/shipping_rate_test.rb +17 -0
  85. data/test/smart_collection_test.rb +25 -0
  86. data/test/tender_transaction_test.rb +18 -0
  87. data/test/test_helper.rb +8 -5
  88. data/test/variant_test.rb +4 -1
  89. metadata +102 -10
  90. data/lib/shopify_api/resources/discount.rb +0 -11
  91. data/test/discount_test.rb +0 -52
  92. data/test/fixtures/discount.json +0 -17
  93. data/test/fixtures/discount_disabled.json +0 -17
  94. data/test/fixtures/discounts.json +0 -34
@@ -0,0 +1,7 @@
1
+ {
2
+ "payment" : {
3
+ "amount": 10.00,
4
+ "session_id": "east-44a400ef20b36e38f10b882cb7260796",
5
+ "unique_token": "my-client-generated-idempotency-token"
6
+ }
7
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "payments" : [
3
+ {
4
+ "amount": 10.00,
5
+ "session_id": "east-44a400ef20b36e38f10b882cb7260796",
6
+ "unique_token": "my-client-generated-idempotency-token"
7
+ }
8
+ ]
9
+ }
@@ -0,0 +1 @@
1
+ {"conversation":{"id":"d315d4f7-53bd-49ec-8808-23f6db3c641a","name":"my topic","participants":{"counts":{"total":1},"data":[{"id":"test","name":"foo","avatar":null,"group":"customer"}]},"shopify_account":{"domain":"backpackinghacks.myshopify.com"}}}
@@ -0,0 +1 @@
1
+ {"delivery_confirmation_details":{"delivery_timestamp":"2018-08-29T22:16:05.589479Z","delivered":"false","details":"Integration failed to deliver message."}}
@@ -0,0 +1 @@
1
+ {"message":{"id":"d0c7a2e6-8084-4e79-8483-e4a1352b81f7","sender_id":"test","sender":{"id":"test","name":"foo","avatar":null,"group":"customer"},"content":{"text":"Hello from shopify_api"},"sent_at":"2018-08-29T22:16:05.589479Z"}}
@@ -0,0 +1 @@
1
+ {"delivery_confirmation_details":{"delivery_timestamp":"2018-08-29T22:16:05.589479Z","delivered":"true"}}
@@ -0,0 +1,11 @@
1
+ {
2
+ "product_publication": {
3
+ "id": 647162527768,
4
+ "publication_id": 55650051,
5
+ "published_at": "2018-01-29T14:06:08-05:00",
6
+ "published": true,
7
+ "created_at": "2018-01-29T14:06:08-05:00",
8
+ "updated_at": "2018-09-26T15:39:05-04:00",
9
+ "product_id": 8267093571
10
+ }
11
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "product_publications": [
3
+ {
4
+ "id": 647162527768,
5
+ "publication_id": 55650051,
6
+ "published_at": "2018-01-29T14:06:08-05:00",
7
+ "published": true,
8
+ "created_at": "2018-01-29T14:06:08-05:00",
9
+ "updated_at": "2018-09-26T15:39:05-04:00",
10
+ "product_id": 8267093571
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "publications": [
3
+ {
4
+ "id": 55650051,
5
+ "created_at": "2016-05-20T13:12:10-04:00",
6
+ "name": "Buy Button"
7
+ }
8
+ ]
9
+ }
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "id": "canada_post-INT.TP.BOGUS-4.00",
4
+ "price": "4.00",
5
+ "title": "Small Packet International Air Bogus"
6
+ },
7
+ {
8
+ "id": "canada_post-INT.TP.BOGUS-8.00",
9
+ "price": "8.00",
10
+ "title": "Medium Packet International Air Bogus"
11
+ }
12
+ ]
@@ -0,0 +1,155 @@
1
+ {
2
+ "products": [
3
+ {
4
+ "product_type": "Cult Products",
5
+ "handle": "ipod-nano",
6
+ "created_at": "2011-10-20T14:05:13-04:00",
7
+ "body_html": "<p>It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.</p>",
8
+ "title": "IPod Nano - 8GB",
9
+ "template_suffix": null,
10
+ "updated_at": "2011-10-20T14:05:13-04:00",
11
+ "id": 632910392,
12
+ "tags": "Emotive, Flash Memory, MP3, Music",
13
+ "images": [
14
+ {
15
+ "position": 1,
16
+ "created_at": "2011-10-20T14:05:13-04:00",
17
+ "product_id": 632910392,
18
+ "updated_at": "2011-10-20T14:05:13-04:00",
19
+ "src": "http://static.shopify.com/s/files/1/6909/3384/products/ipod-nano.png?0",
20
+ "id": 850703190
21
+ }
22
+ ],
23
+ "variants": [
24
+ {
25
+ "position": 1,
26
+ "price": "199.00",
27
+ "product_id": 632910392,
28
+ "created_at": "2011-10-20T14:05:13-04:00",
29
+ "requires_shipping": true,
30
+ "title": "Pink",
31
+ "inventory_quantity": 10,
32
+ "compare_at_price": null,
33
+ "inventory_policy": "continue",
34
+ "updated_at": "2011-10-20T14:05:13-04:00",
35
+ "inventory_management": "shopify",
36
+ "id": 808950810,
37
+ "taxable": true,
38
+ "grams": 200,
39
+ "sku": "IPOD2008PINK",
40
+ "option1": "Pink",
41
+ "fulfillment_service": "manual",
42
+ "option2": null,
43
+ "option3": null
44
+ },
45
+ {
46
+ "position": 2,
47
+ "price": "199.00",
48
+ "product_id": 632910392,
49
+ "created_at": "2011-10-20T14:05:13-04:00",
50
+ "requires_shipping": true,
51
+ "title": "Red",
52
+ "inventory_quantity": 20,
53
+ "compare_at_price": null,
54
+ "inventory_policy": "continue",
55
+ "updated_at": "2011-10-20T14:05:13-04:00",
56
+ "inventory_management": "shopify",
57
+ "id": 49148385,
58
+ "taxable": true,
59
+ "grams": 200,
60
+ "sku": "IPOD2008RED",
61
+ "option1": "Red",
62
+ "fulfillment_service": "manual",
63
+ "option2": null,
64
+ "option3": null
65
+ },
66
+ {
67
+ "position": 3,
68
+ "price": "199.00",
69
+ "product_id": 632910392,
70
+ "created_at": "2011-10-20T14:05:13-04:00",
71
+ "requires_shipping": true,
72
+ "title": "Green",
73
+ "inventory_quantity": 30,
74
+ "compare_at_price": null,
75
+ "inventory_policy": "continue",
76
+ "updated_at": "2011-10-20T14:05:13-04:00",
77
+ "inventory_management": "shopify",
78
+ "id": 39072856,
79
+ "taxable": true,
80
+ "grams": 200,
81
+ "sku": "IPOD2008GREEN",
82
+ "option1": "Green",
83
+ "fulfillment_service": "manual",
84
+ "option2": null,
85
+ "option3": null
86
+ },
87
+ {
88
+ "position": 4,
89
+ "price": "199.00",
90
+ "product_id": 632910392,
91
+ "created_at": "2011-10-20T14:05:13-04:00",
92
+ "requires_shipping": true,
93
+ "title": "Black",
94
+ "inventory_quantity": 40,
95
+ "compare_at_price": null,
96
+ "inventory_policy": "continue",
97
+ "updated_at": "2011-10-20T14:05:13-04:00",
98
+ "inventory_management": "shopify",
99
+ "id": 457924702,
100
+ "taxable": true,
101
+ "grams": 200,
102
+ "sku": "IPOD2008BLACK",
103
+ "option1": "Black",
104
+ "fulfillment_service": "manual",
105
+ "option2": null,
106
+ "option3": null
107
+ }
108
+ ],
109
+ "vendor": "Apple",
110
+ "published_at": "2007-12-31T19:00:00-05:00",
111
+ "manually_sorted": true,
112
+ "options": [
113
+ {
114
+ "name": "Title"
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "product_type": "Cult Products",
120
+ "handle": "ipod-touch",
121
+ "created_at": "2018-09-26T14:05:13-04:00",
122
+ "body_html": "<p>The iPod Touch has the iPhone's multi-touch interface, with a physical home button off the touch screen. The home screen has a list of buttons for the available applications.</p>",
123
+ "title": "IPod Touch 8GB",
124
+ "template_suffix": null,
125
+ "updated_at": "2018-09-26T14:05:13-04:00",
126
+ "id": 921728736,
127
+ "tags": null,
128
+ "variants": [
129
+ {
130
+ "id": 447654529,
131
+ "title": "Black",
132
+ "price": "199.00",
133
+ "sku": "IPOD2009BLACK",
134
+ "position": 1,
135
+ "inventory_policy": "continue",
136
+ "compare_at_price": null,
137
+ "fulfillment_service": "manual",
138
+ "inventory_management": "shopify",
139
+ "option1": "Black",
140
+ "option2": null,
141
+ "option3": null,
142
+ "created_at": "2018-09-26T14:05:13-04:00",
143
+ "updated_at": "2018-09-26T14:05:13-04:00",
144
+ "taxable": true,
145
+ "grams": 567,
146
+ "inventory_quantity": 13,
147
+ "requires_shipping": true
148
+ }
149
+ ],
150
+ "vendor": "Apple",
151
+ "published_at": "2018-09-26T14:05:13-04:00",
152
+ "manually_sorted": true
153
+ }
154
+ ]
155
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "tender_transactions": [
3
+ {
4
+ "id": 1,
5
+ "order_id": 450789469,
6
+ "amount": "138.46",
7
+ "currency": "CAD",
8
+ "user_id": null,
9
+ "test": true,
10
+ "processed_at": "2018-08-09T15:43:39-04:00",
11
+ "updated_at": "2018-08-09T15:43:41-04:00",
12
+ "remote_reference": "1118366",
13
+ "payment_method": "credit_card",
14
+ "payment_details": {
15
+ "credit_card_number": "•••• •••• •••• 1",
16
+ "credit_card_company": "Bogus"
17
+ }
18
+ },
19
+ {
20
+ "id": 2,
21
+ "order_id": 450789469,
22
+ "amount": "128.16",
23
+ "currency": "CAD",
24
+ "user_id": null,
25
+ "test": true,
26
+ "processed_at": "2018-08-11T15:43:39-04:00",
27
+ "updated_at": "2018-08-09T15:43:41-04:00",
28
+ "remote_reference": "1118367",
29
+ "payment_method": "credit_card",
30
+ "payment_details": {
31
+ "credit_card_number": "•••• •••• •••• 2",
32
+ "credit_card_company": "Bogus"
33
+ }
34
+ },
35
+ {
36
+ "id": 3,
37
+ "order_id": 450789469,
38
+ "amount": "28.16",
39
+ "currency": "CAD",
40
+ "user_id": null,
41
+ "test": true,
42
+ "processed_at": "2018-08-12T15:43:39-04:00",
43
+ "updated_at": "2018-08-09T15:43:41-04:00",
44
+ "remote_reference": "1118368",
45
+ "payment_method": "credit_card",
46
+ "payment_details": {
47
+ "credit_card_number": "•••• •••• •••• 3",
48
+ "credit_card_company": "Bogus"
49
+ }
50
+ }
51
+ ]
52
+ }
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ class InventoryLevelTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ @inventory_level_response = ActiveSupport::JSON.decode load_fixture('inventory_level')
7
+ @inventory_level = ShopifyAPI::InventoryLevel.new(@inventory_level_response['inventory_level'])
8
+ end
9
+
10
+ test ".find with inventory_item_ids and location_ids returns expected inventory levels" do
11
+ params = { inventory_item_ids: [808950810, 39072856], location_ids: [905684977, 487838322] }
12
+ fake "inventory_levels.json?#{params.to_param}", extension: false, method: :get,
13
+ status: 200, body: load_fixture('inventory_levels')
14
+ inventory_levels = ShopifyAPI::InventoryLevel.find(:all, params: params)
15
+
16
+ assert inventory_levels.all? { |item|
17
+ params[:location_ids].include?(item.location_id) &&
18
+ params[:inventory_item_ids].include?(item.inventory_item_id)
19
+ }, message: 'Response contained inventory_items or locations not requested.'
20
+ end
21
+
22
+ test '#adjust with adjustment value returns inventory_level with available increased by adjustment value' do
23
+ adjustment = 5
24
+ updated_available = @inventory_level.available + adjustment
25
+ @inventory_level_response[:available] = updated_available
26
+
27
+ fake 'inventory_levels/adjust', method: :post, body: ActiveSupport::JSON.encode(@inventory_level_response)
28
+ @inventory_level.adjust(adjustment)
29
+ assert_equal updated_available, @inventory_level.available
30
+ end
31
+
32
+ test '#connect saves an inventory_level associated with inventory_item and location_id' do
33
+ params = { inventory_item_id: 808950810, location_id: 99999999 }
34
+ response = params.clone
35
+ response[:available] = 0
36
+
37
+ fake 'inventory_levels/connect', method: :post, body: ActiveSupport::JSON.encode(response)
38
+ inventory_level = ShopifyAPI::InventoryLevel.new(params)
39
+ inventory_level.connect
40
+ assert_equal 0, inventory_level.available, message: 'expected newly connected location to have 0 inventory'
41
+ end
42
+
43
+ test '#destroy removes inventory_level and returns nil' do
44
+ params = { inventory_item_id: @inventory_level.inventory_item_id, location_id: @inventory_level.location_id }
45
+ fake "inventory_levels.json?#{params.to_param}", extension: false, method: :delete, status: 204, body: nil
46
+ assert_nil @inventory_level.destroy
47
+ end
48
+
49
+ test '#set with available value returns inventory_level with available as the available value' do
50
+ available = 13
51
+ response = @inventory_level_response.clone
52
+ response['inventory_level']['available'] = available
53
+
54
+ fake 'inventory_levels/set', method: :post, body: ActiveSupport::JSON.encode(response)
55
+ @inventory_level.set(available)
56
+
57
+ assert_equal available, @inventory_level.available
58
+ end
59
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class LocationTest < Test::Unit::TestCase
4
+ test '#inventory_levels returns all inventory_levels associated with this location' do
5
+ location = ShopifyAPI::Location.new(id: 487838322)
6
+ expected_body = JSON.parse(load_fixture('inventory_levels'))
7
+ expected_body['inventory_levels'].delete_if {|level| level['location_id'] != location.id }
8
+ fake "locations/#{location.id}/inventory_levels", method: :get, status: 200, body: JSON(expected_body).to_s
9
+ inventory_levels = location.inventory_levels
10
+
11
+ assert inventory_levels.all? { |item| item.location_id == location.id },
12
+ message: 'Response contained locations other than the current location.'
13
+ end
14
+ end
data/test/order_test.rb CHANGED
@@ -8,12 +8,25 @@ class OrderTest < Test::Unit::TestCase
8
8
  assert_equal 39072856, order.line_items.first.variant_id
9
9
  end
10
10
 
11
+ test "create should create an order with custom properties" do
12
+ props = [{ :"By default may label with \"Roasted for " => { :"Your First Name" => { :"\". If you want something specific on the label, enter it here:" => "" }}}]
13
+ fake 'orders', :method => :post, :status => 201, :body => load_fixture('order_with_properties')
14
+ order = ShopifyAPI::Order.create(line_items: [{quantity:1, variant_id:39072856, properties:props}], financial_status:"authorized")
15
+ assert_equal 39072856, order.line_items.first.variant_id
16
+ end
17
+
11
18
  test "get should get an order" do
12
19
  fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order')
13
20
  order = ShopifyAPI::Order.find(450789469)
14
21
  assert_equal 450789469, order.id
15
22
  end
16
23
 
24
+ test "get should get an order with custom properties" do
25
+ fake 'orders/450789469', :method => :get, :status => 200, :body => load_fixture('order_with_properties')
26
+ order = ShopifyAPI::Order.find(450789469)
27
+ assert_equal 450789469, order.id
28
+ end
29
+
17
30
  test "get all should get all orders" do
18
31
  fake 'orders', :method => :get, :status => 200, :body => load_fixture('orders')
19
32
  order = ShopifyAPI::Order.all
@@ -43,5 +56,20 @@ class OrderTest < Test::Unit::TestCase
43
56
  order.cancel(email: false, restock: true)
44
57
  assert_request_body({'email' => false, 'restock' => true}.to_json)
45
58
  end
46
- end
47
59
 
60
+ test "capture an order with currency param" do
61
+ fake 'orders/450789469', body: load_fixture('order')
62
+ order = ShopifyAPI::Order.find(450789469)
63
+
64
+ fake 'orders/450789469/transactions', method: :post, status: 201, body: load_fixture('transaction')
65
+ order.capture(100.00, currency: 'CAD')
66
+
67
+ assert_request_body({
68
+ transaction: {
69
+ amount: 100.00,
70
+ kind: 'capture',
71
+ currency: 'CAD',
72
+ },
73
+ }.to_json)
74
+ end
75
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ class PaymentTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+
8
+ @checkout_id = JSON.parse(load_fixture('checkout'))['checkout']['token']
9
+ @expected_payment = JSON.parse(load_fixture('payment'))['payment']
10
+ end
11
+
12
+ test ":create creates a new payment" do
13
+ fake "checkouts/#{@checkout_id}/payments", method: :post, status: 201, body: load_fixture('payment')
14
+
15
+ new_payment = ShopifyAPI::Payment.create(checkout_id: @checkout_id)
16
+
17
+ assert_equal @expected_payment['unique_token'], new_payment.attributes['unique_token']
18
+ end
19
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class PingConversationTest < Test::Unit::TestCase
6
+ def test_create_conversation
7
+ fake "api/ping-api/v1/conversations", method: :post, body: load_fixture('ping/conversation')
8
+
9
+ conversation = ShopifyAPI::Ping::Conversation.new(
10
+ topic: 'my topic',
11
+ participants: [
12
+ {
13
+ name: 'foo',
14
+ id: 'test',
15
+ group: 'customer',
16
+ },
17
+ ]
18
+ )
19
+
20
+ conversation.save
21
+
22
+ assert_equal "d315d4f7-53bd-49ec-8808-23f6db3c641a", conversation.id
23
+ end
24
+
25
+ def test_send_message
26
+ fake "api/ping-api/v1/conversations/123/messages", method: :post, body: load_fixture('ping/message')
27
+
28
+ conversation = ShopifyAPI::Ping::Conversation.new(id: '123')
29
+ message = conversation.send_message(
30
+ dedupe_key: SecureRandom.uuid,
31
+ content: {
32
+ text: "Hello from shopify_api",
33
+ },
34
+ sender_id: 'test',
35
+ )
36
+
37
+ assert_equal "d0c7a2e6-8084-4e79-8483-e4a1352b81f7", message.id
38
+ end
39
+
40
+ def test_successful_delivery
41
+ fake("api/ping-api/v1/conversations/123/messages/111/delivery_confirmation",
42
+ method: :post,
43
+ body: load_fixture('ping/successful_delivery_confirmation'))
44
+
45
+ conversation = ShopifyAPI::Ping::Conversation.new(id: '123')
46
+ delivery_confirmation = conversation.successful_delivery(
47
+ message_id: '111',
48
+ delivery_timestamp: "2018-08-29T22:16:05.589479Z"
49
+ )
50
+
51
+ assert_equal("true", delivery_confirmation.delivered)
52
+ assert_equal("2018-08-29T22:16:05.589479Z", delivery_confirmation.delivery_timestamp)
53
+ end
54
+
55
+ def test_failed_delivery
56
+ fake("api/ping-api/v1/conversations/123/messages/111/delivery_confirmation",
57
+ method: :post,
58
+ body: load_fixture('ping/failed_delivery_confirmation'))
59
+
60
+ conversation = ShopifyAPI::Ping::Conversation.new(id: '123')
61
+ delivery_confirmation = conversation.failed_delivery(
62
+ message_id: '111',
63
+ delivery_timestamp: Time.now.to_s,
64
+ details: "Integration failed to deliver message."
65
+ )
66
+
67
+ assert_equal("false", delivery_confirmation.delivered)
68
+ assert_equal("2018-08-29T22:16:05.589479Z", delivery_confirmation.delivery_timestamp)
69
+ assert_equal("Integration failed to deliver message.", delivery_confirmation.details)
70
+ end
71
+ end