-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
21 changed files
with
975 additions
and
946 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}.`) | ||
} | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.