Skip to content

Commit

Permalink
Merge 0650042 into 38a3fc2
Browse files Browse the repository at this point in the history
  • Loading branch information
dtobe committed Mar 19, 2021
2 parents 38a3fc2 + 0650042 commit 7802fad
Show file tree
Hide file tree
Showing 21 changed files with 975 additions and 946 deletions.
1 change: 0 additions & 1 deletion .eslintrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,5 @@ globals:
parserOptions:
ecmaVersion: 2018
rules: {
semi: [2, "always"],
space-before-function-paren: ["error", "never"]
}
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,7 @@ branches:
cache: yarn
install:
- yarn install --frozen-lockfile
before_script:
- yarn lint
after_script:
- yarn coveralls
50 changes: 25 additions & 25 deletions example/bitcoinPriceService.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,48 @@
const axios = require('axios');
const express = require('express');
const router = express.Router();
const config = require('config');
const axios = require('axios')
const express = require('express')
const router = express.Router()
const config = require('config')

router.get('/', async(req, res, next) => {
try {
const btcPrice = await getBitcoinPrice();
res.json({ 'btcPrice': btcPrice });
const btcPrice = await getBitcoinPrice()
res.json({ btcPrice: btcPrice })
} catch (err) {
console.log('Some Error');
return next(err);
console.log('Some Error')
return next(err)
}
});
})

router.get('/example', async(req, res, next) => {
try {
const btcPrice = await getBitcoinPrice();
const btcPrice = await getBitcoinPrice()

if (btcPrice > 5000) {
res.json({
'btcPrice': {
'up': `${btcPrice}`
btcPrice: {
up: `${btcPrice}`
}
});
})
} else {
res.json({
'btcPrice': {
'down': `${btcPrice}`
btcPrice: {
down: `${btcPrice}`
}
});
})
}
} catch (err) {
console.log(`Some Error ${JSON.stringify(err)}`);
return next(err);
console.log(`Some Error ${JSON.stringify(err)}`)
return next(err)
}
});
})

const getBitcoinPrice = async() => {
const URL = config.get('end-point.external-service.currentprice');
const URL = config.get('end-point.external-service.currentprice')

const response = await axios.get(URL);
const data = await response.data.bpi.USD.rate_float;
const response = await axios.get(URL)
const data = await response.data.bpi.USD.rate_float

return data;
};
return data
}

module.exports = router;
module.exports = router
80 changes: 40 additions & 40 deletions example/integrationtest/bitcoin.sample-test.js
Original file line number Diff line number Diff line change
@@ -1,61 +1,61 @@
const request = require('supertest');
const getPort = require('get-port');
const MockServer = require('../../mock-server');
const testServerConfig = require('../test-setup/test-server-config');
const request = require('supertest')
const getPort = require('get-port')
const MockServer = require('../../mock-server')
const testServerConfig = require('../test-setup/test-server-config')

const mockServerResponses = require('../test-setup/mock-data/price-above-5000');
const anotherMockServerResponse = require('../test-setup/mock-data/price-below-5000');
const mockServerResponses = require('../test-setup/mock-data/price-above-5000')
const anotherMockServerResponse = require('../test-setup/mock-data/price-below-5000')

describe('Sample IT for the bitcoin service', () => {
let server;
let externalServiceMock;
let randomPort;
let server
let externalServiceMock
let randomPort

beforeAll(async() => {
randomPort = await getPort();
testServerConfig.setup({ server_port: randomPort });
externalServiceMock = new MockServer(mockServerResponses, randomPort);
externalServiceMock.start();
});
randomPort = await getPort()
testServerConfig.setup({ server_port: randomPort })
externalServiceMock = new MockServer(mockServerResponses, randomPort)
externalServiceMock.start()
})

beforeEach(() => {
server = require('../server');
});
server = require('../server')
})

afterEach(() => {
server.close();
externalServiceMock.clearStats();
});
server.close()
externalServiceMock.clearStats()
})

afterAll(() => {
externalServiceMock.stop();
testServerConfig.clear();
});
externalServiceMock.stop()
testServerConfig.clear()
})

const callExternalService = () => {
return request(server)
.get('/example');
};
.get('/example')
}

it('should return 200 and display UP if Bitcoin price is above $5000', async() => {
const res = await callExternalService();
const responseMarkup = res.text;
const res = await callExternalService()
const responseMarkup = res.text

expect(res.status).toBe(200);
expect(responseMarkup).toBeTruthy();
expect(responseMarkup).toContain('{"btcPrice":{"up":"5148.82"}}');
expect(externalServiceMock.timesCalled('/api/currentprice', 'get')).toBe(1);
});
expect(res.status).toBe(200)
expect(responseMarkup).toBeTruthy()
expect(responseMarkup).toContain('{"btcPrice":{"up":"5148.82"}}')
expect(externalServiceMock.timesCalled('/api/currentprice', 'get')).toBe(1)
})

it('should return 200 and display DOWN if Bitcoin price is below $5000', async() => {
externalServiceMock.update(anotherMockServerResponse);
externalServiceMock.update(anotherMockServerResponse)

const res = await callExternalService();
const responseMarkup = res.text;
const res = await callExternalService()
const responseMarkup = res.text

expect(res.status).toBe(200);
expect(responseMarkup).toBeTruthy();
expect(responseMarkup).toContain('{"btcPrice":{"down":"4148.82"}}');
expect(externalServiceMock.timesCalled('/api/currentprice', 'get')).toBe(1);
});
});
expect(res.status).toBe(200)
expect(responseMarkup).toBeTruthy()
expect(responseMarkup).toContain('{"btcPrice":{"down":"4148.82"}}')
expect(externalServiceMock.timesCalled('/api/currentprice', 'get')).toBe(1)
})
})
20 changes: 10 additions & 10 deletions example/server.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
const express = require('express')
const app = express()
const PORT = process.env.PORT || 3000

const bitcoinPriceService = require('./bitcoinPriceService');
const bitcoinPriceService = require('./bitcoinPriceService')

app.set('port', PORT);
app.use('/', bitcoinPriceService);
app.set('port', PORT)
app.use('/', bitcoinPriceService)

const server = app
.listen(app.get('port'), () => {
console.log(`Server running on http://localhost:${PORT}/ with `);
console.log(`Server running on http://localhost:${PORT}/ with `)
})
.on('error', err => {
if (err) {
console.log('Error starting sample project');
console.log('Error starting sample project')
}
});
})

module.exports = server;
module.exports = server
12 changes: 6 additions & 6 deletions example/test-setup/test-server-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ const setup = config => {
process.env.NODE_CONFIG = JSON.stringify({
'end-point': {
'external-service': {
'currentprice': `http://localhost:${config.server_port}/api/currentprice`
currentprice: `http://localhost:${config.server_port}/api/currentprice`
}
}
});
};
})
}

const clear = () => {
process.env.NODE_CONFIG = null;
};
process.env.NODE_CONFIG = null
}

module.exports = {
setup,
clear
};
}
10 changes: 5 additions & 5 deletions example/uiRouter.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const express = require('express');
const router = express.Router();
const express = require('express')
const router = express.Router()

const bitcoin = require('./bitcoinPriceService');
router.use('/', bitcoin);
const bitcoin = require('./bitcoinPriceService')
router.use('/', bitcoin)

module.exports = router;
module.exports = router
68 changes: 34 additions & 34 deletions lib/configValidator.js
Original file line number Diff line number Diff line change
@@ -1,60 +1,60 @@
var Ajv = require('ajv');
const Ajv = require('ajv')

const SUPPORTED_METHODS = ['get', 'post', 'put', 'delete', 'patch'];
const SUPPORTED_METHODS = ['get', 'post', 'put', 'delete', 'patch']

const responseSchema = {
'$id': 'Response.json',
'resposeDef': {
'type': 'object',
'properties': {
'status': {
'type': 'integer'
$id: 'Response.json',
resposeDef: {
type: 'object',
properties: {
status: {
type: 'integer'
},
'headers': {
'type': 'object',
'propertyNames': {
'pattern': '^[\\w-]+$'
headers: {
type: 'object',
propertyNames: {
pattern: '^[\\w-]+$'
},
'patternProperties': {
'[\\w-]+': { 'type': 'string' }
patternProperties: {
'[\\w-]+': { type: 'string' }
}
},
'data': {
'type': 'object'
data: {
type: 'object'
}
},
'additionalProperties': false
additionalProperties: false
}
};
}

const schema = {
'$id': 'ResponseDefs.json',
'oneOf': [
$id: 'ResponseDefs.json',
oneOf: [
{
'$ref': 'Response.json#/resposeDef'
$ref: 'Response.json#/resposeDef'
},
{
'type': 'array',
'items': {
'$ref': 'Response.json#/resposeDef'
type: 'array',
items: {
$ref: 'Response.json#/resposeDef'
}
}
]
};
}

module.exports = (responseConfig, resourcePath, method) => {
if (!SUPPORTED_METHODS.includes(method)) {
throw new Error(`Method ${method} is not supported.`);
throw new Error(`Method ${method} is not supported.`)
}
var ajv = new Ajv({ schemas: [schema, responseSchema] });
var validate = ajv.getSchema('ResponseDefs.json');
const valid = validate(responseConfig);
const ajv = new Ajv({ schemas: [schema, responseSchema] })
const validate = ajv.getSchema('ResponseDefs.json')
const valid = validate(responseConfig)
if (!valid) {
// usually only the first error is interesting, further ones are just the result of parser panicking and
// failing the oneOf check
const prop = validate.errors[0].propertyName;
const path = validate.errors[0].dataPath;
const msg = validate.errors[0].message;
throw new Error(`Validation error: ${prop ? `property [${prop}] at path ` : ''}'${path}' ${msg}.`);
const prop = validate.errors[0].propertyName
const path = validate.errors[0].dataPath
const msg = validate.errors[0].message
throw new Error(`Validation error: ${prop ? `property [${prop}] at path ` : ''}'${path}' ${msg}.`)
}
};
}
12 changes: 6 additions & 6 deletions lib/errorHandler.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
const { log } = require('./logging');
const { log } = require('./logging')

const _handleUnconfiguredRoutes = (req, res) => {
log.warn(`Unconfigured route called: ${req.path}, method: ${req.method}`);
res.status(404);
log.warn(`Unconfigured route called: ${req.path}, method: ${req.method}`)
res.status(404)
res.json({
error: {
message: `Route ${req.path} and method ${req.method} are not configured.`
}
});
};
})
}

module.exports = _handleUnconfiguredRoutes;
module.exports = _handleUnconfiguredRoutes
Loading

0 comments on commit 7802fad

Please sign in to comment.