oanda_api_v20 1.0.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8de51715b0686fbc75824fe6da40c38d82aa83dd
4
- data.tar.gz: 35a0b883d5abf389da6745d33080762011270891
3
+ metadata.gz: 9fea2b5abda5730c36fa1d535c0de33c82f96c3d
4
+ data.tar.gz: ea80f60cd1263e3eb80e12d3715a052d9b08ab17
5
5
  SHA512:
6
- metadata.gz: a783da10af447a552a7e182a34a38e29a6b492c7fc58ec204967f46d54393465b3f12d4fb0c7ad50cf4da5c7c4ea57685cd12416f5704f59f413c02c6bda0241
7
- data.tar.gz: 3b52f9e02531e69aedff3e5adb9333cd6d07f37f12fdc6db8dc86cd78bba0d7844ce3caaa0b56013a2d1aaaabb638360202e151a4383005c1bdd91cff525163d
6
+ metadata.gz: ea0776c3df49196324f703632f6090b39fe4d203f3931872b927e086292aa9719abaf5f4ce64db56d7890cc611fe07f81eabdbc85b832a64c1b01dc34b2d6eab
7
+ data.tar.gz: 9e9a3fa546f6d3a6f47283b3cbeb2c18f8c096fb1a2d6d3992a77bcbd12ff4c5f68f5faaf4106b9fc5364c50998f507e7e51bf223a3de304c3b9449223d5e559
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.1
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Change Log
2
2
 
3
+ ## 1.1.0
4
+ #### 2016-10-24
5
+ * Added an optional field to the account instruments method to query only a list of instruments instead of returning all instruments.
6
+
3
7
  ## 1.0.0
4
8
  #### 2016-08-23
5
9
  * Added the RSpec Gem for writing unit tests.
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # OandaApiV20
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/oanda_api_v20.svg)](https://rubygems.org/gems/oanda_api_v20)
4
+ [![Build Status](https://travis-ci.org/kobusjoubert/oanda_api_v20.svg?branch=master)](https://travis-ci.org/kobusjoubert/oanda_api_v20)
4
5
 
5
6
  Ruby client that supports the Oanda REST API V20 methods.
6
7
 
@@ -54,6 +55,10 @@ client.account('account_id').summary.show
54
55
  client.account('account_id').instruments.show
55
56
  ```
56
57
 
58
+ ```ruby
59
+ client.account('account_id').instruments('EUR_USD,EUR_CAD').show
60
+ ```
61
+
57
62
  ```ruby
58
63
  client.account('account_id').changes.show
59
64
  ```
@@ -110,6 +115,18 @@ client.account('account_id').order(id, options).update
110
115
  ```ruby
111
116
  id = client.account('account_id').orders.show['orders'][0]['id']
112
117
 
118
+ options = {
119
+ 'clientExtensions' => {
120
+ 'comment' => 'New comment for my limit order'
121
+ }
122
+ }
123
+
124
+ client.account('account_id').order(id, options).update
125
+ ```
126
+
127
+ ```ruby
128
+ id = client.account('account_id').orders.show['orders'][0]['id']
129
+
113
130
  client.account('account_id').order(id).cancel
114
131
  ```
115
132
 
@@ -137,10 +154,13 @@ client.account('account_id').trade(id).show
137
154
  id = client.account('account_id').open_trades.show['trades'][0]['id']
138
155
 
139
156
  options = {
140
- 'clientExtensions' => {
141
- 'comment' => 'This is a USD/CAD trade',
142
- 'tag' => 'trade tag',
143
- 'id' => 'my_usd_cad_trade'
157
+ 'takeProfit' => {
158
+ 'timeInForce' => 'GTC',
159
+ 'price' => '0.5'
160
+ },
161
+ 'stopLoss' => {
162
+ 'timeInForce' => 'GTC',
163
+ 'price' => '2.5'
144
164
  }
145
165
  }
146
166
 
@@ -151,13 +171,10 @@ client.account('account_id').trade(id, options).update
151
171
  id = client.account('account_id').open_trades.show['trades'][0]['id']
152
172
 
153
173
  options = {
154
- 'takeProfit' => {
155
- 'timeInForce' => 'GTC',
156
- 'price' => '0.5'
157
- },
158
- 'stopLoss' => {
159
- 'timeInForce' => 'GTC',
160
- 'price' => '2.5'
174
+ 'clientExtensions' => {
175
+ 'comment' => 'This is a USD/CAD trade',
176
+ 'tag' => 'trade tag',
177
+ 'id' => 'my_usd_cad_trade'
161
178
  }
162
179
  }
163
180
 
@@ -263,10 +280,3 @@ A `OandaApiV20::RequestError` will be raised when a request to the Oanda API fai
263
280
  3. Commit your changes (`git commit -am 'Add some feature'`)
264
281
  4. Push to the branch (`git push origin my-new-feature`)
265
282
  5. Create new Pull Request
266
-
267
- ## TODO
268
-
269
- There are still a lot to be added to this gem:
270
-
271
- - Unit tests using RSpec.
272
- - ...
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ begin
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ task default: :spec
5
+ rescue LoadError
6
+ end
@@ -17,8 +17,10 @@ module OandaApiV20
17
17
  end
18
18
 
19
19
  # GET /v3/accounts/:account_id/instruments
20
- def instruments
21
- Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/instruments", headers: headers)
20
+ def instruments(instruments = nil)
21
+ arguments = { headers: headers }
22
+ arguments.merge!(query: { instruments: instruments }) if instruments
23
+ Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/instruments", arguments)
22
24
  end
23
25
 
24
26
  # GET /v3/accounts/:account_id/changes
@@ -2,6 +2,7 @@
2
2
  module OandaApiV20
3
3
  module Positions
4
4
  # GET /v3/accounts/:account_id/positions/:instrument
5
+ # PUT /v3/accounts/:account_id/positions/:instrument/close
5
6
  def position(*args)
6
7
  instrument = args.shift
7
8
  options = args.shift unless args.nil? || args.empty?
@@ -1,3 +1,3 @@
1
1
  module OandaApiV20
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_development_dependency 'rspec', '~> 3.4'
24
24
  s.add_development_dependency 'webmock', '~> 2.1'
25
25
  s.add_development_dependency 'timecop', '~> 0.8'
26
+ s.add_development_dependency 'rake'
26
27
 
27
28
  s.files = `git ls-files`.split("\n")
28
29
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
@@ -0,0 +1,304 @@
1
+ require 'spec_helper'
2
+
3
+ describe OandaApiV20::Api do
4
+ describe '#initialize' do
5
+ it 'sets the http_verb attribute when supplied' do
6
+ api = OandaApiV20::Api.new(http_verb: :post)
7
+ expect(api.http_verb).to eq(:post)
8
+ end
9
+
10
+ it 'sets the base_uri attribute when supplied' do
11
+ url = 'https://api-fxpractice.oanda.com/v3'
12
+ api = OandaApiV20::Api.new(base_uri: url)
13
+ expect(api.base_uri).to eq(url)
14
+ end
15
+
16
+ it 'sets the headers attribute when supplied' do
17
+ headers = { 'Content-Type' => 'application/json', 'Connection' => 'keep-alive', 'Keep-Alive' => '30' }
18
+ api = OandaApiV20::Api.new(headers: headers)
19
+ expect(api.headers).to eq(headers)
20
+ end
21
+
22
+ it 'sets the account_id attribute when supplied' do
23
+ account_id = '100-100-100'
24
+ api = OandaApiV20::Api.new(account_id: account_id)
25
+ expect(api.account_id).to eq(account_id)
26
+ end
27
+
28
+ it 'sets the last_transaction_id attribute when supplied' do
29
+ last_transaction_id = '1'
30
+ api = OandaApiV20::Api.new(last_transaction_id: last_transaction_id)
31
+ expect(api.last_transaction_id).to eq(last_transaction_id)
32
+ end
33
+ end
34
+
35
+ describe '#public_methods' do
36
+ let!(:api) { OandaApiV20::Api.new }
37
+ let(:public_methods) { [
38
+ :account, :accounts, :summary, :instruments, :changes, :configuration,
39
+ :order, :orders, :pending_orders,
40
+ :trade, :trades, :open_trades,
41
+ :position, :positions, :open_positions,
42
+ :transaction, :transactions, :transactions_id_range, :transactions_since_id,
43
+ :pricing
44
+ ] }
45
+
46
+ it 'responds to all public methods' do
47
+ public_methods.each do |public_method|
48
+ expect(api.respond_to?(public_method)).to be_truthy
49
+ end
50
+ end
51
+ end
52
+
53
+ describe 'constructs the correct API URL under' do
54
+ let!(:api) { OandaApiV20::Api.new(base_uri: 'https://api-fxtrade.oanda.com/v3', account_id: '100-100-100', headers: {}) }
55
+
56
+ before(:each) do
57
+ stub_request(:any, /https:\/\/api-fxtrade\.oanda\.com\/v3.*/)
58
+ api.http_verb = :get
59
+ end
60
+
61
+ context 'accounts for' do
62
+ it 'retrieving an account' do
63
+ api.account('100-100-100')
64
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100')).to have_been_made.once
65
+ end
66
+
67
+ it 'retrieving all accounts' do
68
+ api.accounts
69
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts')).to have_been_made.once
70
+ end
71
+
72
+ it 'retrieving a summary' do
73
+ api.summary
74
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/summary')).to have_been_made.once
75
+ end
76
+
77
+ it 'retrieving all instruments' do
78
+ api.instruments
79
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/instruments')).to have_been_made.once
80
+ end
81
+
82
+ it 'retrieving an instrument' do
83
+ api.instruments('EUR_USD')
84
+ options = { 'instruments' => 'EUR_USD' }
85
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/instruments').with(query: options)).to have_been_made.once
86
+ end
87
+
88
+ it 'retrieving all changes' do
89
+ api.last_transaction_id = '1'
90
+ api.changes
91
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/changes').with(query: { 'sinceTransactionID' => '1' })).to have_been_made.once
92
+ end
93
+
94
+ it 'updating a configuration' do
95
+ api.http_verb = :patch
96
+ options = { 'alias' => 'Timmy!' }
97
+ api.configuration(options)
98
+ expect(a_request(:patch, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/configuration').with(body: options.to_json))
99
+ end
100
+ end
101
+
102
+ context 'orders for' do
103
+ it 'retrieving an order' do
104
+ api.order('1')
105
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/orders/1')).to have_been_made.once
106
+ end
107
+
108
+ it 'creating an order' do
109
+ api.http_verb = :post
110
+ options = {
111
+ 'order' => {
112
+ 'units' => '100',
113
+ 'instrument' => 'EUR_CAD',
114
+ 'timeInForce' => 'FOK',
115
+ 'type' => 'MARKET',
116
+ 'positionFill' => 'DEFAULT'
117
+ }
118
+ }
119
+ api.order(options)
120
+ expect(a_request(:post, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/orders').with(body: options.to_json)).to have_been_made.once
121
+ end
122
+
123
+ it 'updating an order' do
124
+ api.http_verb = :put
125
+ options = {
126
+ 'order' => {
127
+ 'timeInForce' => 'GTC',
128
+ 'price' => '1.7000',
129
+ 'type' => 'TAKE_PROFIT',
130
+ 'tradeID' => '1'
131
+ }
132
+ }
133
+ api.order('1', options)
134
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/orders/1').with(body: options.to_json)).to have_been_made.once
135
+ end
136
+
137
+ it 'updating an order client extensions' do
138
+ api.http_verb = :put
139
+ options = {
140
+ 'clientExtensions' => {
141
+ 'comment' => 'New comment for my limit order'
142
+ }
143
+ }
144
+ api.order('1', options)
145
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/orders/1/clientExtensions').with(body: options.to_json)).to have_been_made.once
146
+ end
147
+
148
+ it 'cancelling an order' do
149
+ api.http_verb = :put
150
+ api.order('1')
151
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/orders/1/cancel')).to have_been_made.once
152
+ end
153
+
154
+ it 'retrieving all orders' do
155
+ api.orders
156
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/orders')).to have_been_made.once
157
+ end
158
+
159
+ it 'retrieving all pending orders' do
160
+ api.pending_orders
161
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/pendingOrders')).to have_been_made.once
162
+ end
163
+ end
164
+
165
+ context 'trades for' do
166
+ it 'retrieving a trade' do
167
+ api.trade('1')
168
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/trades/1')).to have_been_made.once
169
+ end
170
+
171
+ it 'updating a trade' do
172
+ api.http_verb = :put
173
+ options = {
174
+ 'takeProfit' => {
175
+ 'timeInForce' => 'GTC',
176
+ 'price' => '0.5'
177
+ },
178
+ 'stopLoss' => {
179
+ 'timeInForce' => 'GTC',
180
+ 'price' => '2.5'
181
+ }
182
+ }
183
+ api.trade('1', options)
184
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/trades/1/orders').with(body: options.to_json)).to have_been_made.once
185
+ end
186
+
187
+ it 'updating a trade client extensions' do
188
+ api.http_verb = :put
189
+ options = {
190
+ 'clientExtensions' => {
191
+ 'comment' => 'This is a USD/CAD trade',
192
+ 'tag' => 'trade tag',
193
+ 'id' => 'my_usd_cad_trade'
194
+ }
195
+ }
196
+ api.trade('1', options)
197
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/trades/1/clientExtensions').with(body: options.to_json)).to have_been_made.once
198
+ end
199
+
200
+ it 'closing a trade' do
201
+ api.http_verb = :put
202
+ api.trade('1')
203
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/trades/1/close')).to have_been_made.once
204
+ end
205
+
206
+ it 'closing a trade partially' do
207
+ api.http_verb = :put
208
+ options = { 'units' => '10' }
209
+ api.trade('1', options)
210
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/trades/1/close')).to have_been_made.once
211
+ end
212
+
213
+ it 'retrieving all trades' do
214
+ options = { 'instrument' => 'USD_CAD' }
215
+ api.trades(options)
216
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/trades').with(query: options)).to have_been_made.once
217
+ end
218
+
219
+ it 'retrieving all open trades' do
220
+ api.open_trades
221
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/openTrades')).to have_been_made.once
222
+ end
223
+ end
224
+
225
+ context 'positions for' do
226
+ it 'retrieving a position' do
227
+ api.position('EUR_USD')
228
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/positions/EUR_USD')).to have_been_made.once
229
+ end
230
+
231
+ it 'retrieving all positions' do
232
+ api.positions
233
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/positions')).to have_been_made.once
234
+ end
235
+
236
+ it 'retrieving all open positions' do
237
+ api.open_positions
238
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/openPositions')).to have_been_made.once
239
+ end
240
+
241
+ it 'closing a position' do
242
+ api.http_verb = :put
243
+ options = { 'longUnits' => 'ALL' }
244
+ api.position('EUR_CAD', options)
245
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/positions/EUR_CAD/close').with(body: options.to_json)).to have_been_made.once
246
+ end
247
+
248
+ it 'closing a position partially' do
249
+ api.http_verb = :put
250
+ options = { 'longUnits' => '99' }
251
+ api.position('EUR_CAD', options)
252
+ expect(a_request(:put, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/positions/EUR_CAD/close').with(body: options.to_json)).to have_been_made.once
253
+ end
254
+ end
255
+
256
+ context 'transactions for' do
257
+ it 'retrieving a transaction' do
258
+ api.transaction('1')
259
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/transactions/1')).to have_been_made.once
260
+ end
261
+
262
+ it 'retrieving all transactions' do
263
+ api.transactions
264
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/transactions')).to have_been_made.once
265
+ end
266
+
267
+ it 'retrieving all transactions in date range' do
268
+ options = {
269
+ 'from' => '2016-08-01T02:00:00Z',
270
+ 'to' => '2016-08-15T02:00:00Z'
271
+ }
272
+ api.transactions(options)
273
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/transactions').with(query: options)).to have_been_made.once
274
+ end
275
+
276
+ it 'retrieving all transactions in an id range' do
277
+ options = {
278
+ 'from' => '6409',
279
+ 'to' => '6412'
280
+ }
281
+ api.transactions_id_range(options)
282
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/transactions/idrange').with(query: options)).to have_been_made.once
283
+ end
284
+
285
+ it 'retrieving all transactions since an id' do
286
+ options = {
287
+ 'id' => '6411'
288
+ }
289
+ api.transactions_since_id(options)
290
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/transactions/sinceid').with(query: options)).to have_been_made.once
291
+ end
292
+ end
293
+
294
+ context 'pricing for' do
295
+ it 'retrieving all pricing' do
296
+ options = {
297
+ 'instruments' => 'EUR_USD,USD_CAD'
298
+ }
299
+ api.pricing(options)
300
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100/pricing').with(query: options)).to have_been_made.once
301
+ end
302
+ end
303
+ end
304
+ end
@@ -7,24 +7,29 @@ describe OandaApiV20::Client do
7
7
  expect(c.access_token).to eq('my_access_token')
8
8
  end
9
9
 
10
- it 'sets the base URI to practice when the practice option was supplied and set to true' do
10
+ it 'sets the base_uri to practice when the practice option was supplied and set to true' do
11
11
  c = OandaApiV20::Client.new(practice: true)
12
12
  expect(c.base_uri).to eq('https://api-fxpractice.oanda.com/v3')
13
13
  end
14
14
 
15
- it 'sets the base URI to live when the practice option was supplied and set to false' do
15
+ it 'sets the base_uri to live when the practice option was supplied and set to false' do
16
16
  c = OandaApiV20::Client.new(practice: false)
17
17
  expect(c.base_uri).to eq('https://api-fxtrade.oanda.com/v3')
18
18
  end
19
19
 
20
- it 'sets the base URI to live when the practice option was not supplied' do
20
+ it 'sets the base_uri to live when the practice option was not supplied' do
21
21
  c = OandaApiV20::Client.new
22
22
  expect(c.base_uri).to eq('https://api-fxtrade.oanda.com/v3')
23
23
  end
24
+
25
+ it 'set the headers attribute to a hash' do
26
+ c = OandaApiV20::Client.new
27
+ expect(c.send(:headers)).to be_an_instance_of(Hash)
28
+ end
24
29
  end
25
30
 
26
31
  describe '#method_missing' do
27
- let(:c) { OandaApiV20::Client.new(access_token: 'my_access_token') }
32
+ let!(:c) { OandaApiV20::Client.new(access_token: 'my_access_token') }
28
33
 
29
34
  context 'when an OandaApiV20::Api method has been called' do
30
35
  it 'saves the method called' do
@@ -51,6 +56,7 @@ describe OandaApiV20::Client do
51
56
  context 'when an action method has been called' do
52
57
  let(:response_account) { '{"account":{"id":"100-100-100","NAV":"100000.0000","balance":"100000.0000","lastTransactionID":"99","orders":[],"positions":[],"trades":[],"pendingOrderCount":0},"lastTransactionID":"99"}' }
53
58
  let!(:request_account) { stub_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-100').to_return(status: 200, body: response_account, headers: {}) }
59
+
54
60
  let(:response_accounts) { '{"accounts":[{"id":"100-100-100","tags":[]}]}' }
55
61
  let!(:request_accounts) { stub_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts').to_return(status: 200, body: response_accounts, headers: {}) }
56
62
 
@@ -58,37 +64,70 @@ describe OandaApiV20::Client do
58
64
  allow(c).to receive(:sleep)
59
65
  end
60
66
 
61
- it 'sets the equivalent HTTP verb' do
62
- c.accounts.show
63
- expect(c.send(:http_verb)).to eq(:get)
64
- end
67
+ describe 'network' do
68
+ it 'makes a request to Oanda API' do
69
+ c.accounts.show
70
+ expect(request_accounts).to have_been_requested
71
+ expect(request_accounts).to have_been_requested.at_most_once
72
+ end
65
73
 
66
- it 'makes a request to Oanda API' do
67
- c.accounts.show
68
- expect(request_accounts).to have_been_requested
69
- expect(request_accounts).to have_been_requested.at_most_once
74
+ it 'returns the response from Oanda API' do
75
+ expect(c.accounts.show).to eq(JSON.parse(response_accounts))
76
+ expect(c.account('100-100-100').show).to eq(JSON.parse(response_account))
77
+ end
70
78
  end
71
79
 
72
- it 'returns the response from Oanda API' do
73
- expect(c.accounts.show).to eq(JSON.parse(response_accounts))
74
- expect(c.account('100-100-100').show).to eq(JSON.parse(response_account))
75
- end
80
+ describe 'attributes' do
81
+ it 'sets the equivalent HTTP verb' do
82
+ c.accounts.show
83
+ expect(c.send(:http_verb)).to eq(:get)
84
+ end
85
+
86
+ it 'sets the current account ID' do
87
+ c.account('100-100-100').show
88
+ expect(c.send(:account_id)).to eq('100-100-100')
89
+ end
76
90
 
77
- it 'sets the last transaction ID when returned' do
78
- c.account('100-100-100').show
79
- expect(c.send(:last_transaction_id)).to eq('99')
91
+ it 'sets the last transaction ID when returned' do
92
+ c.account('100-100-100').show
93
+ expect(c.send(:last_transaction_id)).to eq('99')
94
+ end
95
+
96
+ it 'sets the last request made at time' do
97
+ expect(c.send(:last_api_request_at).last).to be_nil
98
+ c.accounts.show
99
+ expect(c.send(:last_api_request_at).last).to_not be_nil
100
+ expect(Time.parse(c.send(:last_api_request_at).last.to_s)).to be_an_instance_of(Time)
101
+ end
80
102
  end
81
103
 
82
- it 'sets the last request made at time' do
83
- expect(c.send(:last_api_request_at).last).to be_nil
84
- c.accounts.show
85
- expect(c.send(:last_api_request_at).last).to_not be_nil
86
- expect(Time.parse(c.send(:last_api_request_at).last.to_s)).to be_an_instance_of(Time)
104
+ describe 'headers' do
105
+ it 'sets authentication header' do
106
+ c.accounts.show
107
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts').with(headers: { 'Authorization' => 'Bearer my_access_token' })).to have_been_made.once
108
+ end
109
+
110
+ it 'sets content type header to json' do
111
+ c.accounts.show
112
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts').with(headers: { 'Content-Type' => 'application/json' })).to have_been_made.once
113
+ end
114
+
115
+ it 'sets date time format header to RFC3339' do
116
+ c.accounts.show
117
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts').with(headers: { 'X-Accept-Datetime-Format' => 'RFC3339' })).to have_been_made.once
118
+ end
119
+
120
+ it 'sets persisten connection header' do
121
+ c.accounts.show
122
+ expect(a_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts').with(headers: { 'Connection' => 'keep-alive' })).to have_been_made.once
123
+ end
87
124
  end
88
125
 
89
- it 'raises an OandaApiV20::RequestError exception when receiving anything other than a 2xx response from Oanda API' do
90
- stub_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-109').to_return(status: 401, body: '', headers: {})
91
- expect{ c.account('100-100-109').show }.to raise_error(OandaApiV20::RequestError)
126
+ describe 'exceptions' do
127
+ it 'raises an OandaApiV20::RequestError exception when receiving anything other than a 2xx response from Oanda API' do
128
+ stub_request(:get, 'https://api-fxtrade.oanda.com/v3/accounts/100-100-109').to_return(status: 401, body: '', headers: {})
129
+ expect{ c.account('100-100-109').show }.to raise_error(OandaApiV20::RequestError)
130
+ end
92
131
  end
93
132
 
94
133
  describe 'governing request rate' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oanda_api_v20
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kobus Joubert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-23 00:00:00.000000000 Z
11
+ date: 2016-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: Ruby client that supports the Oanda REST API V20 methods.
98
112
  email: kobus@translate3d.com
99
113
  executables: []
@@ -102,10 +116,13 @@ extra_rdoc_files: []
102
116
  files:
103
117
  - ".gitignore"
104
118
  - ".rspec"
119
+ - ".ruby-version"
120
+ - ".travis.yml"
105
121
  - CHANGELOG.md
106
122
  - Gemfile
107
123
  - LICENSE
108
124
  - README.md
125
+ - Rakefile
109
126
  - lib/oanda_api_v20.rb
110
127
  - lib/oanda_api_v20/accounts.rb
111
128
  - lib/oanda_api_v20/api.rb
@@ -119,6 +136,7 @@ files:
119
136
  - lib/oanda_api_v20/transactions.rb
120
137
  - lib/oanda_api_v20/version.rb
121
138
  - oanda_api_v20.gemspec
139
+ - spec/oanda_api_v20/api_spec.rb
122
140
  - spec/oanda_api_v20/client_spec.rb
123
141
  - spec/oanda_api_v20/oanda_api_v20_spec.rb
124
142
  - spec/spec_helper.rb
@@ -147,6 +165,7 @@ signing_key:
147
165
  specification_version: 4
148
166
  summary: Ruby Oanda REST API V20
149
167
  test_files:
168
+ - spec/oanda_api_v20/api_spec.rb
150
169
  - spec/oanda_api_v20/client_spec.rb
151
170
  - spec/oanda_api_v20/oanda_api_v20_spec.rb
152
171
  - spec/spec_helper.rb