openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
1,240 lines (1,179 loc) • 42.8 kB
text/coffeescript
should = require "should"
request = require "supertest"
server = require "../../lib/server"
Channel = require("../../lib/model/channels").Channel
Mediator = require("../../lib/model/mediators").Mediator
testUtils = require "../testUtils"
auth = require("../testUtils").auth
describe "API Integration Tests", ->
describe 'Mediators REST API testing', ->
mediator1 =
urn: "urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED"
version: "1.0.0"
name: "Save Encounter Mediator"
description: "A mediator for testing"
endpoints: [
{
name: 'Save Encounter'
host: 'localhost'
port: '8005'
type: 'http'
}
]
defaultChannelConfig: [
name: "Save Encounter 1"
urlPattern: "/encounters"
type: 'http'
allow: []
routes: [
{
name: 'Save Encounter 1'
host: 'localhost'
port: '8005'
type: 'http'
}
]
,
name: "Save Encounter 2"
urlPattern: "/encounters2"
type: 'http'
allow: []
routes: [
{
name: 'Save Encounter 2'
host: 'localhost'
port: '8005'
type: 'http'
}
]
]
mediator2 =
urn: "urn:uuid:25ABAB99-23BF-4AAB-8832-7E07E4EA5902"
version: "0.8.2"
name: "Patient Mediator"
description: "Another mediator for testing"
endpoints: [
{
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
}
]
mediator3 =
urn: "urn:mediator:no-default-channel-conf"
version: "1.0.0"
name: "Mediator without default channel conf"
description: "Another mediator for testing"
endpoints: [
{
name: 'Route'
host: 'localhost'
port: '8009'
type: 'http'
}
]
authDetails = {}
before (done) ->
auth.setupTestUsers (err) ->
return done err if err
Channel.ensureIndexes ->
Mediator.ensureIndexes ->
server.start apiPort: 8080, done
after (done) ->
server.stop -> auth.cleanupTestUsers done
beforeEach ->
authDetails = auth.getAuthDetails()
afterEach (done) -> Mediator.remove {}, -> Channel.remove {}, done
describe '*getAllMediators()', ->
it 'should fetch all mediators', (done) ->
new Mediator(mediator1).save ->
new Mediator(mediator2).save ->
request("https://localhost:8080")
.get("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.expect(200)
.end (err, res) ->
if err
done err
else
res.body.length.should.be.eql 2
done()
it 'should not allow non root user to fetch mediators', (done) ->
request("https://localhost:8080")
.get("/mediators")
.set("auth-username", testUtils.nonRootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.expect(403)
.end (err, res) ->
if err
done err
else
done()
describe '*getMediator()', ->
it 'should fetch mediator', (done) ->
new Mediator(mediator1).save ->
request("https://localhost:8080")
.get("/mediators/#{mediator1.urn}")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.expect(200)
.end (err, res) ->
if err
done err
else
res.body.urn.should.be.exactly mediator1.urn
done()
it 'should return status 404 if not found', (done) ->
request("https://localhost:8080")
.get("/mediators/#{mediator1.urn}")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.expect(404)
.end (err, res) ->
if err
done err
else
done()
it 'should not allow non root user to fetch mediator', (done) ->
request("https://localhost:8080")
.get("/mediators/#{mediator1.urn}")
.set("auth-username", testUtils.nonRootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.expect(403)
.end (err, res) ->
if err
done err
else
done()
describe '*addMediator()', ->
it 'should return 201', (done) ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator1)
.expect(201)
.end (err, res) ->
if err
done err
else
done()
it 'should not allow non root user to add mediator', (done) ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.nonRootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator1)
.expect(403)
.end (err, res) ->
if err
done err
else
done()
it 'should add the mediator to the mediators collection', (done) ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator1)
.expect(201)
.end (err, res) ->
if err
done err
else
Mediator.findOne { urn: mediator1.urn }, (err, res) ->
return done err if err
should.exist(res)
done()
it 'should add multiple mediators without default channel config', (done) ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator2)
.expect(201)
.end (err, res) ->
return done err if err
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator3)
.expect(201)
.end (err, res) ->
return done err if err
done()
it 'should not do anything if the mediator already exists and the version number is equal', (done) ->
updatedMediator =
urn: "urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED"
version: "1.0.0"
name: "Updated Encounter Mediator"
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(updatedMediator)
.expect(201)
.end (err, res) ->
if err
done err
else
Mediator.find { urn: mediator1.urn }, (err, res) ->
return done err if err
res.length.should.be.exactly 1
res[0].name.should.be.exactly mediator1.name
done()
it 'should not do anything if the mediator already exists and the version number is less-than', (done) ->
updatedMediator =
urn: "urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED"
version: "0.9.5"
name: "Updated Encounter Mediator"
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(updatedMediator)
.expect(201)
.end (err, res) ->
if err
done err
else
Mediator.find { urn: mediator1.urn }, (err, res) ->
return done err if err
res.length.should.be.exactly 1
res[0].name.should.be.exactly mediator1.name
done()
it 'should update the mediator if the mediator already exists and the version number is greater-than', (done) ->
updatedMediator =
urn: "urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED"
version: "1.0.1"
name: "Updated Encounter Mediator"
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(updatedMediator)
.expect(201)
.end (err, res) ->
if err
done err
else
Mediator.find { urn: mediator1.urn }, (err, res) ->
return done err if err
res.length.should.be.exactly 1
res[0].name.should.be.exactly updatedMediator.name
done()
it 'should not update config that has already been set', (done) ->
mediator =
urn: "urn:uuid:66237a48-2e76-4318-8cd6-9c6649ad6f5f"
name: "Mediator"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
type: "string"
,
param: "param2"
type: "number"
]
config:
param1: "val1"
param2: 5
updatedMediator =
urn: "urn:uuid:66237a48-2e76-4318-8cd6-9c6649ad6f5f"
version: "1.0.1"
name: "Updated Mediator"
configDefs: [
param: "param1"
type: "string"
,
param: "param2"
type: "number"
,
param: "param3"
type: "bool"
]
config:
param1: "val1"
param2: 6
param3: true
new Mediator(mediator).save ->
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(updatedMediator)
.expect(201)
.end (err, res) ->
if err
done err
else
Mediator.find { urn: mediator.urn }, (err, res) ->
return done err if err
res.length.should.be.exactly 1
res[0].name.should.be.exactly updatedMediator.name
res[0].config.param2.should.be.exactly 5
res[0].config.param3.should.be.exactly true
done()
it 'should reject mediators without a UUID', (done) ->
invalidMediator =
version: "0.8.2"
name: "Patient Mediator"
description: "Invalid mediator for testing"
endpoints: [
{
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
}
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(invalidMediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject mediators without a name', (done) ->
invalidMediator =
urn: "urn:uuid:CA5B32BC-87CB-46A5-B9C7-AAF03500989A"
version: "0.8.2"
description: "Invalid mediator for testing"
endpoints: [
{
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
}
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(invalidMediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject mediators without a version number', (done) ->
invalidMediator =
urn: "urn:uuid:CA5B32BC-87CB-46A5-B9C7-AAF03500989A"
name: "Patient Mediator"
description: "Invalid mediator for testing"
endpoints: [
{
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
}
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(invalidMediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject mediators with an invalid SemVer version number (x.y.z)', (done) ->
invalidMediator =
urn: "urn:uuid:CA5B32BC-87CB-46A5-B9C7-AAF03500989A"
name: "Patient Mediator"
version: "0.8"
description: "Invalid mediator for testing"
endpoints: [
{
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
}
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(invalidMediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject mediators with no endpoints specified', (done) ->
invalidMediator =
urn: "urn:uuid:CA5B32BC-87CB-46A5-B9C7-AAF03500989A"
name: "Patient Mediator"
version: "0.8.2"
description: "Invalid mediator for testing"
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(invalidMediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject mediators with an empty endpoints array specified', (done) ->
invalidMediator =
urn: "urn:uuid:CA5B32BC-87CB-46A5-B9C7-AAF03500989A"
name: "Patient Mediator"
version: "0.8.2"
description: "Invalid mediator for testing"
endpoints: []
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(invalidMediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject mediators with invalid default config', (done) ->
invalidMediator =
urn: "urn:uuid:CA5B32BC-87CB-46A5-B9C7-AAF03500989A"
name: "Patient Mediator"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
type: "string"
,
param: "param2"
type: "number"
]
config:
param1: "val1"
param2: "val2"
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(invalidMediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should store mediator config and config definitions', (done) ->
validMediator =
urn: "urn:uuid:35a7e5e6-acbb-497d-8b01-259fdcc0d5c2"
name: "Patient Mediator"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
type: "string"
,
param: "param2"
type: "number"
]
config:
param1: "val1"
param2: 5
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(validMediator)
.expect(201)
.end (err, res) ->
if err
done err
else
Mediator.findOne urn: validMediator.urn, (err, mediator) ->
mediator.config.should.deepEqual validMediator.config
mediator.configDefs.should.have.length 2
done()
it 'should reject a mediator if the config definition does not contain a template for a struct', (done) ->
mediator =
urn: "urn:mediator:structmediator-1"
name: "structmediator-1"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
displayName: "Parameter 1"
description: "Test config"
type: "struct"
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject a mediator if the config definition contains an invalid template for a struct', (done) ->
mediator =
urn: "urn:mediator:structmediator-2"
name: "structmediator-2"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
displayName: "Parameter 1"
description: "Test config"
type: "struct"
template: [
field: "this is not a valid template"
]
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should store a mediator with config and a config definition that contains a valid struct', (done) ->
mediator =
urn: "urn:mediator:structmediator-3"
name: "structmediator-3"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
displayName: "Parameter 1"
description: "Test config"
type: "struct"
template: [
{
param: "server"
displayName: "Server"
description: "Server"
type: "string"
}, {
param: "port"
displayName: "Port"
description: "Port"
type: "number"
}, {
param: "secure"
type: "bool"
}, {
param: "pickAorB"
type: "option"
values: ["A", "B"]
}
]
]
config:
param1:
server: 'localhost'
port: 8080
secure: false
pickAorB: 'A'
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator)
.expect(201)
.end (err, res) ->
if err
done err
else
done()
it 'should reject a mediator if the config definition does not contain a \'values\' array for an option', (done) ->
mediator =
urn: "urn:mediator:optionmediator-1"
name: "optionmediator-1"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
displayName: "Parameter 1"
description: "Test config"
type: "option"
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject a mediator if the config definition contains an empty \'values\' array for an option', (done) ->
mediator =
urn: "urn:mediator:optionmediator-2"
name: "optionmediator-2"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
displayName: "Parameter 1"
description: "Test config"
type: "option"
values: []
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should reject a mediator if the config definition contains a non-array \'values\' field for an option', (done) ->
mediator =
urn: "urn:mediator:optionmediator-3"
name: "optionmediator-3"
version: "0.8.0"
description: "Invalid mediator for testing"
endpoints: [
name: 'Patient'
host: 'localhost'
port: '8006'
type: 'http'
]
configDefs: [
param: "param1"
displayName: "Parameter 1"
description: "Test config"
type: "option"
values: "this is not an array"
]
request("https://localhost:8080")
.post("/mediators")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(mediator)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
describe "*removeMediator", ->
it "should remove an mediator with specified urn", (done) ->
mediatorDelete =
urn: "urn:uuid:EEA84E13-2M74-467C-UD7F-7C480462D1DF"
version: "1.0.0"
name: "Test Mediator"
description: "A mediator for testing"
endpoints: [
{
name: 'Save Encounter'
host: 'localhost'
port: '6000'
type: 'http'
}
]
defaultChannelConfig: [
name: "Test Mediator"
urlPattern: "/test"
type: 'http'
allow: []
routes: [
{
name: 'Test Route'
host: 'localhost'
port: '9000'
type: 'http'
}
]
]
mediator = new Mediator mediatorDelete
mediator.save (error, mediator) ->
should.not.exist(error)
Mediator.count (err, countBefore) ->
request("https://localhost:8080")
.del("/mediators/" + mediator.urn)
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.expect(200)
.end (err, res) ->
if err
done err
else
Mediator.count (err, countAfter) ->
Mediator.findOne { urn: mediator.urn }, (error, notFoundDoc) ->
(notFoundDoc == null).should.be.true
(countBefore - 1).should.equal countAfter
done()
it "should not allow a non admin user to remove a mediator", (done) ->
request("https://localhost:8080")
.del("/mediators/urn:uuid:EEA84E13-2M74-467C-UD7F-7C480462D1DF")
.set("auth-username", testUtils.nonRootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.expect(403)
.end (err, res) ->
if err
done err
else
done()
describe '*heartbeat()', ->
it 'should store uptime and lastHeartbeat then return a 200 status', (done) ->
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/heartbeat")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
"uptime": 50.25
)
.expect(200)
.end (err, res) ->
if err
done err
else
Mediator.findOne urn: mediator1.urn, (err, mediator) ->
if err
return done err
mediator._uptime.should.be.exactly 50.25
should.exist mediator._lastHeartbeat
res.body.should.be.empty()
done()
it 'should return config if the config was updated since the last heartbeat', (done) ->
new Mediator(mediator1).save ->
now = new Date()
prev = new Date()
update =
config:
param1: "val1"
param2: "val2"
_configModifiedTS: now
_lastHeartbeat: new Date(prev.setMinutes(now.getMinutes() - 5))
Mediator.findOneAndUpdate urn: mediator1.urn, update, (err) ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/heartbeat")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
"uptime": 50.25
)
.expect(200)
.end (err, res) ->
if err
done err
else
res.body.param1.should.be.exactly "val1"
res.body.param2.should.be.exactly "val2"
done()
it 'should return the latest config if the config property in the request is true', (done) ->
new Mediator(mediator1).save ->
now = new Date()
update =
config:
param1: "val1"
param2: "val2"
_configModifiedTS: now
_lastHeartbeat: now
Mediator.findOneAndUpdate urn: mediator1.urn, update, (err) ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/heartbeat")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
"uptime": 50.25
"config": true
)
.expect(200)
.end (err, res) ->
if err
done err
else
res.body.param1.should.be.exactly "val1"
res.body.param2.should.be.exactly "val2"
done()
it 'should deny access to a non admin user', (done) ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/heartbeat")
.set("auth-username", testUtils.nonRootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
uptime: 50.25
)
.expect(403)
.end (err, res) ->
if err
done err
else
done()
it 'should return a 404 if the mediator specified by urn cannot be found', (done) ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:this-doesnt-exist/heartbeat")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
uptime: 50.25
)
.expect(404)
.end (err, res) ->
if err
done err
else
done()
it 'should return a 400 if an invalid body is received', (done) ->
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/heartbeat")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
downtime: 0.5
)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
describe '*setConfig()', ->
it 'should deny access to a non admin user', (done) ->
request("https://localhost:8080")
.put("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/config")
.set("auth-username", testUtils.nonRootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
param1: "val1"
param2: "val2"
)
.expect(403)
.end (err, res) ->
if err
done err
else
done()
it 'should return a 404 if the mediator specified by urn cannot be found', (done) ->
request("https://localhost:8080")
.put("/mediators/urn:uuid:this-doesnt-exist/config")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
param1: "val1"
param2: "val2"
)
.expect(404)
.end (err, res) ->
if err
done err
else
done()
it 'should set the current config for a mediator and return a 200 status', (done) ->
mediator1.configDefs =
[
param: "param1"
type: "string"
,
param: "param2"
type: "string"
]
new Mediator(mediator1).save ->
request("https://localhost:8080")
.put("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/config")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
param1: "val1"
param2: "val2"
)
.expect(200)
.end (err, res) ->
if err
done err
else
Mediator.findOne urn: mediator1.urn, (err, mediator) ->
if err
return done err
mediator.config.param1.should.be.exactly "val1"
mediator.config.param2.should.be.exactly "val2"
should.exist mediator._configModifiedTS
done()
it 'should return a 400 if the config object contains unknown keys', (done) ->
mediator1.configDefs =
[
param: "param1"
type: "string"
,
param: "param2"
type: "string"
]
new Mediator(mediator1).save ->
request("https://localhost:8080")
.put("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/config")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send(
param1: "val1"
param2: "val2"
badParam: "val3"
)
.expect(400)
.end (err, res) ->
if err
done err
else
done()
describe '*loadDefaultChannels()', ->
it 'should deny access to non-admin users', (done) ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/channels")
.set("auth-username", testUtils.nonRootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send([])
.expect(403)
.end (err, res) ->
if err
done err
else
done()
it 'should add all channels in the defaultChannelConfig property', (done) ->
new Mediator(mediator1).save (err) ->
return done err if err
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/channels")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send([])
.expect(201)
.end (err, res) ->
return done err if err
Channel.find {}, (err, channels) ->
return done err if err
channels.length.should.be.exactly 2
channelNames = channels.map (channel) -> channel.name
channelNames.should.containEql 'Save Encounter 1'
channelNames.should.containEql 'Save Encounter 2'
done()
it 'should add selected channels in the defaultChannelConfig property if the body is set (save one)', (done) ->
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/channels")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send([ 'Save Encounter 2' ])
.expect(201)
.end (err, res) ->
if err
done err
else
Channel.find {}, (err, channels) ->
done err if err
channels.length.should.be.exactly 1
channels[0].name.should.be.exactly 'Save Encounter 2'
done()
it 'should add selected channels in the defaultChannelConfig property if the body is set (save both)', (done) ->
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/channels")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send([ 'Save Encounter 1', 'Save Encounter 2' ])
.expect(201)
.end (err, res) ->
if err
done err
else
Channel.find {}, (err, channels) ->
done err if err
channels.length.should.be.exactly 2
channelNames = channels.map (channel) -> channel.name
channelNames.should.containEql 'Save Encounter 1'
channelNames.should.containEql 'Save Encounter 2'
done()
it 'should return a 400 when a channel from the request body isn\'t found', (done) ->
new Mediator(mediator1).save ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:EEA84E13-1C92-467C-B0BD-7C480462D1ED/channels")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send([ 'Something Wrong' ])
.expect(400)
.end (err, res) ->
if err
done err
else
done()
it 'should return a 404 if the mediator isn\'t found', (done) ->
request("https://localhost:8080")
.post("/mediators/urn:uuid:MISSING/channels")
.set("auth-username", testUtils.rootUser.email)
.set("auth-ts", authDetails.authTS)
.set("auth-salt", authDetails.authSalt)
.set("auth-token", authDetails.authToken)
.send([])
.expect(404)
.end (err, res) ->
if err
done err
else
done()