Skip to content

Commit

Permalink
Feature/33961 Updated check expiry to use pupil status v2 message (#1256
Browse files Browse the repository at this point in the history
)

* Updated check expiry to use pupil status v2 message

* Relocated new updated method within pupil status function

* method reference fix

* captured cases where check data is not an array type and included spec

* updated test case

* Removed unused properties before message queue submission
  • Loading branch information
GeorgeChatzigiannis authored and GuyHarwood committed Jun 26, 2019
1 parent ea5ace6 commit d8191cf
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 4 deletions.
4 changes: 2 additions & 2 deletions functions/check-expiry/v2.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const sqlService = require('../lib/sql/sql.service')
const { TYPES } = sqlService
const azureStorageHelper = require('../lib/azure-storage-helper')
const pupilStatusService = require('../pupil-status/pupil-status.service')

const v2 = {
process: async function process (logger) {
Expand All @@ -14,7 +14,7 @@ const v2 = {
await expireRestarts(checkData)

// finally, update the pupil status
await azureStorageHelper.updatePupilStatusForLiveChecks(logger, 'check-expiry', checkData)
await pupilStatusService.updatePupilStatusForLiveChecksV2(logger, 'check-expiry', checkData)

return {
processCount: checkData.length
Expand Down
36 changes: 34 additions & 2 deletions functions/pupil-status/pupil-status.service.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
'use strict'

const pupilStatusAnalysisService = require('./pupil-status-analysis.service')
const R = require('ramda')
const sqlService = require('../lib/sql/sql.service')
const { TYPES } = sqlService

const azureStorageHelper = require('../lib/azure-storage-helper')
const pupilStatusAnalysisService = require('./pupil-status-analysis.service')

async function recalculatePupilStatus (pupilId) {
const currentData = await getCurrentPupilData(pupilId)
const currentStatusCode = currentData.pupilStatusCode
Expand Down Expand Up @@ -69,6 +71,36 @@ async function changePupilState (pupilId, targetStatusCode) {
return sqlService.modify(sql, params)
}

/**
* Filter for live checks and make a request for the pupil-status to be updated for multiple pupils on v2
* @param {Object} logger
* @param {String} logPrefix
* @param {[{checkId: <number>, pupilId: <number>, checkCode: <string>, isLiveCheck: <boolean>}]} checkData - must contain `checkId`, `pupilId`, `checkCode` and `isLiveCheck` props
* @return {Promise<*|Promise<*>>}
*/
async function updatePupilStatusForLiveChecksV2 (logger, logPrefix, checkData) {
if (!checkData || !Array.isArray(checkData)) {
logger.error(`${logPrefix}: updatePupilStatusV2(): ERROR: check data provided must be an array`)
return
}
logger.info(`${logPrefix}: updatePupilStatusV2(): got ${checkData.length} pupils`)
// Batch the async messages up for live checks only, to limit max concurrency
const batches = R.splitEvery(100, R.filter(c => c.isLiveCheck, checkData))
checkData = null
batches.forEach(async (checks, batchNumber) => {
try {
await azureStorageHelper.addMessageToQueue('pupil-status', {
version: 2,
messages: R.map(i => R.pick(['pupilId', 'checkCode'], i), checks)
})
logger.verbose(`${logPrefix}: batch ${batchNumber} complete`)
} catch (error) {
logger.error(`${logPrefix}: updatePupilStatusV2(): ERROR: ${error.message}`)
}
})
}

module.exports = {
recalculatePupilStatus
recalculatePupilStatus,
updatePupilStatusForLiveChecksV2
}
68 changes: 68 additions & 0 deletions functions/pupil-status/pupil-status.service.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
'use strict'

/* global describe, expect, it, spyOn */

const azureStorageHelper = require('../lib/azure-storage-helper')
const pupilStatusService = require('./pupil-status.service')

describe('pupil-status.service', () => {
const logger = {
info: () => {},
verbose: () => {},
error: () => {}
}
let logPrefix = 'logPrefix'
let checkData = []
for (let i = 0; i < 300; i++) {
checkData.push({ id: i + 1, isLiveCheck: i < 200, pupilId: i + 1, checkCode: `checkCode${i + 1}` })
}
describe('updatePupilStatusForLiveChecksV2', () => {
it('calls addMessageToQueue repeadetly based on the number of batches', async () => {
spyOn(azureStorageHelper, 'addMessageToQueue')
try {
await pupilStatusService.updatePupilStatusForLiveChecksV2(logger, logPrefix, checkData)
} catch (err) {
expect(err).not.toHaveBeenCalled()
}
expect(azureStorageHelper.addMessageToQueue).toHaveBeenCalledTimes(2)
})
it('calls addMessageToQueue for pupil-status queue with version 2 and 100 checks', async () => {
let processedCheckData = []
for (let i = 0; i < 300; i++) {
processedCheckData.push({ pupilId: i + 1, checkCode: `checkCode${i + 1}` })
}

const addMessageToQueueSpy = spyOn(azureStorageHelper, 'addMessageToQueue')
try {
await pupilStatusService.updatePupilStatusForLiveChecksV2(logger, logPrefix, checkData)
} catch (err) {
expect(err).not.toHaveBeenCalled()
}
expect(addMessageToQueueSpy.calls.mostRecent().args[0]).toBe('pupil-status')
expect(addMessageToQueueSpy.calls.mostRecent().args[1].version).toBe(2)
expect(addMessageToQueueSpy.calls.first().args[1].messages).toEqual(processedCheckData.filter(i => i.pupilId >= 1 && i.pupilId <= 100))
expect(addMessageToQueueSpy.calls.mostRecent().args[1].messages).toEqual(processedCheckData.filter(i => i.pupilId >= 101 && i.pupilId < 201))
})
it('calls logger error if addMessageToQueue method throws', async () => {
spyOn(azureStorageHelper, 'addMessageToQueue').and.returnValue(Promise.reject(new Error('error')))
spyOn(logger, 'error')
try {
await pupilStatusService.updatePupilStatusForLiveChecksV2(logger, logPrefix, checkData)
} catch (err) {
expect(err).toHaveBeenCalled()
}
expect(logger.error).toHaveBeenCalled()
})
it('should call logger error and return if check data parameter is undefined', async () => {
spyOn(logger, 'error')
spyOn(azureStorageHelper, 'addMessageToQueue')
try {
await pupilStatusService.updatePupilStatusForLiveChecksV2(logger, logPrefix, undefined)
} catch (err) {
expect(err).not.toHaveBeenCalled()
}
expect(azureStorageHelper.addMessageToQueue).not.toHaveBeenCalled()
expect(logger.error).toHaveBeenCalledWith('logPrefix: updatePupilStatusV2(): ERROR: check data provided must be an array')
})
})
})

0 comments on commit d8191cf

Please sign in to comment.