tokenbridge/oracle/test/gasPrice.test.js
Przemyslaw Rzad d656025378
Update the token-bridge sub-repo (#19)
* Moved audit to root directory.

* Moved code of conduct, contributing and licence files.

* Removed travis config and badge.

* Updated repository links in CONTRIBUTING.

* Moved Gitter badge to main readme. Updated links to contributing and licence.

* Updated main readme.

* Moved references to main readme.

* Renamed token-bridge to oracle.

* Update README.md

Co-Authored-By: rzadp <rzadp@student.mini.pw.edu.pl>
2019-05-07 16:52:44 +02:00

180 lines
5.8 KiB
JavaScript

const sinon = require('sinon')
const { expect } = require('chai')
const proxyquire = require('proxyquire').noPreserveCache()
const { fetchGasPrice, gasPriceWithinLimits } = require('../src/services/gasPrice')
const { DEFAULT_UPDATE_INTERVAL, GAS_PRICE_BOUNDARIES } = require('../src/utils/constants')
describe('gasPrice', () => {
describe('fetchGasPrice', () => {
beforeEach(() => {
sinon.stub(console, 'error')
})
afterEach(() => {
console.error.restore()
})
it('should fetch the gas price from the oracle by default', async () => {
// given
const oracleFnMock = () => Promise.resolve('1')
const bridgeContractMock = {
methods: {
gasPrice: {
call: sinon.stub().returns(Promise.resolve('2'))
}
}
}
// when
const gasPrice = await fetchGasPrice({
bridgeContract: bridgeContractMock,
oracleFn: oracleFnMock
})
// then
expect(gasPrice).to.equal('1')
})
it('should fetch the gas price from the contract if the oracle fails', async () => {
// given
const oracleFnMock = () => Promise.reject(new Error('oracle failed'))
const bridgeContractMock = {
methods: {
gasPrice: sinon.stub().returns({
call: sinon.stub().returns(Promise.resolve('2'))
})
}
}
// when
const gasPrice = await fetchGasPrice({
bridgeContract: bridgeContractMock,
oracleFn: oracleFnMock
})
// then
expect(gasPrice).to.equal('2')
})
it('should return null if both the oracle and the contract fail', async () => {
// given
const oracleFnMock = () => Promise.reject(new Error('oracle failed'))
const bridgeContractMock = {
methods: {
gasPrice: sinon.stub().returns({
call: sinon.stub().returns(Promise.reject(new Error('contract failed')))
})
}
}
// when
const gasPrice = await fetchGasPrice({
bridgeContract: bridgeContractMock,
oracleFn: oracleFnMock
})
// then
expect(gasPrice).to.equal(null)
})
})
describe('start', () => {
const utils = { setIntervalAndRun: sinon.spy() }
beforeEach(() => {
utils.setIntervalAndRun.resetHistory()
})
it('should call setIntervalAndRun with HOME_GAS_PRICE_UPDATE_INTERVAL interval value on Home', async () => {
// given
process.env.HOME_GAS_PRICE_UPDATE_INTERVAL = 15000
const gasPrice = proxyquire('../src/services/gasPrice', { '../utils/utils': utils })
// when
await gasPrice.start('home')
// then
expect(process.env.HOME_GAS_PRICE_UPDATE_INTERVAL).to.equal('15000')
expect(process.env.HOME_GAS_PRICE_UPDATE_INTERVAL).to.not.equal(
DEFAULT_UPDATE_INTERVAL.toString()
)
expect(utils.setIntervalAndRun.args[0][1]).to.equal(
process.env.HOME_GAS_PRICE_UPDATE_INTERVAL.toString()
)
})
it('should call setIntervalAndRun with FOREIGN_GAS_PRICE_UPDATE_INTERVAL interval value on Foreign', async () => {
// given
process.env.FOREIGN_GAS_PRICE_UPDATE_INTERVAL = 15000
const gasPrice = proxyquire('../src/services/gasPrice', { '../utils/utils': utils })
// when
await gasPrice.start('foreign')
// then
expect(process.env.FOREIGN_GAS_PRICE_UPDATE_INTERVAL).to.equal('15000')
expect(process.env.HOME_GAS_PRICE_UPDATE_INTERVAL).to.not.equal(
DEFAULT_UPDATE_INTERVAL.toString()
)
expect(utils.setIntervalAndRun.args[0][1]).to.equal(
process.env.FOREIGN_GAS_PRICE_UPDATE_INTERVAL.toString()
)
})
it('should call setIntervalAndRun with default interval value on Home', async () => {
// given
delete process.env.HOME_GAS_PRICE_UPDATE_INTERVAL
const gasPrice = proxyquire('../src/services/gasPrice', { '../utils/utils': utils })
// when
await gasPrice.start('home')
// then
expect(process.env.HOME_GAS_PRICE_UPDATE_INTERVAL).to.equal(undefined)
expect(utils.setIntervalAndRun.args[0][1]).to.equal(DEFAULT_UPDATE_INTERVAL)
})
it('should call setIntervalAndRun with default interval value on Foreign', async () => {
// given
delete process.env.FOREIGN_GAS_PRICE_UPDATE_INTERVAL
const gasPrice = proxyquire('../src/services/gasPrice', { '../utils/utils': utils })
// when
await gasPrice.start('foreign')
// then
expect(process.env.FOREIGN_GAS_PRICE_UPDATE_INTERVAL).to.equal(undefined)
expect(utils.setIntervalAndRun.args[0][1]).to.equal(DEFAULT_UPDATE_INTERVAL)
})
})
describe('gasPriceWithinLimits', () => {
it('should return gas price if gas price is between boundaries', () => {
// given
const minGasPrice = 1
const middleGasPrice = 10
const maxGasPrice = 250
// when
const minGasPriceWithinLimits = gasPriceWithinLimits(minGasPrice)
const middleGasPriceWithinLimits = gasPriceWithinLimits(middleGasPrice)
const maxGasPriceWithinLimits = gasPriceWithinLimits(maxGasPrice)
// then
expect(minGasPriceWithinLimits).to.equal(minGasPrice)
expect(middleGasPriceWithinLimits).to.equal(middleGasPrice)
expect(maxGasPriceWithinLimits).to.equal(maxGasPrice)
})
it('should return min limit if gas price is below min boundary', () => {
// Given
const initialGasPrice = 0.5
// When
const gasPrice = gasPriceWithinLimits(initialGasPrice)
// Then
expect(gasPrice).to.equal(GAS_PRICE_BOUNDARIES.MIN)
})
it('should return max limit if gas price is above max boundary', () => {
// Given
const initialGasPrice = 260
// When
const gasPrice = gasPriceWithinLimits(initialGasPrice)
// Then
expect(gasPrice).to.equal(GAS_PRICE_BOUNDARIES.MAX)
})
})
})