UNPKG

openhim-core

Version:

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

384 lines (345 loc) 16.6 kB
should = require "should" request = require "supertest" server = require "../../lib/server" Audit = require("../../lib/model/audits").Audit AuditMeta = require("../../lib/model/audits").AuditMeta testUtils = require "../testUtils" auth = require("../testUtils").auth describe "API Integration Tests", -> beforeEach (done) -> Audit.remove {}, -> AuditMeta.remove {}, -> done() afterEach (done)-> Audit.remove {}, -> AuditMeta.remove {}, -> done() describe "Audits REST Api testing", -> auditData = rawMessage: 'This will be the raw ATNA message that gets received to be used as a backup reference' eventIdentification: eventDateTime: '2015-02-20T15:38:25.282Z' eventOutcomeIndicator: '0' eventActionCode: 'E' eventID: code: '110112' displayName: 'Query' codeSystemName: 'DCM' eventTypeCode: code: 'ITI-9' displayName: 'PIX Query' codeSystemName: 'IHE Transactions' activeParticipant: [ { userID: 'pix|pix' alternativeUserID: '2100' userIsRequestor: 'false' networkAccessPointID: 'localhost' networkAccessPointTypeCode: '1' roleIDCode: code: '110152' displayName: 'Destination' codeSystemName: 'DCM' }, { userID: 'pix|pix' alternativeUserID: '2100' userIsRequestor: 'false' networkAccessPointID: 'localhost' networkAccessPointTypeCode: '1' roleIDCode: code: '110152' displayName: 'Destination' codeSystemName: 'DCM' } ] auditSourceIdentification: auditSourceID: 'openhim' participantObjectIdentification: [ { participantObjectID: '975cac30-68e5-11e4-bf2a-04012ce65b02^^^ECID&ECID&ISO' participantObjectTypeCode: '1' participantObjectTypeCodeRole: '1' participantObjectIDTypeCode: code: '2' displayName: 'PatientNumber' codeSystemName: 'RFC-3881' }, { participantObjectID: 'dca6c09e-cc92-4bc5-8741-47bd938fa405' participantObjectTypeCode: '2' participantObjectTypeCodeRole: '24' participantObjectIDTypeCode: code: 'ITI-9' displayName: 'PIX Query' codeSystemName: 'IHE Transactions' participantObjectQuery: 'TVNIfF5+XCZ8b3BlbmhpbXxvcGVuaGltLW1lZGlhdG9yLW9oaWUteGRzfHBpeHxwaXh8MjAxNTAyMjAxNTM4MjUrMDIwMHx8UUJQXlEyM15RQlBfUTIxfDEwMDQxYWQ5LTkyNDAtNDEyNS04ZDMwLWZiYzczNGEwOTMwMXxQfDIuNQ1RUER8SUhFIFBJWCBRdWVyeXw1OTRhNDVkYS0zOTY5LTQzOTAtODE2Ni01MjhkZDFmNWU0ZTF8NzZjYzc2NWE0NDJmNDEwXl5eJjEuMy42LjEuNC4xLjIxMzY3LjIwMDUuMy43JklTT15QSXxeXl5FQ0lEJkVDSUQmSVNPXlBJDVJDUHxJDQ==' participantObjectDetail: type: 'MSH-10' value: 'MTAwNDFhZDktOTI0MC00MTI1LThkMzAtZmJjNzM0YTA5MzAx' } ] authDetails = {} before (done) -> auth.setupTestUsers (err) -> server.start apiPort: 8080, -> done() after (done) -> auth.cleanupTestUsers (err) -> server.stop -> done() beforeEach -> authDetails = auth.getAuthDetails() describe "*addAudit()", -> it "should add a audit and return status 201 - audit created", (done) -> request("https://localhost:8080") .post("/audits") .set("auth-username", testUtils.rootUser.email) .set("auth-ts", authDetails.authTS) .set("auth-salt", authDetails.authSalt) .set("auth-token", authDetails.authToken) .send(auditData) .expect(201) .end (err, res) -> if err done err else Audit.findOne { "eventIdentification.eventDateTime": "2015-02-20T15:38:25.282Z" }, (error, newAudit) -> should.not.exist (error) (newAudit != null).should.be.true newAudit.eventIdentification.eventActionCode.should.equal "E" newAudit.eventIdentification.eventID.code.should.equal "110112" newAudit.eventIdentification.eventID.displayName.should.equal "Query" newAudit.eventIdentification.eventID.codeSystemName.should.equal "DCM" newAudit.activeParticipant.length.should.equal 2 newAudit.activeParticipant[0].userID.should.equal "pix|pix" newAudit.activeParticipant[0].networkAccessPointID.should.equal "localhost" newAudit.auditSourceIdentification.auditSourceID.should.equal "openhim" newAudit.participantObjectIdentification.length.should.equal 2 newAudit.participantObjectIdentification[0].participantObjectID.should.equal "975cac30-68e5-11e4-bf2a-04012ce65b02^^^ECID&ECID&ISO" newAudit.participantObjectIdentification[0].participantObjectIDTypeCode.codeSystemName.should.equal "RFC-3881" newAudit.participantObjectIdentification[1].participantObjectID.should.equal "dca6c09e-cc92-4bc5-8741-47bd938fa405" newAudit.participantObjectIdentification[1].participantObjectIDTypeCode.codeSystemName.should.equal "IHE Transactions" done() it "should only allow admin users to add audits", (done) -> request("https://localhost:8080") .post("/audits") .set("auth-username", testUtils.nonRootUser.email) .set("auth-ts", authDetails.authTS) .set("auth-salt", authDetails.authSalt) .set("auth-token", authDetails.authToken) .send(auditData) .expect(403) .end (err, res) -> if err done err else done() describe "*getAudits()", -> it "should call getAudits ", (done) -> Audit.count {}, (err, countBefore) -> newAudit = new Audit auditData newAudit.save (error, result) -> should.not.exist (error) request("https://localhost:8080") .get("/audits?filterPage=0&filterLimit=10&filters={}") .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.equal countBefore + 1 done() it "should call getAudits with filter paramaters ", (done) -> startDate = "2015-02-20T00:00:00.000Z" endDate = "2015-02-21T00:00:00.000Z" filters = {} filters["eventIdentification.eventDateTime"] = "{ \"$gte\": \"2015-02-20T00:00:00.000Z\",\"$lte\": \"2015-02-21T00:00:00.000Z\" }" filters = JSON.stringify filters Audit.count {}, (err, countBefore) -> audit = new Audit auditData audit.save (error, result) -> should.not.exist (error) request("https://localhost:8080") .get("/audits?filterPage=0&filterLimit=10&filters="+encodeURIComponent(filters)) .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.equal countBefore + 1 done() it "should generate an 'audit log used' audit when using non-basic representation", (done) -> audit = new Audit auditData audit.save (err, result)-> return done err if err request("https://localhost:8080") .get("/audits?filterRepresentation=full") .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 setTimeout -> Audit.find {}, (err, newAudits) -> return done err if err newAudits.length.should.be.exactly 2 if newAudits[0].eventIdentification.eventID.displayName is 'Audit Log Used' newAudits[0].participantObjectIdentification.length.should.be.exactly 1 newAudits[0].participantObjectIdentification[0].participantObjectID.should.be.exactly "https://localhost:8080/audits/#{result._id}" else newAudits[1].eventIdentification.eventID.displayName is 'Audit Log Used' newAudits[1].participantObjectIdentification.length.should.be.exactly 1 newAudits[1].participantObjectIdentification[0].participantObjectID.should.be.exactly "https://localhost:8080/audits/#{result._id}" done() , 100 * global.testTimeoutFactor it "should NOT generate an 'audit log used' audit when using basic (default) representation", (done) -> audit = new Audit auditData audit.save (err, result)-> return done err if err request("https://localhost:8080") .get("/audits") .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 Audit.find {}, (err, newAudits) -> return done err if err newAudits.length.should.be.exactly 1 done() describe "*getAuditById (auditId)", -> it "should fetch a audit by ID - admin user", (done) -> audit = new Audit auditData audit.save (err, result)-> should.not.exist(err) auditId = result._id request("https://localhost:8080") .get("/audits/#{auditId}") .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 != null).should.be.true res.body.eventIdentification.eventDateTime.should.equal "2015-02-20T15:38:25.282Z" res.body.eventIdentification.eventActionCode.should.equal "E" res.body.eventIdentification.eventID.code.should.equal "110112" res.body.eventIdentification.eventID.displayName.should.equal "Query" res.body.eventIdentification.eventID.codeSystemName.should.equal "DCM" res.body.activeParticipant.length.should.equal 2 res.body.activeParticipant[0].userID.should.equal "pix|pix" res.body.activeParticipant[0].networkAccessPointID.should.equal "localhost" res.body.auditSourceIdentification.auditSourceID.should.equal "openhim" res.body.participantObjectIdentification.length.should.equal 2 res.body.participantObjectIdentification[0].participantObjectID.should.equal "975cac30-68e5-11e4-bf2a-04012ce65b02^^^ECID&ECID&ISO" res.body.participantObjectIdentification[0].participantObjectIDTypeCode.codeSystemName.should.equal "RFC-3881" res.body.participantObjectIdentification[1].participantObjectID.should.equal "dca6c09e-cc92-4bc5-8741-47bd938fa405" res.body.participantObjectIdentification[1].participantObjectIDTypeCode.codeSystemName.should.equal "IHE Transactions" done() it "should NOT return a audit that a user is not allowed to view", (done) -> audit = new Audit auditData audit.save (err, result)-> should.not.exist(err) auditId = result._id request("https://localhost:8080") .get("/audits/#{auditId}") .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() it "should generate an 'audit log used' audit", (done) -> audit = new Audit auditData audit.save (err, result)-> return done err if err request("https://localhost:8080") .get("/audits/#{result._id}") .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 setTimeout -> Audit.find {}, (err, newAudits) -> return done err if err newAudits.length.should.be.exactly 2 if newAudits[0].eventIdentification.eventID.displayName is 'Audit Log Used' newAudits[0].participantObjectIdentification.length.should.be.exactly 1 newAudits[0].participantObjectIdentification[0].participantObjectID.should.be.exactly "https://localhost:8080/audits/#{result._id}" else newAudits[1].eventIdentification.eventID.displayName is 'Audit Log Used' newAudits[1].participantObjectIdentification.length.should.be.exactly 1 newAudits[1].participantObjectIdentification[0].participantObjectID.should.be.exactly "https://localhost:8080/audits/#{result._id}" done() , 100 * global.testTimeoutFactor describe "*getAuditsFilterOptions", -> it "should fetch dropdown filter options - admin user", (done) -> request("https://localhost:8080") .post("/audits") .set("auth-username", testUtils.rootUser.email) .set("auth-ts", authDetails.authTS) .set("auth-salt", authDetails.authSalt) .set("auth-token", authDetails.authToken) .send(auditData) .expect(201) .end (err, res) -> if err done err else request("https://localhost:8080") .get("/audits-filter-options") .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 != null).should.be.true res.body.eventType.length.should.equal 1 res.body.eventID.length.should.equal 1 res.body.activeParticipantRoleID.length.should.equal 1 res.body.participantObjectIDTypeCode.length.should.equal 2 done() it "should NOT return a filter dropdown object if user is not admin", (done) -> audit = new Audit auditData audit.save (err, result)-> should.not.exist(err) request("https://localhost:8080") .get("/audits-filter-options") .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()