UNPKG

openhim-core

Version:

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

308 lines (242 loc) 12.2 kB
should = require "should" request = require "supertest" server = require "../../lib/server" Transaction = require("../../lib/model/transactions").Transaction Task = require("../../lib/model/tasks").Task Channel = require("../../lib/model/channels").Channel tasks = require "../../lib/tasks" testUtils = require "../testUtils" auth = require("../testUtils").auth ObjectId = require('mongoose').Types.ObjectId describe "Rerun Task Tests", -> transaction1 = _id: "53bfbccc6a2b417f6cd14871" channelID: "53bbe25485e66d8e5daad4a2" clientID: "42bbe25485e77d8e5daad4b4" request: { path: "/sample/api", headers: { authorization: "Basic dGVzdDp0ZXN0", "user-agent": "curl/7.35.0", host: "localhost:5001" }, querystring: "param=hello", body: "", method: "GET", timestamp: "2014-07-15T08:10:45.109Z" } status: "Completed" task1 = _id: "53c4dd063b8cb04d2acf0adc" created: "2014-07-15T07:49:26.238Z" remainingTransactions: 3 totalTransactions: 3 status: "Queued" transactions: [ {tid: "53bfbccc6a2b417f6cd14871", tstatus: "Queued"}, {tid: "53bfbcd06a2b417f6cd14872", tstatus: "Queued"}, {tid: "aaaaaaaaaabbbbbbbbbbcccc", tstatus: "Queued"} ] user: "root@openhim.org" channel1 = _id: "53bbe25485e66d8e5daad4a2" name: "TestChannel1" urlPattern: "test/sample" allow: [ "PoC", "Test1", "Test2" ] routes: [ name: "test route" host: "localhost" port: 9876 primary: true ] txViewAcl: "aGroup" authDetails = {} beforeEach (done) -> Transaction.remove {}, -> (new Transaction transaction1).save (err) -> Task.remove {}, -> (new Task task1).save -> Channel.remove {}, -> (new Channel channel1).save -> done() afterEach (done) -> Transaction.remove {}, -> Task.remove {}, -> done() beforeEach -> authDetails = auth.getAuthDetails() describe '*rerunGetTransaction()', -> it 'should run rerunGetTransaction() and return Transaction object successfully', (done) -> transactionID = '53bfbccc6a2b417f6cd14871' # run the tasks function and check results tasks.rerunGetTransaction transactionID, (err, transaction) -> transaction.clientID.toString().should.equal "42bbe25485e77d8e5daad4b4" transaction.status.should.equal "Completed" transaction.request.path.should.equal "/sample/api" transaction.request.querystring.should.equal "param=hello" transaction.request.method.should.equal "GET" done() it 'should run rerunGetTaskTransactionsData() and return transaction not found error', (done) -> transactionID = 'aaaaaaaaaabbbbbbbbbbcccc' # run the tasks function and check results tasks.rerunGetTransaction transactionID, (err, transaction) -> err.message.should.equal "Transaction aaaaaaaaaabbbbbbbbbbcccc could not be found" done() describe '*rerunSetHTTPRequestOptions()', -> it 'should run rerunSetHTTPRequestOptions() and return HTTP options object successfully', (done) -> taskID = '53c4dd063b8cb04d2acf0adc' transactionID = "53bfbccc6a2b417f6cd14871" Transaction.findOne { _id: transactionID }, (err, transaction) -> # run the tasks function and check results tasks.rerunSetHTTPRequestOptions transaction, taskID, (err, options) -> options.should.have.property "hostname", "localhost" options.should.have.property "port", 7786 options.should.have.property "path", "/sample/api?param=hello" options.should.have.property "method", "GET" options.headers.should.have.property "clientID", ObjectId("42bbe25485e77d8e5daad4b4") options.headers.should.have.property "parentID", ObjectId("53bfbccc6a2b417f6cd14871") done() it 'should run rerunSetHTTPRequestOptions() and return error if no Transaction object supplied', (done) -> taskID = '53c4dd063b8cb04d2acf0adc' transaction = null tasks.rerunSetHTTPRequestOptions transaction, taskID, (err, options) -> err.message.should.equal "An empty Transaction object was supplied. Aborting HTTP options configuration" done() describe '*rerunHttpRequestSend()', -> it 'should run rerunHttpRequestSend() and return a successfull response', (done) -> server = testUtils.createMockServer 200, "Mock response for rerun Transaction #53bfbccc6a2b417f6cd14871", 7786, -> taskID = '53c4dd063b8cb04d2acf0adc' transactionID = "53bfbccc6a2b417f6cd14871" Transaction.findOne { _id: transactionID }, (err, transaction) -> # run the tasks function and check results tasks.rerunSetHTTPRequestOptions transaction, taskID, (err, options) -> # transaction object retrieved from fineOne # options generated from 'rerunSetHTTPRequestOptions' function tasks.rerunHttpRequestSend options, transaction, (err, HTTPResponse) -> HTTPResponse.transaction.should.have.property "status", "Completed" HTTPResponse.should.have.property "body", "Mock response for rerun Transaction #53bfbccc6a2b417f6cd14871" HTTPResponse.should.have.property "status", 200 HTTPResponse.should.have.property "message", "OK" server.close -> done() it 'should run rerunHttpRequestSend() and fail when "options" is null', (done) -> transactionID = "53bfbccc6a2b417f6cd14871" Transaction.findOne { _id: transactionID }, (err, transaction) -> options = null tasks.rerunHttpRequestSend options, transaction, (err, HTTPResponse) -> err.message.should.equal "An empty 'Options' object was supplied. Aborting HTTP Send Request" done() it 'should run rerunHttpRequestSend() and fail when "transaction" is null', (done) -> options = {} options.hostname = "localhost" options.port = 7786 options.path = "/sample/api?param=hello" options.method = "GET" transaction = null tasks.rerunHttpRequestSend options, transaction, (err, HTTPResponse) -> err.message.should.equal "An empty 'Transaction' object was supplied. Aborting HTTP Send Request" done() it 'should run rerunHttpRequestSend() and return 500 Internal Server Error', (done) -> server = testUtils.createMockServer 200, "Mock response for rerun Transaction #53bfbccc6a2b417f6cd14871", 5252, -> transactionID = "53bfbccc6a2b417f6cd14871" Transaction.findOne { _id: transactionID }, (err, transaction) -> options = { hostname: "localhost", port: 1000, path: "/fakepath", method: "GET" } tasks.rerunHttpRequestSend options, transaction, (err, HTTPResponse) -> HTTPResponse.transaction.should.have.property "status", "Failed" HTTPResponse.should.have.property "status", 500 HTTPResponse.should.have.property "message", "Internal Server Error" server.close -> done() describe '*rerunTcpRequestSend()', -> it "should rerun the tcp request", (done) -> server = testUtils.createMockTCPServer 6000, 'this is a test server', 'TCP OK', 'TCP Not OK', -> channel = {} channel.tcpHost = "127.0.0.1" channel.tcpPort = 6000 channel.type = 'tcp' transaction = { request : { body : 'this is a test server' } } tasks.rerunTcpRequestSend channel, transaction, (err, data) -> data.body.should.be.exactly 'TCP OK' server.close -> done() describe '*findAndProcessAQueuedTask()', -> it 'should find the next available queued task and process its next round', (done) -> server = testUtils.createMockServer 200, "Mock response", 7786, -> tasks.findAndProcessAQueuedTask() validateTask = -> Task.findOne _id: task1._id, (err, task) -> # only processed one round, task should be back in queued status with one transaction processed task.status.should.be.equal 'Queued' task.remainingTransactions.should.be.equal 2 task.transactions[0].tstatus.should.be.equal 'Completed' task.transactions[1].tstatus.should.be.equal 'Queued' task.transactions[2].tstatus.should.be.equal 'Queued' server.close -> done() setTimeout validateTask, 100 * global.testTimeoutFactor it 'should process X transactions where X is the batch size', (done) -> Task.update { _id: task1._id }, { batchSize: 2 }, (err) -> return done err if err server = testUtils.createMockServer 200, "Mock response", 7786, -> tasks.findAndProcessAQueuedTask() validateTask = -> Task.findOne _id: task1._id, (err, task) -> # only processed one round, task should be back in queued status with two transactions processed task.status.should.be.equal 'Queued' task.remainingTransactions.should.be.equal 1 task.transactions[0].tstatus.should.be.equal 'Completed' task.transactions[1].tstatus.should.be.equal 'Failed' #non-existent task.transactions[2].tstatus.should.be.equal 'Queued' server.close -> done() setTimeout validateTask, 100 * global.testTimeoutFactor it 'should complete a queued task after all its transactions are finished', (done) -> Task.update { _id: task1._id }, { batchSize: 3 }, (err) -> return done err if err server = testUtils.createMockServer 200, "Mock response", 7786, -> tasks.findAndProcessAQueuedTask() validateTask = -> Task.findOne _id: task1._id, (err, task) -> # After one round, task should be in completed status with three transactions processed task.status.should.be.equal 'Completed' task.remainingTransactions.should.be.equal 0 task.transactions[0].tstatus.should.be.equal 'Completed' task.transactions[1].tstatus.should.be.equal 'Failed' #non-existent task.transactions[2].tstatus.should.be.equal 'Failed' #non-existent server.close -> done() setTimeout validateTask, 100 * global.testTimeoutFactor it 'should not process a paused task', (done) -> Task.update { _id: task1._id }, { status: 'Paused' }, (err) -> return done err if err server = testUtils.createMockServer 200, "Mock response", 7786, -> tasks.findAndProcessAQueuedTask() validateTask = -> Task.findOne _id: task1._id, (err, task) -> # Task should be untouched task.status.should.be.equal 'Paused' task.remainingTransactions.should.be.equal 3 task.transactions[0].tstatus.should.be.equal 'Queued' task.transactions[1].tstatus.should.be.equal 'Queued' task.transactions[2].tstatus.should.be.equal 'Queued' server.close -> done() setTimeout validateTask, 100 * global.testTimeoutFactor it 'should not process a cancelled task', (done) -> Task.update { _id: task1._id }, { status: 'Cancelled' }, (err) -> return done err if err server = testUtils.createMockServer 200, "Mock response", 7786, -> tasks.findAndProcessAQueuedTask() validateTask = -> Task.findOne _id: task1._id, (err, task) -> # Task should be untouched task.status.should.be.equal 'Cancelled' task.remainingTransactions.should.be.equal 3 task.transactions[0].tstatus.should.be.equal 'Queued' task.transactions[1].tstatus.should.be.equal 'Queued' task.transactions[2].tstatus.should.be.equal 'Queued' server.close -> done() setTimeout validateTask, 100 * global.testTimeoutFactor