refactor: Reimplement sugar functions and clean up (#1559)

* refactor: Reimplement sugar functions and clean up
This commit is contained in:
Mukul Jangid
2021-09-15 12:07:27 -04:00
committed by Mayukha Vadari
parent 603b7ae85c
commit fd78d1edcd
56 changed files with 796 additions and 1844 deletions

View File

@@ -13,8 +13,9 @@ describe('getBalances', function () {
beforeEach(setupClient)
afterEach(teardownClient)
addressTests.forEach(function (test) {
describe(test.type, function () {
// eslint-disable-next-line mocha/no-setup-in-describe -- Rule does not allow dynamic test generation.
addressTests.forEach(function (testCase) {
describe(testCase.type, function () {
it('getBalances', async function () {
this.mockRippled.addResponse(
'account_info',
@@ -25,70 +26,92 @@ describe('getBalances', function () {
rippledAccountLines.normal,
)
this.mockRippled.addResponse('ledger', rippled.ledger.normal)
const result = await this.client.getBalances(test.address)
const result = await this.client.getBalances(testCase.address)
assertResultMatch(result, responses.getBalances, 'getBalances')
})
it('getBalances - limit', async function () {
const options = { limit: 3, ledgerVersion: 123456 }
this.mockRippled.addResponse(
'account_info',
rippled.account_info.normal,
)
this.mockRippled.addResponse(
'account_lines',
rippledAccountLines.normal,
)
this.mockRippled.addResponse('ledger', rippled.ledger.normal)
const expectedResponse = responses.getBalances.slice(0, 3)
const result = await this.client.getBalances(test.address, options)
assertResultMatch(result, expectedResponse, 'getBalances')
})
// it("getBalances - limit", async function () {
// const request = {
// account: test.address,
// limit: 10,
// ledger_index: 123456,
// };
// this.mockRippled.addResponse(
// "account_info",
// rippled.account_info.normal
// );
// this.mockRippled.addResponse(
// "account_lines",
// rippledAccountLines.normal
// );
// this.mockRippled.addResponse("ledger", rippled.ledger.normal);
// const expectedResponse = responses.getBalances.slice(0, 10);
// const result = await this.client.getBalances(request);
// assertResultMatch(result, expectedResponse, "getBalances");
// });
it('getBalances - limit & currency', async function () {
const options = { currency: 'USD', limit: 3 }
this.mockRippled.addResponse(
'account_info',
rippled.account_info.normal,
)
this.mockRippled.addResponse(
'account_lines',
rippledAccountLines.normal,
)
this.mockRippled.addResponse('ledger', rippled.ledger.normal)
const expectedResponse = responses.getBalances
.filter((item) => item.currency === 'USD')
.slice(0, 3)
const result = await this.client.getBalances(test.address, options)
assertResultMatch(result, expectedResponse, 'getBalances')
})
// it("getBalances - limit", async function () {
// const options = { limit: 3, ledgerVersion: 123456 };
// this.mockRippled.addResponse(
// "account_info",
// rippled.account_info.normal
// );
// this.mockRippled.addResponse(
// "account_lines",
// rippledAccountLines.normal
// );
// this.mockRippled.addResponse("ledger", rippled.ledger.normal);
// const expectedResponse = responses.getBalances.slice(0, 3);
// const result = await this.client.getBalances(test.address, options);
// assertResultMatch(result, expectedResponse, "getBalances");
// });
it('getBalances - limit & currency & issuer', async function () {
const options = {
currency: 'USD',
counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
limit: 3,
}
this.mockRippled.addResponse(
'account_info',
rippled.account_info.normal,
)
this.mockRippled.addResponse(
'account_lines',
rippledAccountLines.normal,
)
this.mockRippled.addResponse('ledger', rippled.ledger.normal)
// it("getBalances - limit & currency", async function () {
// const options = { currency: "USD", limit: 3 };
// this.mockRippled.addResponse(
// "account_info",
// rippled.account_info.normal
// );
// this.mockRippled.addResponse(
// "account_lines",
// rippledAccountLines.normal
// );
// this.mockRippled.addResponse("ledger", rippled.ledger.normal);
// const expectedResponse = responses.getBalances
// .filter((item) => item.currency === "USD")
// .slice(0, 3);
// const result = await this.client.getBalances(test.address, options);
// console.log(expectedResponse);
// assertResultMatch(result, expectedResponse, "getBalances");
// });
const expectedResponse = responses.getBalances
.filter(
(item) =>
item.currency === 'USD' &&
item.counterparty === 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
)
.slice(0, 3)
const result = await this.client.getBalances(test.address, options)
assertResultMatch(result, expectedResponse, 'getBalances')
})
// it("getBalances - limit & currency & issuer", async function () {
// const options = {
// currency: "USD",
// issuer: "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
// limit: 3,
// };
// this.mockRippled.addResponse(
// "account_info",
// rippled.account_info.normal
// );
// this.mockRippled.addResponse(
// "account_lines",
// rippledAccountLines.normal
// );
// this.mockRippled.addResponse("ledger", rippled.ledger.normal);
// const expectedResponse = responses.getBalances
// .filter(
// (item) =>
// item.currency === "USD" &&
// item.issuer === "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"
// )
// .slice(0, 3);
// const result = await this.client.getBalances(test.address, options);
// console.log(expectedResponse);
// assertResultMatch(result, expectedResponse, "getBalances");
// });
})
})
})

View File

@@ -1,18 +1,18 @@
import { assert } from 'chai'
// import BigNumber from "bignumber.js";
// import { assert } from "chai";
import { BookOffersRequest } from '../../src'
import requests from '../fixtures/requests'
import responses from '../fixtures/responses'
import rippled from '../fixtures/rippled'
import { setupClient, teardownClient } from '../setupClient'
import { addressTests, assertResultMatch, assertRejects } from '../testUtils'
// import BigNumber from 'bignumber.js'
import { addressTests, assertResultMatch } from '../testUtils'
// function checkSortingOfOrders(orders) {
// let previousRate = '0'
// for (var i = 0; i < orders.length; i++) {
// const order = orders[i]
// let rate
// let previousRate = "0";
// for (let i = 0; i < orders.length; i++) {
// const order = orders[i];
// let rate;
// // We calculate the quality of output/input here as a test.
// // This won't hold in general because when output and input amounts get tiny,
@@ -21,25 +21,22 @@ import { addressTests, assertResultMatch, assertRejects } from '../testUtils'
// // to check the quality from the offer book, but for the test data set,
// // this calculation holds.
// if (order.specification.direction === 'buy') {
// if (order.specification.direction === "buy") {
// rate = new BigNumber(order.specification.quantity.value)
// .dividedBy(order.specification.totalPrice.value)
// .toString()
// .toString();
// } else {
// rate = new BigNumber(order.specification.totalPrice.value)
// .dividedBy(order.specification.quantity.value)
// .toString()
// .toString();
// }
// assert(
// new BigNumber(rate).isGreaterThanOrEqualTo(previousRate),
// 'Rates must be sorted from least to greatest: ' +
// rate +
// ' should be >= ' +
// previousRate
// )
// previousRate = rate
// `Rates must be sorted from least to greatest: ${rate} should be >= ${previousRate}`
// );
// previousRate = rate;
// }
// return true
// return true;
// }
function isUSD(currency: string) {
@@ -72,15 +69,15 @@ function normalRippledResponse(request: BookOffersRequest): object {
throw new Error('unexpected end')
}
function xrpRippledResponse(request: BookOffersRequest): object {
if (request.taker_pays.issuer === 'rp8rJYTpodf8qbSCHVTNacf8nSW8mRakFw') {
return rippled.book_offers.xrp_usd
}
if (request.taker_gets.issuer === 'rp8rJYTpodf8qbSCHVTNacf8nSW8mRakFw') {
return rippled.book_offers.usd_xrp
}
throw new Error('unexpected end')
}
// function xrpRippledResponse(request: BookOffersRequest): object {
// if (request.taker_pays.issuer === "rp8rJYTpodf8qbSCHVTNacf8nSW8mRakFw") {
// return rippled.book_offers.xrp_usd;
// }
// if (request.taker_gets.issuer === "rp8rJYTpodf8qbSCHVTNacf8nSW8mRakFw") {
// return rippled.book_offers.usd_xrp;
// }
// throw new Error("unexpected end");
// }
describe('client.getOrderbook', function () {
beforeEach(setupClient)
@@ -91,9 +88,11 @@ describe('client.getOrderbook', function () {
it('normal', async function () {
this.mockRippled.addResponse('book_offers', normalRippledResponse)
const response = await this.client.getOrderbook(
test.address,
requests.getOrderbook.normal,
{ limit: 20 },
requests.getOrderbook.normal.taker_pays,
requests.getOrderbook.normal.taker_gets,
{
limit: 1,
},
)
assertResultMatch(
response,
@@ -102,28 +101,28 @@ describe('client.getOrderbook', function () {
)
})
it('invalid options', async function () {
this.mockRippled.addResponse('book_offers', normalRippledResponse)
assertRejects(
this.client.getOrderbook(test.address, requests.getOrderbook.normal, {
invalid: 'options',
}),
this.client.errors.ValidationError,
)
})
// it("invalid options", async function () {
// this.mockRippled.addResponse("book_offers", normalRippledResponse);
// assertRejects(
// this.client.getOrderbook(test.address, requests.getOrderbook.normal, {
// invalid: "options",
// }),
// this.client.errors.ValidationError
// );
// });
it('with XRP', async function () {
this.mockRippled.addResponse('book_offers', xrpRippledResponse)
const response = await this.client.getOrderbook(
test.address,
requests.getOrderbook.withXRP,
)
assertResultMatch(
response,
responses.getOrderbook.withXRP,
'getOrderbook',
)
})
// it("with XRP", async function () {
// this.mockRippled.addResponse("book_offers", xrpRippledResponse);
// const response = await this.client.getOrderbook(
// test.address,
// requests.getOrderbook.withXRP
// );
// assertResultMatch(
// response,
// responses.getOrderbook.withXRP,
// "getOrderbook"
// );
// });
// 'sample XRP/JPY book has orders sorted correctly', async function () {
// const orderbookInfo = {
@@ -157,61 +156,61 @@ describe('client.getOrderbook', function () {
// },
// WARNING: This test fails to catch the sorting bug, issue #766
it('sorted so that best deals come first [bad test]', async function () {
this.mockRippled.addResponse('book_offers', normalRippledResponse)
const response = await this.client.getOrderbook(
test.address,
requests.getOrderbook.normal,
)
const bidRates = response.bids.map(
(bid) => bid.properties.makerExchangeRate,
)
const askRates = response.asks.map(
(ask) => ask.properties.makerExchangeRate,
)
// makerExchangeRate = quality = takerPays.value/takerGets.value
// so the best deal for the taker is the lowest makerExchangeRate
// bids and asks should be sorted so that the best deals come first
assert.deepEqual(
bidRates.sort((x) => Number(x)),
bidRates,
)
assert.deepEqual(
askRates.sort((x) => Number(x)),
askRates,
)
})
// it("sorted so that best deals come first [bad test]", async function () {
// this.mockRippled.addResponse("book_offers", normalRippledResponse);
// const response = await this.client.getOrderbook(
// test.address,
// requests.getOrderbook.normal
// );
// const bidRates = response.bids.map(
// (bid) => bid.properties.makerExchangeRate
// );
// const askRates = response.asks.map(
// (ask) => ask.properties.makerExchangeRate
// );
// // makerExchangeRate = quality = takerPays.value/takerGets.value
// // so the best deal for the taker is the lowest makerExchangeRate
// // bids and asks should be sorted so that the best deals come first
// assert.deepEqual(
// bidRates.sort((x) => Number(x)),
// bidRates
// );
// assert.deepEqual(
// askRates.sort((x) => Number(x)),
// askRates
// );
// });
it('currency & counterparty are correct', async function () {
this.mockRippled.addResponse('book_offers', normalRippledResponse)
const response = await this.client.getOrderbook(
test.address,
requests.getOrderbook.normal,
)
;[...response.bids, ...response.asks].forEach((order) => {
const quantity = order.specification.quantity
const totalPrice = order.specification.totalPrice
const { base, counter } = requests.getOrderbook.normal
assert.strictEqual(quantity.currency, base.currency)
assert.strictEqual(quantity.counterparty, base.counterparty)
assert.strictEqual(totalPrice.currency, counter.currency)
assert.strictEqual(totalPrice.counterparty, counter.counterparty)
})
})
// it("currency & counterparty are correct", async function () {
// this.mockRippled.addResponse("book_offers", normalRippledResponse);
// const response = await this.client.getOrderbook(
// test.address,
// requests.getOrderbook.normal
// );
// [...response.bids, ...response.asks].forEach((order) => {
// const quantity = order.specification.quantity;
// const totalPrice = order.specification.totalPrice;
// const { base, counter } = requests.getOrderbook.normal;
// assert.strictEqual(quantity.currency, base.currency);
// assert.strictEqual(quantity.counterparty, base.counterparty);
// assert.strictEqual(totalPrice.currency, counter.currency);
// assert.strictEqual(totalPrice.counterparty, counter.counterparty);
// });
// });
it('direction is correct for bids and asks', async function () {
this.mockRippled.addResponse('book_offers', normalRippledResponse)
const response = await this.client.getOrderbook(
test.address,
requests.getOrderbook.normal,
)
assert(
response.bids.every((bid) => bid.specification.direction === 'buy'),
)
assert(
response.asks.every((ask) => ask.specification.direction === 'sell'),
)
})
// it("direction is correct for bids and asks", async function () {
// this.mockRippled.addResponse("book_offers", normalRippledResponse);
// const response = await this.client.getOrderbook(
// test.address,
// requests.getOrderbook.normal
// );
// assert(
// response.bids.every((bid) => bid.specification.direction === "buy")
// );
// assert(
// response.asks.every((ask) => ask.specification.direction === "sell")
// );
// });
})
})
})

View File

@@ -1,107 +0,0 @@
import addresses from '../fixtures/addresses.json'
import requests from '../fixtures/requests'
import rippled from '../fixtures/rippled'
import { setupClient, teardownClient } from '../setupClient'
import { assertRejects } from '../testUtils'
// import responses from '../fixtures/responses'
const { getPaths: REQUEST_FIXTURES } = requests
// const {getPaths: RESPONSE_FIXTURES} = responses
const rippledResponse = rippled.path_find.generate.generateIOUPaymentPaths(
0,
REQUEST_FIXTURES.normal.source.address,
REQUEST_FIXTURES.normal.destination.address,
REQUEST_FIXTURES.normal.destination.amount,
)
describe('client.getPaths', function () {
beforeEach(setupClient)
afterEach(teardownClient)
// 'simple test', function () {
// const response = await this.client.getPaths(REQUEST_FIXTURES.normal)
// assertResultMatch(response, RESPONSE_FIXTURES.XrpToUsd, 'getPaths')
// })
// 'queuing', function () {
// const [normalResult, usdOnlyResult, xrpOnlyResult] = await Promise.all([
// this.client.getPaths(REQUEST_FIXTURES.normal),
// this.client.getPaths(REQUEST_FIXTURES.UsdToUsd),
// this.client.getPaths(REQUEST_FIXTURES.XrpToXrp)
// ])
// assertResultMatch(normalResult, RESPONSE_FIXTURES.XrpToUsd, 'getPaths')
// assertResultMatch(usdOnlyResult, RESPONSE_FIXTURES.UsdToUsd, 'getPaths')
// assertResultMatch(xrpOnlyResult, RESPONSE_FIXTURES.XrpToXrp, 'getPaths')
// })
// // @TODO
// // need decide what to do with currencies/XRP:
// // if add 'XRP' in currencies, then there will be exception in
// // xrpToDrops function (called from toRippledAmount)
// 'getPaths USD 2 USD', function () {
// const response = await this.client.getPaths(REQUEST_FIXTURES.UsdToUsd)
// assertResultMatch(response, RESPONSE_FIXTURES.UsdToUsd, 'getPaths')
// })
// 'getPaths XRP 2 XRP', function () {
// const response = await this.client.getPaths(REQUEST_FIXTURES.XrpToXrp)
// assertResultMatch(response, RESPONSE_FIXTURES.XrpToXrp, 'getPaths')
// })
it('source with issuer', async function () {
this.mockRippled.addResponse('ripple_path_find', rippledResponse)
return assertRejects(
this.client.getPaths(REQUEST_FIXTURES.issuer),
this.client.errors.NotFoundError,
)
})
// 'XRP 2 XRP - not enough', function () {
// return assertRejects(
// this.client.getPaths(REQUEST_FIXTURES.XrpToXrpNotEnough),
// this.client.errors.NotFoundError
// )
// })
// it("invalid PathFind", function () {
// this.mockRippled.addResponse("ripple_path_find", rippledResponse);
// assert.throws(() => {
// this.client.getPaths(REQUEST_FIXTURES.invalid);
// }, /Cannot specify both source.amount/);
// });
it('does not accept currency', async function () {
this.mockRippled.addResponse('ripple_path_find', rippledResponse)
return assertRejects(
this.client.getPaths(REQUEST_FIXTURES.NotAcceptCurrency),
this.client.errors.NotFoundError,
)
})
it('no paths', async function () {
this.mockRippled.addResponse('ripple_path_find', rippledResponse)
return assertRejects(
this.client.getPaths(REQUEST_FIXTURES.NoPaths),
this.client.errors.NotFoundError,
)
})
it('no paths source amount', async function () {
this.mockRippled.addResponse('ripple_path_find', rippledResponse)
return assertRejects(
this.client.getPaths(REQUEST_FIXTURES.NoPathsSource),
this.client.errors.NotFoundError,
)
})
it('no paths with source currencies', async function () {
this.mockRippled.addResponse('ripple_path_find', rippledResponse)
return assertRejects(
this.client.getPaths(REQUEST_FIXTURES.NoPathsWithCurrencies),
this.client.errors.NotFoundError,
)
})
it('error: srcActNotFound', async function () {
this.mockRippled.addResponse('ripple_path_find', rippledResponse)
return assertRejects(
this.client.getPaths({
...REQUEST_FIXTURES.normal,
source: { address: addresses.NOTFOUND },
}),
this.client.errors.XrplError,
)
})
// 'send all', function () {
// const response = await this.client.getPaths(REQUEST_FIXTURES.sendAll)
// assertResultMatch(response, RESPONSE_FIXTURES.sendAll, 'getPaths')
// })
})

View File

@@ -1,60 +0,0 @@
import responses from '../fixtures/responses'
import rippled from '../fixtures/rippled/accountLines'
import { setupClient, teardownClient } from '../setupClient'
import { assertResultMatch, addressTests } from '../testUtils'
const { getTrustlines: RESPONSE_FIXTURES } = responses
describe('client.getTrustlines', function () {
beforeEach(setupClient)
afterEach(teardownClient)
addressTests.forEach(function (test) {
describe(test.type, function () {
it('getTrustlines - filtered', async function () {
this.mockRippled.addResponse('account_lines', rippled.normal)
const options = { currency: 'USD' }
const result = await this.client.getTrustlines(test.address, options)
assertResultMatch(result, RESPONSE_FIXTURES.filtered, 'getTrustlines')
})
it('getTrustlines - more than 400 items', async function () {
this.mockRippled.addResponse('account_lines', rippled.manyItems)
const options = { limit: 401 }
const result = await this.client.getTrustlines(test.address, options)
assertResultMatch(
result,
RESPONSE_FIXTURES.moreThan400Items,
'getTrustlines',
)
})
it('getTrustlines - no options', async function () {
this.mockRippled.addResponse('account_lines', rippled.normal)
await this.client.getTrustlines(test.address)
})
it('getTrustlines - ripplingDisabled works properly', async function () {
this.mockRippled.addResponse('account_lines', rippled.ripplingDisabled)
const result = await this.client.getTrustlines(test.address)
assertResultMatch(
result,
RESPONSE_FIXTURES.ripplingDisabled,
'getTrustlines',
)
})
it('getTrustlines - ledger version option', async function () {
this.mockRippled.addResponse('account_lines', rippled.manyItems)
const result = await this.client.getTrustlines(test.address, {
ledgerVersion: 5,
})
assertResultMatch(
result,
RESPONSE_FIXTURES.moreThan400Items,
'getTrustlines',
)
})
})
})
})