UNPKG

external-adapter

Version:

Helpers for creating Chainlink External Adapters

211 lines (187 loc) 6.99 kB
const { assert } = require('chai') const { Requester } = require('../src/requester') const { Server } = require('./helpers/server') describe('Requester', () => { const errorMessage = 'Request failed with status code 500' const customErrorMessage = 'Could not retrieve valid data: {"result":"error","value":1}' const successUrl = 'http://localhost:18080' const errorUrl = 'http://localhost:18080/error' const errorTwiceUrl = 'http://localhost:18080/errorsTwice' const customErrorUrl = 'http://localhost:18080/customError' const options = { timeout: 100 } const customError = (data) => { return data.result !== 'success' } const server = new Server() before(() => { server.start() }) beforeEach(() => { server.reset() assert.equal(server.errorCount, 0) }) describe('Requester.request', () => { it('returns an error from an endpoint', async () => { options.url = errorUrl try { await Requester.request(options, 1, 0) assert.fail('expected error') } catch (error) { assert.equal(server.errorCount, 1) assert.equal(error.message, errorMessage) } }) it('accepts custom retry amounts', async () => { options.url = errorUrl try { await Requester.request(options, 9, 0) assert.fail('expected error') } catch (error) { assert.equal(server.errorCount, 9) assert.equal(error.message, errorMessage) } }) it('retries errored statuses', async () => { options.url = errorTwiceUrl const { data } = await Requester.request(options, 3, 0) assert.equal(server.errorCount, 2) assert.equal(data.result, 'success') assert.equal(data.value, 1) }) it('retries custom errors', async () => { options.url = customErrorUrl try { await Requester.request(options, customError, 3, 0) assert.fail('expected error') } catch (error) { assert.equal(server.errorCount, 3) assert.equal(error.message, customErrorMessage) } }) it('returns the result from an endpoint', async () => { options.url = successUrl const { data } = await Requester.request(options) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) }) it('accepts optional customError param', async () => { options.url = successUrl const { data } = await Requester.request(options, customError) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) }) it('accepts optional retries param with customError', async () => { options.url = successUrl const { data } = await Requester.request(options, customError, 1) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) }) it('accepts optional retries param without customError', async () => { options.url = successUrl const { data } = await Requester.request(options, 1) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) }) it('accepts optional delay param with customError', async () => { options.url = successUrl const { data } = await Requester.request(options, customError, 1, 0) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) }) it('accepts optional delay param without customError', async () => { options.url = successUrl const { data } = await Requester.request(options, 1, 0) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) }) }) describe('Requester.validateResultNumber', () => { it('returns the desired value', async () => { options.url = successUrl const { data } = await Requester.request(options, 1, 0) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) const result = Requester.validateResultNumber(data, ['value']) assert.equal(result, 1) }) it('errors if the value is not a number', async () => { options.url = successUrl const { data } = await Requester.request(options, 1, 0) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) try { Requester.validateResultNumber(data, ['result']) assert.fail('expected error') } catch (error) { assert.equal(error.message, 'Invalid result') } }) }) describe('Requester.getResult', () => { it('returns the desired value', async () => { options.url = successUrl const { data } = await Requester.request(options, 1, 0) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) const result = Requester.getResult(data, ['value']) assert.equal(result, 1) }) it('does not error if the value is not a number', async () => { options.url = successUrl const { data } = await Requester.request(options, 1, 0) assert.equal(server.errorCount, 0) assert.equal(data.result, 'success') assert.equal(data.value, 1) const result = Requester.getResult(data, ['result']) assert.equal(result, 'success') }) it('returns undefined if the input is not data', async () => { options.url = successUrl const response = await Requester.request(options, 1, 0) assert.equal(server.errorCount, 0) assert.equal(response.data.result, 'success') assert.equal(response.data.value, 1) const result = Requester.getResult(response, ['result']) assert.equal(typeof(result), 'undefined') }) }) describe('Requester.errored', () => { it('returns a Chainlink error when no params are supplied', () => { const error = Requester.errored() assert.equal(error.jobRunID, '1') assert.equal(error.status, 'errored') assert.equal(error.error.message, 'An error occurred') }) it('returns a Chainlink error when no data is supplied', () => { const error = Requester.errored('abc123') assert.equal(error.jobRunID, 'abc123') assert.equal(error.status, 'errored') assert.equal(error.error.message, 'An error occurred') }) }) describe('Requester.success', () => { it('returns a Chainlink result', async () => { options.url = successUrl const response = await Requester.request(options, 1, 0) const result = Requester.success('1', response) assert.equal(result.jobRunID, '1') assert.equal(result.result, 'success') assert.equal(result.data.result, 'success') assert.equal(result.statusCode, 200) }) }) after(() => { server.stop() }) })