simple-fxtrade
Version:
A node js wrapper for the Oanda Rest v20 api to make things really simple
140 lines (109 loc) • 4.8 kB
text/coffeescript
require('dotenv').load silent: true
_ = require 'lodash'
{expect} = require 'chai'
fx = require '../../index'
id = '101-011-5748031-001'
describe '--- Integration Tests ---', ->
describe 'accounts', ->
describe 'GET /accounts[/:id]', ->
it 'should get the accounts', ->
{accounts} = await fx.accounts()
expect(_.size(accounts)).to.be.equal 1
it 'should return the account by id', ->
{account} = await fx.accounts {id}
expect(account.id).to.be.equal id
expect(account.alias).to.be.equal 'Primary'
describe 'PATCH /accounts/:id', ->
it 'should configure the account', ->
{clientConfigureTransaction: {alias}} = await fx('patch').accounts {id, alias: 'Default'}
expect(alias).to.be.equal 'Default'
# Change back to Primary
fx('patch').accounts {id, alias: 'Primary'}
describe 'GET /accounts/:id/summary', ->
it 'should return the account summary', ->
fx.setAccount id
{account} = await fx.summary()
expect(account.id).to.be.equal id
describe 'GET /accounts/:id/instruments', ->
it 'should return the account instruments', ->
fx.setAccount id
{instruments} = await fx.instruments()
pair = _.first _.filter instruments, name: 'AUD_USD'
expect(pair.displayName).to.be.equal 'AUD/USD'
describe 'GET /accounts/:id/changes', ->
it 'should return the account changes', ->
fx.setAccount id
{lastTransactionID} = await fx.transactions()
{changes: {transactions}} = await fx.changes sinceTransactionID: +lastTransactionID - 1
expect(_.isEmpty transactions).to.not.be.ok
describe 'candles', ->
describe 'GET /instruments/:accountId/candles', ->
it 'should return the candles for a given instrument', ->
fx.setAccount id
{granularity, candles, instrument} = await fx.candles id: 'AUD_USD'
expect(instrument).to.be.equal 'AUD_USD'
expect(granularity).to.be.equal 'S5'
expect(_.size candles).to.be.equal 500
describe 'pricing', ->
describe 'GET /accounts/:id/pricing', ->
it 'should return the pricing for an instrument', ->
fx.setAccount id
{prices: [{instrument, type}]} = await fx.pricing instruments: 'AUD_USD'
expect(instrument).to.be.equal 'AUD_USD'
expect(type).to.be.equal 'PRICE'
describe 'GET /accounts/:id/pricing/stream', ->
it 'should throw an error if missing required params', ->
fx.setAccount id
expect(-> fx.pricing.stream()).to.throw 'Required parameters missing: instruments'
it 'should subscribe to the pricing stream', ->
fx.setAccount id
stream = await fx.pricing.stream instruments: 'AUD_USD'
new Promise (resolve) -> stream.on 'data', ({type}) ->
expect(type).to.match /PRICE|HEARTBEAT/
stream.disconnect()
resolve()
describe 'transactions', ->
describe 'GET /accounts/:accountId/transactions[/:id]', ->
it 'should throw an error if missing required params', ->
fx.setAccount id
{count, pageSize} = await fx.transactions()
expect(count).to.be.above 50
expect(pageSize).to.be.equal 100
it 'should return a specified transaction id', ->
fx.setAccount id
{transaction: {alias, type}} = await fx.transactions id: 10
expect(type).to.be.equal 'CLIENT_CONFIGURE'
expect(alias).to.be.equal 'Default'
describe 'GET /accounts/:accountId/transactions/stream', ->
it 'should subscribe to the transactions stream', ->
fx.setAccount id
stream = await fx.transactions.stream()
new Promise (resolve) -> stream.on 'data', ({type}) ->
expect(type).to.match /HEARTBEAT|CLIENT_CONFIGURE/
stream.disconnect()
resolve()
# TODO: Need to fix up these integration tests. Problem is they depend
# on timing and other irritating factors
describe 'trades', ->
describe 'GET /accounts/:accountId/trades[/:id]', ->
# TODO: Need to return actual trades
it 'should throw an error if missing required params', ->
fx.setAccount id
{trades} = await fx.trades()
expect(trades).to.be.ok
describe.skip 'orders', ->
describe 'POST /accounts/:accountId/orders', ->
it 'should create an order', ->
fx.setAccount id
result = await fx.orders.create order: {
id
units: 1
instrument: 'AUD_USD'
timeInForce: 'FOK'
type: 'MARKET'
positionFill: 'DEFAULT'
tradeId: 6368
}
it 'should return the orders for an account', ->
# TODO: Implement these integration tests if possible
describe.skip 'positions', ->