From 26879cf9a7f63b4453513ce79b9dcbe3aa5c4c93 Mon Sep 17 00:00:00 2001 From: Chris Clark Date: Thu, 25 Jun 2015 14:03:25 -0700 Subject: [PATCH] Convert getOrders and add unit test --- src/api/index.js | 4 +- src/api/ledger/orders.js | 136 +++-------- src/api/ledger/parse/account-order.js | 14 ++ src/api/ledger/parse/order-base.js | 27 +++ src/api/ledger/parse/order.js | 20 +- test/api-test.js | 6 + test/fixtures/acct-offers-response.js | 255 ++++++++++++++++++++ test/fixtures/get-orders-response.json | 307 +++++++++++++++++++++++++ test/mock-rippled.js | 9 + 9 files changed, 649 insertions(+), 129 deletions(-) create mode 100644 src/api/ledger/parse/account-order.js create mode 100644 src/api/ledger/parse/order-base.js create mode 100644 test/fixtures/acct-offers-response.js create mode 100644 test/fixtures/get-orders-response.json diff --git a/src/api/index.js b/src/api/index.js index b6bb8e5b77..ee6b31c1c6 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -10,7 +10,7 @@ const getAccountTransactions = require('./ledger/transactions'); const getTrustlines = require('./ledger/trustlines'); const getBalances = require('./ledger/balances'); // const getPathFind = require('./ledger/pathfind'); -// const getOrders = require('./ledger/orders'); +const getOrders = require('./ledger/orders'); // const getOrderBook = require('./ledger/orderbook'); const getSettings = require('./ledger/settings'); const preparePayment = require('./transaction/payment'); @@ -38,7 +38,7 @@ RippleAPI.prototype = { getTrustlines, getBalances, // getPathFind, - // getOrders, + getOrders, // getOrderBook, getSettings, diff --git a/src/api/ledger/orders.js b/src/api/ledger/orders.js index 7a2c749ee9..ef5409452d 100644 --- a/src/api/ledger/orders.js +++ b/src/api/ledger/orders.js @@ -1,119 +1,37 @@ -/* eslint-disable valid-jsdoc */ 'use strict'; const _ = require('lodash'); const utils = require('./utils'); -const ripple = utils.common.core; const validate = utils.common.validate; +const composeAsync = utils.common.composeAsync; +const parseAccountOrder = require('./parse/account-order'); + +function requestAccountOffers(remote, address, ledgerVersion, options, + marker, limit, callback) { + remote.requestAccountOffers({ + account: address, + marker: marker, + limit: limit, + ledger: ledgerVersion + }, + composeAsync((data) => ({ + marker: data.marker, + results: data.offers.map(parseAccountOrder) + }), callback)); +} -const DefaultPageLimit = 200; - -/** - * Get orders from the ripple network - * - * @query - * @param {String} [request.query.limit] - * - Set a limit to the number of results returned - * @param {String} [request.query.marker] - * - Used to paginate results - * @param {String} [request.query.ledger] - * - The ledger index to query against - * - (required if request.query.marker is present) - * - * @url - * @param {RippleAddress} request.params.account - * - The ripple address to query orders - * - */ -function getOrders(account, options, callback) { - const self = this; - +function getAccountOrders(account, options, callback) { validate.address(account); validate.options(options); - function getAccountOrders(prevResult) { - const isAggregate = options.limit === undefined; - if (prevResult && (!isAggregate || !prevResult.marker)) { - return Promise.resolve(prevResult); - } - - const promise = new Promise(function(resolve, reject) { - let accountOrdersRequest; - let marker; - let ledger; - let limit; - - if (prevResult) { - marker = prevResult.marker; - limit = prevResult.limit; - ledger = prevResult.ledger_index; - } else { - marker = options.marker; - limit = options.limit || DefaultPageLimit; - ledger = utils.parseLedger(options.ledger); - } - - accountOrdersRequest = self.remote.requestAccountOffers({ - account: account, - marker: marker, - limit: limit, - ledger: ledger - }); - - accountOrdersRequest.once('error', reject); - accountOrdersRequest.once('success', function(nextResult) { - nextResult.offers = prevResult ? - nextResult.offers.concat(prevResult.offers) : nextResult.offers; - resolve(nextResult); - }); - accountOrdersRequest.request(); - }); - - return promise.then(getAccountOrders); - } - - function getParsedOrders(offers) { - return _.reduce(offers, function(orders, off) { - const sequence = off.seq; - const type = off.flags & ripple.Remote.flags.offer.Sell ? 'sell' : 'buy'; - const passive = (off.flags & ripple.Remote.flags.offer.Passive) !== 0; - - const taker_gets = utils.parseCurrencyAmount(off.taker_gets); - const taker_pays = utils.parseCurrencyAmount(off.taker_pays); - - orders.push({ - type: type, - taker_gets: taker_gets, - taker_pays: taker_pays, - sequence: sequence, - passive: passive - }); - - return orders; - }, []); - } - - function respondWithOrders(result) { - const promise = new Promise(function(resolve) { - const orders = {}; - - if (result.marker) { - orders.marker = result.marker; - } - - orders.limit = result.limit; - orders.ledger = result.ledger_index; - orders.validated = result.validated; - orders.orders = getParsedOrders(result.offers); - - resolve(callback(null, orders)); - }); - - return promise; - } - - getAccountOrders() - .then(respondWithOrders) - .catch(callback); + const defaultLimit = 100; + const limit = options.limit || defaultLimit; + const ledgerVersion = options.ledgerVersion + || this.remote.getLedgerSequence(); + const getter = _.partial(requestAccountOffers, this.remote, account, + ledgerVersion, options); + utils.getRecursive(getter, limit, + composeAsync((orders) => _.sortBy(orders, (order) => order.state.sequence), + callback)); } -module.exports = getOrders; +module.exports = getAccountOrders; diff --git a/src/api/ledger/parse/account-order.js b/src/api/ledger/parse/account-order.js new file mode 100644 index 0000000000..9de3cd4834 --- /dev/null +++ b/src/api/ledger/parse/account-order.js @@ -0,0 +1,14 @@ +'use strict'; +const parseOrderBase = require('./order-base'); + +// rippled 'account_offers' returns a different format for orders than 'tx' +function parseAccountOrder(order) { + const specification = parseOrderBase( + order.taker_gets, order.taker_pays, order.flags); + const state = { + sequence: order.seq + }; + return {specification, state}; +} + +module.exports = parseAccountOrder; diff --git a/src/api/ledger/parse/order-base.js b/src/api/ledger/parse/order-base.js new file mode 100644 index 0000000000..8bf29f96f7 --- /dev/null +++ b/src/api/ledger/parse/order-base.js @@ -0,0 +1,27 @@ +/* @flow */ +'use strict'; +const utils = require('./utils'); +const parseAmount = require('./amount'); +const orderFlags = utils.core.Transaction.flags.OfferCreate; + +/*:: type Amount = string | {currency: string, issuer: string, value: string} */ +function parseOrder(takerGets: Amount, takerPays: Amount, flags: number): + Object { + const direction = (flags & orderFlags.Sell) === 0 ? 'buy' : 'sell'; + const takerGetsAmount = parseAmount(takerGets); + const takerPaysAmount = parseAmount(takerPays); + const quantity = (direction === 'buy') ? takerPaysAmount : takerGetsAmount; + const totalPrice = (direction === 'buy') ? takerGetsAmount : takerPaysAmount; + + return utils.removeUndefined({ + direction: direction, + quantity: quantity, + totalPrice: totalPrice, + passive: ((flags & orderFlags.Passive) !== 0) || undefined, + immediateOrCancel: ((flags & orderFlags.ImmediateOrCancel) !== 0) + || undefined, + fillOrKill: ((flags & orderFlags.FillOrKill) !== 0) || undefined + }); +} + +module.exports = parseOrder; diff --git a/src/api/ledger/parse/order.js b/src/api/ledger/parse/order.js index fb560266ea..8f9d659051 100644 --- a/src/api/ledger/parse/order.js +++ b/src/api/ledger/parse/order.js @@ -1,27 +1,11 @@ /* @flow */ 'use strict'; const assert = require('assert'); -const utils = require('./utils'); -const parseAmount = require('./amount'); -const flags = utils.core.Transaction.flags.OfferCreate; +const parseOrderBase = require('./order-base'); function parseOrder(tx: Object): Object { assert(tx.TransactionType === 'OfferCreate'); - - const direction = (tx.Flags & flags.Sell) === 0 ? 'buy' : 'sell'; - const takerGets = parseAmount(tx.TakerGets); - const takerPays = parseAmount(tx.TakerPays); - const quantity = (direction === 'buy') ? takerPays : takerGets; - const totalPrice = (direction === 'buy') ? takerGets : takerPays; - - return { - direction: direction, - quantity: quantity, - totalPrice: totalPrice, - passive: (tx.Flags & flags.Passive) !== 0, - immediateOrCancel: (tx.Flags & flags.ImmediateOrCancel) !== 0, - fillOrKill: (tx.Flags & flags.FillOrKill) !== 0 - }; + return parseOrderBase(tx.TakerGets, tx.TakerPays, tx.Flags); } module.exports = parseOrder; diff --git a/test/api-test.js b/test/api-test.js index 528164c18a..73dcd6962a 100644 --- a/test/api-test.js +++ b/test/api-test.js @@ -27,6 +27,7 @@ const accountTransactionsResponse = const trustlinesResponse = require('./fixtures/trustlines-response'); const walletResponse = require('./fixtures/wallet.json'); const getSettingsResponse = require('./fixtures/get-settings-response'); +const getOrdersResponse = require('./fixtures/get-orders-response'); function checkResult(expected, done, error, response) { if (error) { @@ -131,4 +132,9 @@ describe('RippleAPI', function() { _.partial(checkResult, getSettingsResponse, done)); }); + it('getOrders', function(done) { + this.api.getOrders(address, {}, + _.partial(checkResult, getOrdersResponse, done)); + }); + }); diff --git a/test/fixtures/acct-offers-response.js b/test/fixtures/acct-offers-response.js new file mode 100644 index 0000000000..f8b043012a --- /dev/null +++ b/test/fixtures/acct-offers-response.js @@ -0,0 +1,255 @@ +'use strict'; +const _ = require('lodash'); +const addresses = require('./addresses'); + +module.exports = function(request, options={}) { + _.defaults(options, { + account: addresses.ACCOUNT, + validated: true + }); + + return JSON.stringify({ + 'id': request.id, + 'result': { + 'account': options.account, + 'marker': options.marker, + 'limit': options.limit, + 'ledger_index': options.ledger, + 'offers': [ + { + 'flags': 131072, + 'seq': 719930, + 'taker_gets': { + 'currency': 'EUR', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '17.70155237781915' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '1122.990930900328' + } + }, + { + 'flags': 0, + 'seq': 757002, + 'taker_gets': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '18.46856867857617' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rpDMez6pm6dBve2TJsmDpv7Yae6V5Pyvy2', + 'value': '19.50899530491766' + } + }, + { + 'flags': 0, + 'seq': 756999, + 'taker_gets': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '19.11697137482289' + }, + 'taker_pays': { + 'currency': 'EUR', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '750' + } + }, + { + 'flags': 0, + 'seq': 757003, + 'taker_gets': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '14.40727807030772' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rpDMez6pm6dBve2TJsmDpv7Yae6V5Pyvy2', + 'value': '1445.796633544794' + } + }, + { + 'flags': 0, + 'seq': 782148, + 'taker_gets': { + 'currency': 'NZD', + 'issuer': 'rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc', + 'value': '9.178557969538755' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '750' + } + }, + { + 'flags': 0, + 'seq': 787368, + 'taker_gets': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '9.94768291869523' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + 'value': '500' + } + }, + { + 'flags': 0, + 'seq': 787408, + 'taker_gets': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '9.994805759894176' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + 'value': '10000' + } + }, + { + 'flags': 0, + 'seq': 803438, + 'taker_gets': { + 'currency': 'USD', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '11.67691646304319' + }, + 'taker_pays': { + 'currency': 'MXN', + 'issuer': 'rG6FZ31hDHN1K5Dkbma3PSB5uVCuVVRzfn', + 'value': '15834.53653918684' + } + }, + { + 'flags': 0, + 'seq': 807858, + 'taker_gets': { + 'currency': 'XAU', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '0.03206299605333101' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '3968.240250979598' + } + }, + { + 'flags': 0, + 'seq': 807896, + 'taker_gets': { + 'currency': 'XAU', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '0.03347459066593226' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + 'value': '4139.022125516302' + } + }, + { + 'flags': 0, + 'seq': 814018, + 'taker_gets': { + 'currency': 'NZD', + 'issuer': 'rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc', + 'value': '6.840555705' + }, + 'taker_pays': '115760190000' + }, + { + 'flags': 0, + 'seq': 827522, + 'taker_gets': { + 'currency': 'EUR', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '14.40843766044656' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + 'value': '902.4050961259154' + } + }, + { + 'flags': 0, + 'seq': 833592, + 'taker_gets': { + 'currency': 'XAG', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '1.128432823485991' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '1814.887131319799' + } + }, + { + 'flags': 0, + 'seq': 833591, + 'taker_gets': { + 'currency': 'XAG', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '1.128432823485989' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '181.4887131319798' + } + }, + { + 'flags': 0, + 'seq': 838954, + 'taker_gets': { + 'currency': 'XAG', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '0.7283371225235964' + }, + 'taker_pays': { + 'currency': 'USD', + 'issuer': 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + 'value': '118.6872603846736' + } + }, + { + 'flags': 0, + 'seq': 843730, + 'taker_gets': '2229229447', + 'taker_pays': { + 'currency': 'XAU', + 'issuer': 'r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH', + 'value': '1' + } + }, + { + 'flags': 0, + 'seq': 844068, + 'taker_gets': { + 'currency': 'USD', + 'issuer': 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + 'value': '17.77537376072202' + }, + 'taker_pays': { + 'currency': 'EUR', + 'issuer': 'rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q', + 'value': '750' + } + } + ], + 'validated': options.validated + }, + 'status': 'success', + 'type': 'response' + }); +}; diff --git a/test/fixtures/get-orders-response.json b/test/fixtures/get-orders-response.json new file mode 100644 index 0000000000..6d00cd44e4 --- /dev/null +++ b/test/fixtures/get-orders-response.json @@ -0,0 +1,307 @@ +[ + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "1122.990930900328", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + }, + "totalPrice": { + "currency": "EUR", + "value": "17.70155237781915", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + }, + "immediateOrCancel": true + }, + "state": { + "sequence": 719930 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "EUR", + "value": "750", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + }, + "totalPrice": { + "currency": "USD", + "value": "19.11697137482289", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } + }, + "state": { + "sequence": 756999 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "19.50899530491766", + "counterparty": "rpDMez6pm6dBve2TJsmDpv7Yae6V5Pyvy2" + }, + "totalPrice": { + "currency": "USD", + "value": "18.46856867857617", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } + }, + "state": { + "sequence": 757002 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "1445.796633544794", + "counterparty": "rpDMez6pm6dBve2TJsmDpv7Yae6V5Pyvy2" + }, + "totalPrice": { + "currency": "USD", + "value": "14.40727807030772", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } + }, + "state": { + "sequence": 757003 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "750", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + }, + "totalPrice": { + "currency": "NZD", + "value": "9.178557969538755", + "counterparty": "rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc" + } + }, + "state": { + "sequence": 782148 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "500", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "USD", + "value": "9.94768291869523", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } + }, + "state": { + "sequence": 787368 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "10000", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "USD", + "value": "9.994805759894176", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } + }, + "state": { + "sequence": 787408 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "MXN", + "value": "15834.53653918684", + "counterparty": "rG6FZ31hDHN1K5Dkbma3PSB5uVCuVVRzfn" + }, + "totalPrice": { + "currency": "USD", + "value": "11.67691646304319", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } + }, + "state": { + "sequence": 803438 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "3968.240250979598", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + }, + "totalPrice": { + "currency": "XAU", + "value": "0.03206299605333101", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + } + }, + "state": { + "sequence": 807858 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "4139.022125516302", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "XAU", + "value": "0.03347459066593226", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + } + }, + "state": { + "sequence": 807896 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "XRP", + "value": "115760.19" + }, + "totalPrice": { + "currency": "NZD", + "value": "6.840555705", + "counterparty": "rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc" + } + }, + "state": { + "sequence": 814018 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "902.4050961259154", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "EUR", + "value": "14.40843766044656", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } + }, + "state": { + "sequence": 827522 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "181.4887131319798", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + }, + "totalPrice": { + "currency": "XAG", + "value": "1.128432823485989", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + } + }, + "state": { + "sequence": 833591 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "1814.887131319799", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + }, + "totalPrice": { + "currency": "XAG", + "value": "1.128432823485991", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + } + }, + "state": { + "sequence": 833592 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "118.6872603846736", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "XAG", + "value": "0.7283371225235964", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + } + }, + "state": { + "sequence": 838954 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "XAU", + "value": "1", + "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" + }, + "totalPrice": { + "currency": "XRP", + "value": "2229.229447" + } + }, + "state": { + "sequence": 843730 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "EUR", + "value": "750", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + }, + "totalPrice": { + "currency": "USD", + "value": "17.77537376072202", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "state": { + "sequence": 844068 + } + } +] diff --git a/test/mock-rippled.js b/test/mock-rippled.js index 82cc08b469..97266380ce 100644 --- a/test/mock-rippled.js +++ b/test/mock-rippled.js @@ -6,6 +6,7 @@ const EventEmitter2 = require('eventemitter2').EventEmitter2; const fixtures = require('./fixtures/mock'); const addresses = require('./fixtures/addresses'); const hashes = require('./fixtures/hashes'); +const accountOffersResponse = require('./fixtures/acct-offers-response'); module.exports = function(port) { const mock = new WebSocketServer({port: port}); @@ -120,5 +121,13 @@ module.exports = function(port) { } }); + mock.on('request_account_offers', function(request, conn) { + if (request.account === addresses.ACCOUNT) { + conn.send(accountOffersResponse(request)); + } else { + assert(false, 'Unrecognized account address: ' + request.account); + } + }); + return mock; };