coinbase 0.0.1 → 4.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.

Potentially problematic release.


This version of coinbase might be problematic. Click here for more details.

Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +7 -0
  4. data/CONTRIBUTING.md +53 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +201 -0
  7. data/README.md +615 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/coinbase.gemspec +26 -0
  12. data/lib/coinbase/util.rb +16 -0
  13. data/lib/coinbase/wallet/adapters/em_http.rb +78 -0
  14. data/lib/coinbase/wallet/adapters/net_http.rb +68 -0
  15. data/lib/coinbase/wallet/api_client.rb +755 -0
  16. data/lib/coinbase/wallet/api_errors.rb +120 -0
  17. data/lib/coinbase/wallet/api_response.rb +41 -0
  18. data/lib/coinbase/wallet/ca-coinbase.crt +78 -0
  19. data/lib/coinbase/wallet/client.rb +101 -0
  20. data/lib/coinbase/wallet/coinbase-callback.pub +14 -0
  21. data/lib/coinbase/wallet/models/account.rb +193 -0
  22. data/lib/coinbase/wallet/models/address.rb +12 -0
  23. data/lib/coinbase/wallet/models/api_object.rb +46 -0
  24. data/lib/coinbase/wallet/models/checkout.rb +19 -0
  25. data/lib/coinbase/wallet/models/order.rb +12 -0
  26. data/lib/coinbase/wallet/models/transaction.rb +21 -0
  27. data/lib/coinbase/wallet/models/transfer.rb +13 -0
  28. data/lib/coinbase/wallet/models/user.rb +15 -0
  29. data/lib/coinbase/wallet/version.rb +5 -0
  30. data/lib/coinbase/wallet.rb +24 -156
  31. data/spec/account_spec.rb +199 -0
  32. data/spec/callback_signature_verification_spec.rb +16 -0
  33. data/spec/clients/client_spec.rb +34 -0
  34. data/spec/clients/oauth_client_spec.rb +56 -0
  35. data/spec/endpoints_spec.rb +352 -0
  36. data/spec/error_spec.rb +137 -0
  37. data/spec/models/address_spec.rb +26 -0
  38. data/spec/models/api_object_spec.rb +63 -0
  39. data/spec/models/checkout_spec.rb +52 -0
  40. data/spec/models/current_user_spec.rb +29 -0
  41. data/spec/models/order_spec.rb +52 -0
  42. data/spec/models/request_spec.rb +47 -0
  43. data/spec/models/transfer_spec.rb +64 -0
  44. data/spec/models/user_spec.rb +24 -0
  45. data/spec/spec_helper.rb +13 -0
  46. metadata +66 -110
  47. data/lib/coinbase/address.rb +0 -127
  48. data/lib/coinbase/asset.rb +0 -20
  49. data/lib/coinbase/balance_map.rb +0 -48
  50. data/lib/coinbase/constants.rb +0 -38
  51. data/lib/coinbase/network.rb +0 -55
  52. data/lib/coinbase/transfer.rb +0 -153
  53. data/lib/coinbase.rb +0 -18
@@ -0,0 +1,352 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coinbase::Wallet do
4
+ before :all do
5
+ @client = Coinbase::Wallet::Client.new(api_key: 'api_key', api_secret: 'api_secret')
6
+ end
7
+
8
+ #
9
+ # Data API
10
+ #
11
+ it "gets currencies" do
12
+ stub_request(:get, "https://api.coinbase.com/v2/currencies")
13
+ .to_return(body: { data: mock_collection }.to_json)
14
+ expect(@client.currencies).to eq mock_collection
15
+ end
16
+
17
+ it "gets exchange rates" do
18
+ stub_request(:get, "https://api.coinbase.com/v2/exchange-rates")
19
+ .to_return(body: { data: mock_item }.to_json)
20
+ expect(@client.exchange_rates).to eq mock_item
21
+ end
22
+
23
+ it "gets buy price" do
24
+ stub_request(:get, "https://api.coinbase.com/v2/prices/BTC-USD/buy")
25
+ .to_return(body: { data: mock_item }.to_json)
26
+ expect(@client.buy_price).to eq mock_item
27
+ end
28
+
29
+ it "gets sell price" do
30
+ stub_request(:get, "https://api.coinbase.com/v2/prices/BTC-USD/sell")
31
+ .to_return(body: { data: mock_item }.to_json)
32
+ expect(@client.sell_price).to eq mock_item
33
+ end
34
+
35
+ it "gets spot price" do
36
+ stub_request(:get, "https://api.coinbase.com/v2/prices/BTC-USD/spot")
37
+ .to_return(body: { data: mock_item }.to_json)
38
+ expect(@client.spot_price).to eq mock_item
39
+ end
40
+
41
+ it "gets time" do
42
+ stub_request(:get, "https://api.coinbase.com/v2/time")
43
+ .to_return(body: { data: mock_item }.to_json)
44
+ expect(@client.time).to eq mock_item
45
+ end
46
+
47
+ #
48
+ # Wallet API
49
+ #
50
+ it "gets user" do
51
+ stub_request(:get, "https://api.coinbase.com/v2/users/test")
52
+ .to_return(body: { data: mock_item }.to_json)
53
+ expect(@client.user('test')).to eq mock_item
54
+ end
55
+
56
+ it "gets current user" do
57
+ stub_request(:get, "https://api.coinbase.com/v2/user")
58
+ .to_return(body: { data: mock_item }.to_json)
59
+ expect(@client.current_user).to eq mock_item
60
+ end
61
+
62
+ it "gets authorization info" do
63
+ stub_request(:get, "https://api.coinbase.com/v2/user/auth")
64
+ .to_return(body: { data: mock_item }.to_json)
65
+ expect(@client.auth_info).to eq mock_item
66
+ end
67
+
68
+ it "updates current user" do
69
+ stub_request(:put, "https://api.coinbase.com/v2/user")
70
+ .to_return(body: { data: mock_item }.to_json)
71
+ expect(@client.update_current_user(name: "test")).to eq mock_item
72
+ end
73
+
74
+ it "gets accounts" do
75
+ stub_request(:get, "https://api.coinbase.com/v2/accounts")
76
+ .to_return(body: { data: mock_collection }.to_json)
77
+ expect(@client.accounts).to eq mock_collection
78
+ end
79
+
80
+ it "gets account" do
81
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test")
82
+ .to_return(body: { data: mock_item }.to_json)
83
+ expect(@client.account("test")).to eq mock_item
84
+ end
85
+
86
+ it "gets account" do
87
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/primary")
88
+ .to_return(body: { data: mock_item }.to_json)
89
+ expect(@client.primary_account).to eq mock_item
90
+ end
91
+
92
+ it "creates account" do
93
+ stub_request(:post, "https://api.coinbase.com/v2/accounts")
94
+ .to_return(body: { data: mock_item }.to_json)
95
+ expect(@client.create_account).to eq mock_item
96
+ end
97
+
98
+ it "changes primary account" do
99
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/primary")
100
+ .to_return(body: { data: mock_item }.to_json)
101
+ expect(@client.set_primary_account("test")).to eq mock_item
102
+ end
103
+
104
+ it "updates accounts" do
105
+ stub_request(:put, "https://api.coinbase.com/v2/accounts/test")
106
+ .to_return(body: { data: mock_item }.to_json)
107
+ expect(@client.update_account("test", name: "new name")).to eq mock_item
108
+ end
109
+
110
+ it "deletes accounts" do
111
+ stub_request(:delete, "https://api.coinbase.com/v2/accounts/test")
112
+ .to_return(body: { data: mock_item }.to_json)
113
+ expect(@client.delete_account("test")).to eq mock_item
114
+ end
115
+
116
+ it "gets addresses" do
117
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test/addresses")
118
+ .to_return(body: { data: mock_collection }.to_json)
119
+ expect(@client.addresses("test")).to eq mock_collection
120
+ end
121
+
122
+ it "gets address" do
123
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test1/addresses/test2")
124
+ .to_return(body: { data: mock_item }.to_json)
125
+ expect(@client.address("test1", "test2")).to eq mock_item
126
+ end
127
+
128
+ it "gets address transactions" do
129
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test1/addresses/test2/transactions")
130
+ .to_return(body: { data: mock_collection }.to_json)
131
+ expect(@client.address_transactions("test1", "test2")).to eq mock_collection
132
+ end
133
+
134
+ it "creates address" do
135
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test1/addresses")
136
+ .to_return(body: { data: mock_item }.to_json)
137
+ expect(@client.create_address("test1")).to eq mock_item
138
+ end
139
+
140
+ it "gets transactions" do
141
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test/transactions")
142
+ .to_return(body: { data: mock_collection }.to_json)
143
+ expect(@client.transactions("test")).to eq mock_collection
144
+ end
145
+
146
+ it "gets transaction" do
147
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test1/transactions/test2")
148
+ .to_return(body: { data: mock_item }.to_json)
149
+ expect(@client.transaction("test1", "test2")).to eq mock_item
150
+ end
151
+
152
+ it "sends money" do
153
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/transactions")
154
+ .to_return(body: { data: mock_item }.to_json)
155
+ expect(@client.send("test", amount: 10, to: 'example@coinbase.com')).to eq mock_item
156
+ end
157
+
158
+ it "transfers money" do
159
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/transactions")
160
+ .to_return(body: { data: mock_item }.to_json)
161
+ expect(@client.transfer("test", amount: 10, to: 'example@coinbase.com')).to eq mock_item
162
+ end
163
+
164
+ it "requests money" do
165
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/transactions")
166
+ .to_return(body: { data: mock_item }.to_json)
167
+ expect(@client.request("test", amount: 10, currency: 'BTC', to: 'example@coinbase.com')).to eq mock_item
168
+ end
169
+
170
+ it "completes request" do
171
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test1/transactions/test2/complete")
172
+ .to_return(body: { data: mock_item }.to_json)
173
+ expect(@client.complete_request("test1", "test2")).to eq mock_item
174
+ end
175
+
176
+ it "re-sends request" do
177
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test1/transactions/test2/resend")
178
+ .to_return(body: { data: mock_item }.to_json)
179
+ expect(@client.resend_request("test1", "test2")).to eq mock_item
180
+ end
181
+
182
+ it "cancels request" do
183
+ stub_request(:delete, "https://api.coinbase.com/v2/accounts/test1/transactions/test2")
184
+ .to_return(body: { data: mock_item }.to_json)
185
+ expect(@client.cancel_request("test1", "test2")).to eq mock_item
186
+ end
187
+
188
+ it "lists buys" do
189
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test/buys")
190
+ .to_return(body: { data: mock_collection }.to_json)
191
+ expect(@client.list_buys("test")).to eq mock_collection
192
+ end
193
+
194
+ it "lists buy" do
195
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test1/buys/test2")
196
+ .to_return(body: { data: mock_item }.to_json)
197
+ expect(@client.list_buy("test1", "test2")).to eq mock_item
198
+ end
199
+
200
+ it "buys bitcoin" do
201
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/buys")
202
+ .to_return(body: { data: mock_item }.to_json)
203
+ expect(@client.buy("test", amount: 10, currency: 'BTC')).to eq mock_item
204
+ end
205
+
206
+ it "commits buy" do
207
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test1/buys/test2/commit")
208
+ .to_return(body: { data: mock_item }.to_json)
209
+ expect(@client.commit_buy("test1", "test2")).to eq mock_item
210
+ end
211
+
212
+ it "lists sells" do
213
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test/sells")
214
+ .to_return(body: { data: mock_collection }.to_json)
215
+ expect(@client.list_sells("test")).to eq mock_collection
216
+ end
217
+
218
+ it "lists sell" do
219
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test1/sells/test2")
220
+ .to_return(body: { data: mock_item }.to_json)
221
+ expect(@client.list_sell("test1", "test2")).to eq mock_item
222
+ end
223
+
224
+ it "sells bitcoin" do
225
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/sells")
226
+ .to_return(body: { data: mock_item }.to_json)
227
+ expect(@client.sell("test", amount: 10, currency: 'BTC')).to eq mock_item
228
+ end
229
+
230
+ it "commits sell" do
231
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test1/sells/test2/commit")
232
+ .to_return(body: { data: mock_item }.to_json)
233
+ expect(@client.commit_sell("test1", "test2")).to eq mock_item
234
+ end
235
+
236
+ it "lists deposits" do
237
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test/deposits")
238
+ .to_return(body: { data: mock_collection }.to_json)
239
+ expect(@client.list_deposits("test")).to eq mock_collection
240
+ end
241
+
242
+ it "lists deposit" do
243
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test1/deposits/test2")
244
+ .to_return(body: { data: mock_item }.to_json)
245
+ expect(@client.list_deposit("test1", "test2")).to eq mock_item
246
+ end
247
+
248
+ it "deposits bitcoin" do
249
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/deposits")
250
+ .to_return(body: { data: mock_item }.to_json)
251
+ expect(@client.deposit("test", amount: 10, currency: 'BTC')).to eq mock_item
252
+ end
253
+
254
+ it "commits deposit" do
255
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test1/deposits/test2/commit")
256
+ .to_return(body: { data: mock_item }.to_json)
257
+ expect(@client.commit_deposit("test1", "test2")).to eq mock_item
258
+ end
259
+
260
+ it "lists withdrawals" do
261
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test/withdrawals")
262
+ .to_return(body: { data: mock_collection }.to_json)
263
+ expect(@client.list_withdrawals("test")).to eq mock_collection
264
+ end
265
+
266
+ it "lists withdrawal" do
267
+ stub_request(:get, "https://api.coinbase.com/v2/accounts/test1/withdrawals/test2")
268
+ .to_return(body: { data: mock_item }.to_json)
269
+ expect(@client.list_withdrawal("test1", "test2")).to eq mock_item
270
+ end
271
+
272
+ it "withdrawals bitcoin" do
273
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test/withdrawals")
274
+ .to_return(body: { data: mock_item }.to_json)
275
+ expect(@client.withdraw("test", amount: 10, currency: 'BTC')).to eq mock_item
276
+ end
277
+
278
+ it "commits withdrawal" do
279
+ stub_request(:post, "https://api.coinbase.com/v2/accounts/test1/withdrawals/test2/commit")
280
+ .to_return(body: { data: mock_item }.to_json)
281
+ expect(@client.commit_withdrawal("test1", "test2")).to eq mock_item
282
+ end
283
+
284
+ it "gets payment methods" do
285
+ stub_request(:get, "https://api.coinbase.com/v2/payment-methods")
286
+ .to_return(body: { data: mock_collection }.to_json)
287
+ expect(@client.payment_methods).to eq mock_collection
288
+ end
289
+
290
+ #
291
+ # Merchant API
292
+ #
293
+ it "gets merchant" do
294
+ stub_request(:get, "https://api.coinbase.com/v2/merchants/test")
295
+ .to_return(body: { data: mock_item }.to_json)
296
+ expect(@client.merchant('test')).to eq mock_item
297
+ end
298
+
299
+ it "gets merchant orders" do
300
+ stub_request(:get, "https://api.coinbase.com/v2/orders")
301
+ .to_return(body: { data: mock_collection }.to_json)
302
+ expect(@client.orders).to eq mock_collection
303
+ end
304
+
305
+ it "gets merchant order" do
306
+ stub_request(:get, "https://api.coinbase.com/v2/orders/test")
307
+ .to_return(body: { data: mock_item }.to_json)
308
+ expect(@client.order("test")).to eq mock_item
309
+ end
310
+
311
+ it "creates an order" do
312
+ stub_request(:post, "https://api.coinbase.com/v2/orders")
313
+ .to_return(body: { data: mock_item }.to_json)
314
+ expect(@client.create_order(name: "test", amount: 10, currency: "BTC")).to eq mock_item
315
+ end
316
+
317
+ it "refunds merchant order" do
318
+ stub_request(:post, "https://api.coinbase.com/v2/orders/test/refund")
319
+ .to_return(body: { data: mock_item }.to_json)
320
+ expect(@client.refund_order("test", currency: "BTC")).to eq mock_item
321
+ end
322
+
323
+ it "gets checkouts" do
324
+ stub_request(:get, "https://api.coinbase.com/v2/checkouts")
325
+ .to_return(body: { data: mock_collection }.to_json)
326
+ expect(@client.checkouts).to eq mock_collection
327
+ end
328
+
329
+ it "gets checkout" do
330
+ stub_request(:get, "https://api.coinbase.com/v2/checkouts/test")
331
+ .to_return(body: { data: mock_item }.to_json)
332
+ expect(@client.checkout("test")).to eq mock_item
333
+ end
334
+
335
+ it "creates checkout" do
336
+ stub_request(:post, "https://api.coinbase.com/v2/checkouts")
337
+ .to_return(body: { data: mock_item }.to_json)
338
+ expect(@client.create_checkout(name: "test", amount: 10, currency: "BTC")).to eq mock_item
339
+ end
340
+
341
+ it "gets checkout orders" do
342
+ stub_request(:get, "https://api.coinbase.com/v2/checkouts/test/orders")
343
+ .to_return(body: { data: mock_collection }.to_json)
344
+ expect(@client.checkout_orders("test")).to eq mock_collection
345
+ end
346
+
347
+ it "creates checkout order" do
348
+ stub_request(:post, "https://api.coinbase.com/v2/checkouts/test/orders")
349
+ .to_return(body: { data: mock_item }.to_json)
350
+ expect(@client.create_checkout_order("test")).to eq mock_item
351
+ end
352
+ end
@@ -0,0 +1,137 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coinbase::Wallet do
4
+ before :all do
5
+ @client = Coinbase::Wallet::Client.new(api_key: 'api_key', api_secret: 'api_secret')
6
+ end
7
+
8
+ it "passes" do
9
+ expect(1).to eq(1)
10
+ end
11
+
12
+ it "handles param_required" do
13
+ stub_request(:get, /.*/)
14
+ .to_return(body: { errors: [{ id: 'param_required', message: 'test' }] }.to_json,
15
+ status: 400)
16
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::ParamRequiredError
17
+ end
18
+
19
+ it "handles invalid_request" do
20
+ stub_request(:get, /.*/)
21
+ .to_return(body: { errors: [{ id: 'invalid_request', message: 'test' }] }.to_json,
22
+ status: 400)
23
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::InvalidRequestError
24
+ end
25
+
26
+ it "handles personal_details_required" do
27
+ stub_request(:get, /.*/)
28
+ .to_return(body: { errors: [{ id: 'personal_details_required', message: 'test' }] }.to_json,
29
+ status: 400)
30
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::PersonalDetailsRequiredError
31
+ end
32
+
33
+ it "handles obscure 400" do
34
+ stub_request(:get, /.*/)
35
+ .to_return(body: { errors: [{ id: 'obscure_400', message: 'test' }] }.to_json,
36
+ status: 400)
37
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::BadRequestError
38
+ end
39
+
40
+ it "handles authentication_error" do
41
+ stub_request(:get, /.*/)
42
+ .to_return(body: { errors: [{ id: 'authentication_error', message: 'test' }] }.to_json,
43
+ status: 401)
44
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::AuthenticationError
45
+ end
46
+
47
+ it "handles unverified_email" do
48
+ stub_request(:get, /.*/)
49
+ .to_return(body: { errors: [{ id: 'unverified_email', message: 'test' }] }.to_json,
50
+ status: 401)
51
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::UnverifiedEmailError
52
+ end
53
+
54
+ it "handles invalid_token" do
55
+ stub_request(:get, /.*/)
56
+ .to_return(body: { errors: [{ id: 'invalid_token', message: 'test' }] }.to_json,
57
+ status: 401)
58
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::InvalidTokenError
59
+ end
60
+
61
+ it "handles revoked_token" do
62
+ stub_request(:get, /.*/)
63
+ .to_return(body: { errors: [{ id: 'revoked_token', message: 'test' }] }.to_json,
64
+ status: 401)
65
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::RevokedTokenError
66
+ end
67
+
68
+ it "handles expired_token" do
69
+ stub_request(:get, /.*/)
70
+ .to_return(body: { errors: [{ id: 'expired_token', message: 'test' }] }.to_json,
71
+ status: 401)
72
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::ExpiredTokenError
73
+ end
74
+
75
+ it "handles obscure 401" do
76
+ stub_request(:get, /.*/)
77
+ .to_return(body: { errors: [{ id: 'obscure_401', message: 'test' }] }.to_json,
78
+ status: 401)
79
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::AuthenticationError
80
+ end
81
+
82
+ it "handles 402" do
83
+ stub_request(:get, /.*/)
84
+ .to_return(body: { errors: [{ id: '402', message: 'test' }] }.to_json,
85
+ status: 402)
86
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::TwoFactorRequiredError
87
+ end
88
+
89
+ it "handles 403" do
90
+ stub_request(:get, /.*/)
91
+ .to_return(body: { errors: [{ id: '403', message: 'test' }] }.to_json,
92
+ status: 403)
93
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::InvalidScopeError
94
+ end
95
+
96
+ it "handles 404" do
97
+ stub_request(:get, /.*/)
98
+ .to_return(body: { errors: [{ id: '404', message: 'test' }] }.to_json,
99
+ status: 404)
100
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::NotFoundError
101
+ end
102
+
103
+ it "handles 422" do
104
+ stub_request(:get, /.*/)
105
+ .to_return(body: { errors: [{ id: '422', message: 'test' }] }.to_json,
106
+ status: 422)
107
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::ValidationError
108
+ end
109
+
110
+ it "handles 429" do
111
+ stub_request(:get, /.*/)
112
+ .to_return(body: { errors: [{ id: '429', message: 'test' }] }.to_json,
113
+ status: 429)
114
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::RateLimitError
115
+ end
116
+
117
+ it "handles 500" do
118
+ stub_request(:get, /.*/)
119
+ .to_return(body: { errors: [{ id: '500', message: 'test' }] }.to_json,
120
+ status: 500)
121
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::InternalServerError
122
+ end
123
+
124
+ it "handles 503" do
125
+ stub_request(:get, /.*/)
126
+ .to_return(body: { errors: [{ id: '503', message: 'test' }] }.to_json,
127
+ status: 503)
128
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::ServiceUnavailableError
129
+ end
130
+
131
+ it "handles oauth exception" do
132
+ stub_request(:get, /.*/)
133
+ .to_return(body: { error: "invalid_request", error_description: "test"}.to_json,
134
+ status: 401)
135
+ expect { @client.primary_account }.to raise_error Coinbase::Wallet::APIError
136
+ end
137
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coinbase::Wallet::Address do
4
+ before :all do
5
+ @object_data = {
6
+ 'id' => 'dd3183eb-af1d-5f5d-a90d-cbff946435ff',
7
+ 'address' => 'mswUGcPHp1YnkLCgF1TtoryqSc5E9Q8xFa',
8
+ 'name' => 'One off payment',
9
+ 'created_at' => '2015-01-31T20:49:02Z',
10
+ 'updated_at' => '2015-03-31T17:25:29-07:00',
11
+ 'resource' => 'address',
12
+ 'resource_path' => '/v2/accounts/2bbf394c-193b-5b2a-9155-3b4732659ede/addresses/dd3183eb-af1d-5f5d-a90d-cbff946435ff'
13
+ }
14
+
15
+ @client = Coinbase::Wallet::Client.new(api_key: 'api_key', api_secret: 'api_secret')
16
+ @object = Coinbase::Wallet::Address.new(@client, @object_data)
17
+ end
18
+
19
+ describe '#transactions' do
20
+ it 'should get latest transactions for address' do
21
+ stub_request(:get, 'https://api.coinbase.com' + @object_data['resource_path'] + '/transactions')
22
+ .to_return(body: { data: [mock_item] }.to_json)
23
+ expect(@object.transactions).to eq [mock_item]
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coinbase::Wallet::APIObject do
4
+ before :all do
5
+ @object_data = {
6
+ 'id' => '2bbf394c-193b-5b2a-9155-3b4732659ede',
7
+ 'name' => 'My Wallet',
8
+ 'primary' => true,
9
+ 'type' => 'wallet',
10
+ 'currency' => 'BTC',
11
+ 'balance' => {
12
+ 'amount' => '39.59000000',
13
+ 'currency' => 'BTC'
14
+ },
15
+ 'native_balance' => {
16
+ 'amount' => '395.90',
17
+ 'currency' => 'USD'
18
+ },
19
+ 'created_at' => '2015-01-31T20:49:02Z',
20
+ 'updated_at' => '2015-01-31T20:49:02Z',
21
+ 'resource' => 'account',
22
+ 'resource_path' => '/v2/accounts/2bbf394c-193b-5b2a-9155-3b4732659ede'
23
+ }
24
+
25
+ @client = Coinbase::Wallet::Client.new(api_key: 'api_key', api_secret: 'api_secret')
26
+ @object = Coinbase::Wallet::APIObject.new(@client, @object_data)
27
+ end
28
+
29
+ it 'should access attributes' do
30
+ expect(@object.id).to eq @object_data['id']
31
+ expect(@object.balance.currency).to eq @object_data['balance']['currency']
32
+ expect(@object.primary).to eq @object_data['primary']
33
+ end
34
+
35
+ it 'should convert hashes to APIObjects' do
36
+ expect(@object.balance.class).to eq Coinbase::Wallet::APIObject
37
+ end
38
+
39
+ it 'should convert amounts to BigDecimal' do
40
+ expect(@object.balance.amount.class).to eq BigDecimal
41
+ expect(@object.native_balance.amount.to_f).to eq 395.90
42
+ end
43
+
44
+ it 'should convert timestamps to Time' do
45
+ expect(@object.created_at.class).to eq Time
46
+ end
47
+
48
+ describe '#update' do
49
+ it 'should update object' do
50
+ @object.update({'id' => '1234'})
51
+ expect(@object.id).to eq '1234'
52
+ end
53
+ end
54
+
55
+ describe '#refresh!' do
56
+ it 'should fetch new data for object' do
57
+ stub_request(:get, 'https://api.coinbase.com' + @object_data['resource_path'])
58
+ .to_return(body: { data: { id: 'new_id' } }.to_json)
59
+ @object.refresh!
60
+ expect(@object.id).to eq 'new_id'
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coinbase::Wallet::Checkout do
4
+ before :all do
5
+ @object_data = {
6
+ 'id' => 'ffc93ba1-874d-5c55-853c-53c9c4814b1e',
7
+ 'embed_code' => 'af0b52802ad7b36806e307b2d294e3b4',
8
+ 'type' => 'order',
9
+ 'name' => 'My Checkout',
10
+ 'description' => nil,
11
+ 'amount' => {
12
+ 'amount' => '99.00000000',
13
+ 'currency' => 'BTC'
14
+ },
15
+ 'style' => 'buy_now_large',
16
+ 'customer_defined_amount' => false,
17
+ 'amount_presets' => [],
18
+ 'success_url' => nil,
19
+ 'cancel_url' => nil,
20
+ 'info_url' => nil,
21
+ 'auto_redirect' => false,
22
+ 'collect_shipping_address' => false,
23
+ 'collect_email' => false,
24
+ 'collect_phone_number' => false,
25
+ 'collect_country' => false,
26
+ 'metadata' => {},
27
+ 'created_at' => '2015-01-31T20:49:02Z',
28
+ 'updated_at' => '2015-01-31T20:49:02Z',
29
+ 'resource' => 'checkout',
30
+ 'resource_path' => '/v2/checkouts/ffc93ba1-874d-5c55-853c-53c9c4814b1e'
31
+ }
32
+
33
+ @client = Coinbase::Wallet::Client.new(api_key: 'api_key', api_secret: 'api_secret')
34
+ @object = Coinbase::Wallet::Checkout.new(@client, @object_data)
35
+ end
36
+
37
+ describe '#orders' do
38
+ it 'should get latest order' do
39
+ stub_request(:get, 'https://api.coinbase.com' + @object_data['resource_path'] + '/orders')
40
+ .to_return(body: { data: [mock_item] }.to_json)
41
+ expect(@object.orders).to eq [mock_item]
42
+ end
43
+ end
44
+
45
+ describe '#create_order' do
46
+ it 'should create a new order' do
47
+ stub_request(:post, 'https://api.coinbase.com' + @object_data['resource_path'] + '/orders')
48
+ .to_return(body: { data: mock_item }.to_json)
49
+ expect(@object.create_order).to eq mock_item
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Coinbase::Wallet::CurrentUser do
4
+ before :all do
5
+ @user_data = {
6
+ 'id' => '9da7a204-544e-5fd1-9a12-61176c5d4cd8',
7
+ 'name' => 'User One',
8
+ 'username' => 'user1',
9
+ 'profile_location' => nil,
10
+ 'profile_bio' => nil,
11
+ 'profile_url' => 'https://coinbase.com/user1',
12
+ 'avatar_url' => 'https://images.coinbase.com/avatar?h=vR%2FY8igBoPwuwGren5JMwvDNGpURAY%2F0nRIOgH%2FY2Qh%2BQ6nomR3qusA%2Bh6o2%0Af9rH&s=128',
13
+ 'resource' => 'user',
14
+ 'resource_path' => '/v2/user'
15
+ }
16
+
17
+ @client = Coinbase::Wallet::Client.new(api_key: 'api_key', api_secret: 'api_secret')
18
+ @user = Coinbase::Wallet::CurrentUser.new(@client, @user_data)
19
+ end
20
+
21
+ describe '#update!' do
22
+ it 'should update new data for object' do
23
+ stub_request(:put, 'https://api.coinbase.com' + @user_data['resource_path'])
24
+ .to_return(body: { data: { name: 'james smith' } }.to_json)
25
+ @user.update!(name: 'james smith')
26
+ expect(@user.name).to eq 'james smith'
27
+ end
28
+ end
29
+ end