UNPKG

openhim-core

Version:

The OpenHIM core application that provides logging and routing of http requests

764 lines (696 loc) 28.8 kB
should = require 'should' request = require 'supertest' server = require '../../lib/server' Channel = require('../../lib/model/channels').Channel Client = require('../../lib/model/clients').Client testUtils = require '../testUtils' auth = require('../testUtils').auth describe 'API Integration Tests', -> describe 'Roles REST Api testing', -> channel1 = name: 'TestChannel1' urlPattern: 'test/sample' allow: [ 'role1', 'role2', 'client4' ] routes: [ name: 'test route' host: 'localhost' port: 9876 primary: true ] channel2 = name: 'TestChannel2' urlPattern: 'test/sample' allow: [ 'role2', 'role3' ] routes: [ name: 'test route' host: 'localhost' port: 9876 primary: true ] client1 = clientID: 'client1' name: 'Client 1' roles: [ 'role1' ] client2 = clientID: 'client2' name: 'Client 2' roles: [ 'role2' ] client3 = clientID: 'client3' name: 'Client 3' roles: [ 'role1' 'role3' ] client4 = clientID: 'client4' name: 'Client 4' roles: [ 'other-role' ] authDetails = {} before (done) -> auth.setupTestUsers (err) -> return done err if err server.start apiPort: 8080, -> authDetails = auth.getAuthDetails() done() after (done) -> Client.remove {}, -> Channel.remove {}, -> server.stop -> auth.cleanupTestUsers -> done() beforeEach (done) -> Client.remove {}, -> (new Client client1).save (err, cl1) -> client1._id = cl1._id (new Client client2).save (err, cl2) -> client2._id = cl2._id (new Client client3).save (err, cl3) -> client3._id = cl3._id (new Client client4).save (err, cl4) -> client4._id = cl4._id Channel.remove {}, -> (new Channel channel1).save (err, ch1) -> channel1._id = ch1._id (new Channel channel2).save (err, ch2) -> channel2._id = ch2._id done() describe '*getRoles()', -> it 'should fetch all roles and list linked channels', (done) -> request('https://localhost:8080') .get('/roles') .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.exactly 4 names = res.body.map (r) -> r.name names.should.containEql 'role1' names.should.containEql 'role2' names.should.containEql 'role3' names.should.containEql 'other-role' mapChId = (chns) -> (chns.map (ch) -> ch._id) for role in res.body role.should.have.property 'channels' if role.name is 'role1' mapChId(role.channels).should.containEql "#{channel1._id}" if role.name is 'role2' mapChId(role.channels).should.containEql "#{channel1._id}" mapChId(role.channels).should.containEql "#{channel2._id}" if role.name is 'role3' mapChId(role.channels).should.containEql "#{channel2._id}" done() it 'should fetch all roles and list linked clients', (done) -> request('https://localhost:8080') .get('/roles') .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.exactly 4 names = res.body.map (r) -> r.name names.should.containEql 'role1' names.should.containEql 'role2' names.should.containEql 'role3' names.should.containEql 'other-role' mapClId = (cls) -> (cls.map (cl) -> cl._id) for role in res.body role.should.have.property 'clients' if role.name is 'role1' mapClId(role.clients).should.containEql "#{client1._id}" mapClId(role.clients).should.containEql "#{client3._id}" if role.name is 'role2' mapClId(role.clients).should.containEql "#{client2._id}" if role.name is 'role3' mapClId(role.clients).should.containEql "#{client3._id}" if role.name is 'other-role' mapClId(role.clients).should.containEql "#{client4._id}" done() it 'should fetch all roles if there are only linked clients', (done) -> Channel.remove {}, -> request('https://localhost:8080') .get('/roles') .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.exactly 4 names = res.body.map (r) -> r.name names.should.containEql 'role1' names.should.containEql 'role2' names.should.containEql 'role3' names.should.containEql 'other-role' mapClId = (cls) -> (cls.map (cl) -> cl._id) for role in res.body role.should.have.property 'clients' if role.name is 'role1' mapClId(role.clients).should.containEql "#{client1._id}" mapClId(role.clients).should.containEql "#{client3._id}" if role.name is 'role2' mapClId(role.clients).should.containEql "#{client2._id}" if role.name is 'role3' mapClId(role.clients).should.containEql "#{client3._id}" if role.name is 'other-role' mapClId(role.clients).should.containEql "#{client4._id}" done() it 'should not misinterpret a client as a role', (done) -> request('https://localhost:8080') .get('/roles') .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.exactly 4 names = res.body.map (r) -> r.name names.should.not.containEql 'client4' done() it 'should reject a request from a non root user', (done) -> request('https://localhost:8080') .get('/roles') .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) -> done err describe '*getRole()', -> it 'should get a role', (done) -> request('https://localhost:8080') .get('/roles/role2') .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.should.have.property 'name', 'role2' res.body.should.have.property 'channels' res.body.should.have.property 'clients' res.body.channels.length.should.be.exactly 2 mapId = (arr) -> (arr.map (a) -> a._id) mapId(res.body.channels).should.containEql "#{channel1._id}" mapId(res.body.channels).should.containEql "#{channel2._id}" mapId(res.body.clients).should.containEql "#{client2._id}" done() it 'should get a role that is just linked to a client', (done) -> request('https://localhost:8080') .get('/roles/other-role') .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.should.have.property 'name', 'other-role' res.body.should.have.property 'clients' res.body.clients.length.should.be.exactly 1 mapId = (arr) -> (arr.map (a) -> a._id) mapId(res.body.clients).should.containEql "#{client4._id}" done() it 'should respond with 404 Not Found if role does not exist', (done) -> request('https://localhost:8080') .get('/roles/nonexistent') .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) -> done err it 'should reject a request from a non root user', (done) -> request('https://localhost:8080') .get('/roles/role1') .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) -> done err describe '*addRole()', -> it 'should respond with 400 Bad Request if role already exists', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role1' channels: [_id: "#{channel2._id}"] .expect(400) .end (err, res) -> done err it 'should add a role', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role4' channels: [ _id: "#{channel1._id}" , _id: "#{channel2._id}" ] .expect(201) .end (err, res) -> return done err if err Channel.find allow: $in: ['role4'], (err, channels) -> return done err if err channels.length.should.be.exactly 2 mapChId = (chns) -> (chns.map (ch) -> "#{ch._id}") mapChId(channels).should.containEql "#{channel1._id}" mapChId(channels).should.containEql "#{channel2._id}" done() it 'should add a role and update clients', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role4' channels: [ _id: "#{channel1._id}" , _id: "#{channel2._id}" ] clients: [ _id: "#{client1._id}" , _id: "#{client2._id}" ] .expect(201) .end (err, res) -> return done err if err Client.find roles: $in: ['role4'], (err, clients) -> return done err if err clients.length.should.be.exactly 2 mapId = (arr) -> (arr.map (a) -> "#{a._id}") mapId(clients).should.containEql "#{client1._id}" mapId(clients).should.containEql "#{client2._id}" done() it 'should add a role and update channels specified with either _id or name', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role4' channels: [ _id: "#{channel1._id}" , name: channel2.name ] .expect(201) .end (err, res) -> return done err if err Channel.find allow: $in: ['role4'], (err, channels) -> return done err if err channels.length.should.be.exactly 2 mapChId = (chns) -> (chns.map (ch) -> "#{ch._id}") mapChId(channels).should.containEql "#{channel1._id}" mapChId(channels).should.containEql "#{channel2._id}" done() it 'should add a role and update clients specified with either _id or clientID', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role4' channels: [ _id: "#{channel1._id}" , _id: "#{channel2._id}" ] clients: [ _id: "#{client1._id}" , clientID: "#{client2.clientID}" ] .expect(201) .end (err, res) -> return done err if err Client.find roles: $in: ['role4'], (err, clients) -> return done err if err clients.length.should.be.exactly 2 mapId = (arr) -> (arr.map (a) -> "#{a._id}") mapId(clients).should.containEql "#{client1._id}" mapId(clients).should.containEql "#{client2._id}" done() it 'should respond with 400 Bad Request if name is not specified', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [ _id: "#{channel1._id}" , _id: "#{channel2._id}" ] .expect(400) .end (err, res) -> done err it 'should respond with 400 Bad Request if channels is empty', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role2' channels: [] .expect(400) .end (err, res) -> done err it 'should respond with 400 Bad Request if channels and clients are not specified', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role2' .expect(400) .end (err, res) -> done err it 'should reject a request from a non root user', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.nonRootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role4' channels: [_id: "#{channel1._id}"] .expect(403) .end (err, res) -> done err it 'should add a role for clients', (done) -> request('https://localhost:8080') .post('/roles') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role4' clients: [ _id: "#{client1._id}" , _id: "#{client2._id}" ] .expect(201) .end (err, res) -> return done err if err Client.find roles: $in: ['role4'], (err, clients) -> return done err if err clients.length.should.be.exactly 2 mapId = (arr) -> (arr.map (a) -> "#{a._id}") mapId(clients).should.containEql "#{client1._id}" mapId(clients).should.containEql "#{client2._id}" done() describe '*updateRole()', -> it 'should respond with 400 Not Found if role doesn\'t exist', (done) -> request('https://localhost:8080') .put('/roles/role4') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [_id: "#{channel1._id}"] .expect(404) .end (err, res) -> done err it 'should update a role (enable role1 on channel2 and remove from channel1)', (done) -> request('https://localhost:8080') .put('/roles/role1') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [_id: "#{channel2._id}"] .expect(200) .end (err, res) -> return done err if err Channel.find allow: $in: ['role1'], (err, channels) -> return done err if err channels.length.should.be.exactly 1 mapChId = (chns) -> (chns.map (ch) -> "#{ch._id}") mapChId(channels).should.containEql "#{channel2._id}" done() it 'should update a role (enable role1 for client2 and client3 and disable for client1)', (done) -> request('https://localhost:8080') .put('/roles/role1') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send clients: [ _id: "#{client2._id}" , _id: "#{client3._id}" ] .expect(200) .end (err, res) -> return done err if err Client.find roles: $in: ['role1'], (err, clients) -> return done err if err clients.length.should.be.exactly 2 mapId = (arr) -> (arr.map (a) -> "#{a._id}") mapId(clients).should.containEql "#{client2._id}" mapId(clients).should.containEql "#{client3._id}" done() it 'should update a role (enable role1 on both channel1 and channel2)', (done) -> request('https://localhost:8080') .put('/roles/role1') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [ _id: "#{channel1._id}" , _id: "#{channel2._id}" ] .expect(200) .end (err, res) -> return done err if err Channel.find allow: $in: ['role1'], (err, channels) -> return done err if err channels.length.should.be.exactly 2 mapChId = (chns) -> (chns.map (ch) -> "#{ch._id}") mapChId(channels).should.containEql "#{channel1._id}" mapChId(channels).should.containEql "#{channel2._id}" done() it 'should remove a role from all channels that is an update of an empty channel array', (done) -> request('https://localhost:8080') .put('/roles/role2') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [] .expect(200) .end (err, res) -> return done err if err Channel.find allow: $in: ['role2'], (err, channels) -> return done err if err channels.length.should.be.exactly 0 done() it 'should not remove a role from clients if update contains empty channel array', (done) -> request('https://localhost:8080') .put('/roles/role2') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [] .expect(200) .end (err, res) -> return done err if err Client.find roles: $in: ['role2'], (err, clients) -> return done err if err clients.length.should.be.exactly 1 done() it 'should remove a role from all channels and clients if update contains empty channel and clients arrays', (done) -> request('https://localhost:8080') .put('/roles/role2') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [] clients: [] .expect(200) .end (err, res) -> return done err if err Channel.find allow: $in: ['role2'], (err, channels) -> return done err if err channels.length.should.be.exactly 0 Client.find roles: $in: ['role2'], (err, clients) -> return done err if err clients.length.should.be.exactly 0 done() it 'should update a role using channel name', (done) -> request('https://localhost:8080') .put('/roles/role1') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [name: channel2.name] .expect(200) .end (err, res) -> return done err if err Channel.find allow: $in: ['role1'], (err, channels) -> return done err if err channels.length.should.be.exactly 1 mapChId = (chns) -> (chns.map (ch) -> "#{ch._id}") mapChId(channels).should.containEql "#{channel2._id}" done() it 'should reject a request from a non root user', (done) -> request('https://localhost:8080') .put('/roles/role1') .set('auth-username', testUtils.nonRootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [_id: "#{channel2._id}"] .expect(403) .end (err, res) -> done err it 'should rename a role', (done) -> request('https://localhost:8080') .put('/roles/role1') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'the-new-role-name' .expect(200) .end (err, res) -> return done err if err Channel.find allow: $in: ['the-new-role-name'], (err, channels) -> return done err if err channels.length.should.be.exactly 1 mapChId = (chns) -> (chns.map (ch) -> "#{ch._id}") mapChId(channels).should.containEql "#{channel1._id}" Client.find roles: $in: ['the-new-role-name'], (err, clients) -> return done err if err clients.length.should.be.exactly 2 mapClId = (cls) -> (cls.map (cl) -> "#{cl._id}") mapClId(clients).should.containEql "#{client1._id}" mapClId(clients).should.containEql "#{client3._id}" done() it 'should reject a request to rename a role into an existing role name', (done) -> request('https://localhost:8080') .put('/roles/role1') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send name: 'role2' .expect(400) .end (err, res) -> done err describe '*deleteRole()', -> it 'should respond with 404 Not Found if role doesn\'t exist', (done) -> request('https://localhost:8080') .put('/roles/role4') .set('auth-username', testUtils.rootUser.email) .set('auth-ts', authDetails.authTS) .set('auth-salt', authDetails.authSalt) .set('auth-token', authDetails.authToken) .send channels: [_id: "#{channel1._id}"] .expect(404) .end (err, res) -> done err it 'should delete a role', (done) -> request('https://localhost:8080') .delete('/roles/role2') .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) -> return done err if err Channel.find allow: $in: ['role2'], (err, channels) -> return done err if err channels.length.should.be.exactly 0 Client.find roles: $in: ['role2'], (err, clients) -> return done err if err clients.length.should.be.exactly 0 done() it 'should delete a role that\'s only linked to a client', (done) -> request('https://localhost:8080') .delete('/roles/other-role') .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) -> return done err if err Client.find roles: $in: ['other-role'], (err, clients) -> return done err if err clients.length.should.be.exactly 0 done() it 'should reject a request from a non root user', (done) -> request('https://localhost:8080') .delete('/roles/role2') .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) -> done err