diff --git a/es/index.js b/es/index.js index 17ef8ec..a2b16f3 100644 --- a/es/index.js +++ b/es/index.js @@ -1,5 +1,5 @@ import { pkg } from '@lykmapipo/common'; -import { head, merge, map, upperFirst, omit, isNumber } from 'lodash'; +import { head, merge, map, pick, isEmpty, upperFirst, omit, isNumber } from 'lodash'; import { Router } from '@lykmapipo/express-common'; import { getString } from '@lykmapipo/env'; import { model } from '@lykmapipo/mongoose-common'; @@ -311,6 +311,170 @@ const getBaseAggregation = criteria => { }); }; +/** + * @function + * @name normalizeTime + * @description Normalize average times which are in milliseconds to a human + * readable object + * + * @param {number} time Time in milliseconds + * @returns {object} time object that have days,hours,minutes, seconds and e.t.c + * + * @version 0.1.0 + * @since 0.2.0 + */ +const normalizeTime = time => { + if (!isNumber(time)) { + return parseMs(0); + } + + const averageTime = time >= 0 ? time : -time; + + return parseMs(averageTime); +}; + +/** + * @function + * @name normalizeMetricTimes + * @description Normalize aggregation object with metric times to a standard + * format. Also parse those times to human readable format + * + * @param {object} data Aggregation result object for a single facet or a single + * object in a facet which returns an array + * @returns {object} Object which is has merged data from the aggregration results + * and parsed metrics times to human readable format + * + * @version 0.1.0 + * @since 0.5.0 + */ +const normalizeMetricTimes = data => { + const keys = [ + 'confirmTime', + 'assignTime', + 'attendTime', + 'completeTime', + 'verifyTime', + 'approveTime', + 'resolveTime', + 'lateTime', + 'callTime', + ]; + + const times = map(keys, key => ({ + [key]: { + minimum: normalizeTime(data[`minimum${upperFirst(key)}`]), + maximum: normalizeTime(data[`maximum${upperFirst(key)}`]), + average: normalizeTime(data[`average${upperFirst(key)}`]), + }, + })); + + const strippedObject = omit(data, [ + 'maximumAssignTime', + 'minimumAssignTime', + 'averageAssignTime', + 'maximumAttendTime', + 'minimumAttendTime', + 'averageAttendTime', + 'maximumCompleteTime', + 'minimumCompleteTime', + 'averageCompleteTime', + 'maximumVerifyTime', + 'minimumVerifyTime', + 'averageVerifyTime', + 'maximumApproveTime', + 'minimumApproveTime', + 'averageApproveTime', + 'maximumResolveTime', + 'minimumResolveTime', + 'averageResolveTime', + 'maximumLateTime', + 'minimumLateTime', + 'averageLateTime', + 'maximumConfirmTime', + 'minimumConfirmTime', + 'averageConfirmTime', + 'maximumCallTime', + 'minimumCallTime', + 'averageCallTime', + ]); + + return merge({}, strippedObject, ...times); +}; + +/** + * @function + * @name prepareReportResponse + * @description Prepare response for Reports by normalizing response shape and average times + * + * @param {object} results Aggregation results + * @returns {object} Normalized response object + * + * @version 0.2.0 + * @since 0.2.0 + */ +const prepareReportResponse = results => { + const defaultResults = { + data: {}, + }; + + const data = head(results); + + data.overall = head(data.overall); + + if (data.overall) { + data.overall = normalizeMetricTimes(data.overall); + } + + if (data.jurisdictions) { + data.jurisdictions = map(data.jurisdictions, normalizeMetricTimes); + } + + if (data.priorities) { + data.priorities = map(data.priorities, normalizeMetricTimes); + } + + if (data.services) { + data.services = map(data.services, normalizeMetricTimes); + } + + if (data.groups) { + data.groups = map(data.groups, normalizeMetricTimes); + } + + if (data.types) { + data.types = map(data.types, normalizeMetricTimes); + } + + // if (data.methods) { + // data.methods = map(data.methods, normalizeObjectTimes); + // } + + return { ...defaultResults, data }; +}; + +/** + * @function + * @name getFacet + * @description Get final facet based on selected facet keys + * + * @param {object} facet Default facet for a report + * @param {string[]} facetKeys keys to be in the final facet + * + * @returns {object} final facet to be executed + * + * @version 0.1.0 + * @since 0.7.0 + */ +const getFacet = (facet, facetKeys) => { + const newFacet = pick(facet, facetKeys); + + if (isEmpty(newFacet)) { + return facet; + } + + return newFacet; +}; + /* constants */ const METRIC_TIMES = { maximumAssignTime: { $max: '$assignTime' }, @@ -680,6 +844,7 @@ const OVERVIEW_FACET = { * @description Generate overview report based on provided criteria * * @param {object} criteria Criteria condition to be applied in $match + * @param {string[]} facetKeys Contain list of facets key to be used to generate report * @param {object} onResults Callback when aggregation operation finishes * @returns {object} executed aggregation * @@ -691,10 +856,12 @@ const OVERVIEW_FACET = { * ... * }); */ -const getOverviewReport = (criteria, onResults) => { +const getOverviewReport = (criteria, facetKeys, onResults) => { const baseAggregation = getBaseAggregation(criteria); - return baseAggregation.facet(OVERVIEW_FACET).exec(onResults); + const FACET = getFacet(OVERVIEW_FACET, facetKeys); + + return baseAggregation.facet(FACET).exec(onResults); }; /** @@ -839,147 +1006,6 @@ const getOperationalReport = (criteria, onResults) => { return baseAggregation.facet(OPERATIONAL_FACET).exec(onResults); }; -/** - * @function - * @name normalizeTime - * @description Normalize average times which are in milliseconds to a human - * readable object - * - * @param {number} time Time in milliseconds - * @returns {object} time object that have days,hours,minutes, seconds and e.t.c - * - * @version 0.1.0 - * @since 0.2.0 - */ -const normalizeTime = time => { - if (!isNumber(time)) { - return parseMs(0); - } - - const averageTime = time >= 0 ? time : -time; - - return parseMs(averageTime); -}; - -/** - * @function - * @name normalizeMetricTimes - * @description Normalize aggregation object with metric times to a standard - * format. Also parse those times to human readable format - * - * @param {object} data Aggregation result object for a single facet or a single - * object in a facet which returns an array - * @returns {object} Object which is has merged data from the aggregration results - * and parsed metrics times to human readable format - * - * @version 0.1.0 - * @since 0.5.0 - */ -const normalizeMetricTimes = data => { - const keys = [ - 'confirmTime', - 'assignTime', - 'attendTime', - 'completeTime', - 'verifyTime', - 'approveTime', - 'resolveTime', - 'lateTime', - 'callTime', - ]; - - const times = map(keys, key => ({ - [key]: { - minimum: normalizeTime(data[`minimum${upperFirst(key)}`]), - maximum: normalizeTime(data[`maximum${upperFirst(key)}`]), - average: normalizeTime(data[`average${upperFirst(key)}`]), - }, - })); - - const strippedObject = omit(data, [ - 'maximumAssignTime', - 'minimumAssignTime', - 'averageAssignTime', - 'maximumAttendTime', - 'minimumAttendTime', - 'averageAttendTime', - 'maximumCompleteTime', - 'minimumCompleteTime', - 'averageCompleteTime', - 'maximumVerifyTime', - 'minimumVerifyTime', - 'averageVerifyTime', - 'maximumApproveTime', - 'minimumApproveTime', - 'averageApproveTime', - 'maximumResolveTime', - 'minimumResolveTime', - 'averageResolveTime', - 'maximumLateTime', - 'minimumLateTime', - 'averageLateTime', - 'maximumConfirmTime', - 'minimumConfirmTime', - 'averageConfirmTime', - 'maximumCallTime', - 'minimumCallTime', - 'averageCallTime', - ]); - - return merge({}, strippedObject, ...times); -}; - -/** - * @function - * @name prepareReportResponse - * @description Prepare response for Reports by normalizing response shape and average times - * - * @param {object} results Aggregation results - * @returns {object} Normalized response object - * - * @version 0.2.0 - * @since 0.2.0 - */ -const prepareReportResponse = results => { - const defaultResults = { - data: {}, - }; - - const data = head(results); - - data.overall = head(data.overall); - - if (data.overall) { - data.overall = normalizeMetricTimes(data.overall); - } - - if (data.jurisdictions) { - data.jurisdictions = map(data.jurisdictions, normalizeMetricTimes); - } - - if (data.priorities) { - data.priorities = map(data.priorities, normalizeMetricTimes); - } - - if (data.services) { - data.services = map(data.services, normalizeMetricTimes); - } - - if (data.groups) { - data.groups = map(data.groups, normalizeMetricTimes); - } - - if (data.types) { - data.types = map(data.types, normalizeMetricTimes); - } - - // if (data.methods) { - // data.methods = map(data.methods, normalizeObjectTimes); - // } - - return { ...defaultResults, data }; -}; - /* eslint-disable jsdoc/check-tag-names */ /* local constants */ @@ -1014,7 +1040,11 @@ router.get(PATH_OVERVIEW, (request, response, next) => { const filter = options.filter || {}; - getOverviewReport(filter, (error, results) => { + const facets = options.facets || []; + + const facetKeys = [].concat(facets); + + getOverviewReport(filter, facetKeys, (error, results) => { if (error) { next(error); } else { diff --git a/lib/index.js b/lib/index.js index f786e26..aaece6b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -313,6 +313,170 @@ const getBaseAggregation = criteria => { }); }; +/** + * @function + * @name normalizeTime + * @description Normalize average times which are in milliseconds to a human + * readable object + * + * @param {number} time Time in milliseconds + * @returns {object} time object that have days,hours,minutes, seconds and e.t.c + * + * @version 0.1.0 + * @since 0.2.0 + */ +const normalizeTime = time => { + if (!lodash.isNumber(time)) { + return parseMs(0); + } + + const averageTime = time >= 0 ? time : -time; + + return parseMs(averageTime); +}; + +/** + * @function + * @name normalizeMetricTimes + * @description Normalize aggregation object with metric times to a standard + * format. Also parse those times to human readable format + * + * @param {object} data Aggregation result object for a single facet or a single + * object in a facet which returns an array + * @returns {object} Object which is has merged data from the aggregration results + * and parsed metrics times to human readable format + * + * @version 0.1.0 + * @since 0.5.0 + */ +const normalizeMetricTimes = data => { + const keys = [ + 'confirmTime', + 'assignTime', + 'attendTime', + 'completeTime', + 'verifyTime', + 'approveTime', + 'resolveTime', + 'lateTime', + 'callTime', + ]; + + const times = lodash.map(keys, key => ({ + [key]: { + minimum: normalizeTime(data[`minimum${lodash.upperFirst(key)}`]), + maximum: normalizeTime(data[`maximum${lodash.upperFirst(key)}`]), + average: normalizeTime(data[`average${lodash.upperFirst(key)}`]), + }, + })); + + const strippedObject = lodash.omit(data, [ + 'maximumAssignTime', + 'minimumAssignTime', + 'averageAssignTime', + 'maximumAttendTime', + 'minimumAttendTime', + 'averageAttendTime', + 'maximumCompleteTime', + 'minimumCompleteTime', + 'averageCompleteTime', + 'maximumVerifyTime', + 'minimumVerifyTime', + 'averageVerifyTime', + 'maximumApproveTime', + 'minimumApproveTime', + 'averageApproveTime', + 'maximumResolveTime', + 'minimumResolveTime', + 'averageResolveTime', + 'maximumLateTime', + 'minimumLateTime', + 'averageLateTime', + 'maximumConfirmTime', + 'minimumConfirmTime', + 'averageConfirmTime', + 'maximumCallTime', + 'minimumCallTime', + 'averageCallTime', + ]); + + return lodash.merge({}, strippedObject, ...times); +}; + +/** + * @function + * @name prepareReportResponse + * @description Prepare response for Reports by normalizing response shape and average times + * + * @param {object} results Aggregation results + * @returns {object} Normalized response object + * + * @version 0.2.0 + * @since 0.2.0 + */ +const prepareReportResponse = results => { + const defaultResults = { + data: {}, + }; + + const data = lodash.head(results); + + data.overall = lodash.head(data.overall); + + if (data.overall) { + data.overall = normalizeMetricTimes(data.overall); + } + + if (data.jurisdictions) { + data.jurisdictions = lodash.map(data.jurisdictions, normalizeMetricTimes); + } + + if (data.priorities) { + data.priorities = lodash.map(data.priorities, normalizeMetricTimes); + } + + if (data.services) { + data.services = lodash.map(data.services, normalizeMetricTimes); + } + + if (data.groups) { + data.groups = lodash.map(data.groups, normalizeMetricTimes); + } + + if (data.types) { + data.types = lodash.map(data.types, normalizeMetricTimes); + } + + // if (data.methods) { + // data.methods = map(data.methods, normalizeObjectTimes); + // } + + return { ...defaultResults, data }; +}; + +/** + * @function + * @name getFacet + * @description Get final facet based on selected facet keys + * + * @param {object} facet Default facet for a report + * @param {string[]} facetKeys keys to be in the final facet + * + * @returns {object} final facet to be executed + * + * @version 0.1.0 + * @since 0.7.0 + */ +const getFacet = (facet, facetKeys) => { + const newFacet = lodash.pick(facet, facetKeys); + + if (lodash.isEmpty(newFacet)) { + return facet; + } + + return newFacet; +}; + /* constants */ const METRIC_TIMES = { maximumAssignTime: { $max: '$assignTime' }, @@ -682,6 +846,7 @@ const OVERVIEW_FACET = { * @description Generate overview report based on provided criteria * * @param {object} criteria Criteria condition to be applied in $match + * @param {string[]} facetKeys Contain list of facets key to be used to generate report * @param {object} onResults Callback when aggregation operation finishes * @returns {object} executed aggregation * @@ -693,10 +858,12 @@ const OVERVIEW_FACET = { * ... * }); */ -const getOverviewReport = (criteria, onResults) => { +const getOverviewReport = (criteria, facetKeys, onResults) => { const baseAggregation = getBaseAggregation(criteria); - return baseAggregation.facet(OVERVIEW_FACET).exec(onResults); + const FACET = getFacet(OVERVIEW_FACET, facetKeys); + + return baseAggregation.facet(FACET).exec(onResults); }; /** @@ -841,147 +1008,6 @@ const getOperationalReport = (criteria, onResults) => { return baseAggregation.facet(OPERATIONAL_FACET).exec(onResults); }; -/** - * @function - * @name normalizeTime - * @description Normalize average times which are in milliseconds to a human - * readable object - * - * @param {number} time Time in milliseconds - * @returns {object} time object that have days,hours,minutes, seconds and e.t.c - * - * @version 0.1.0 - * @since 0.2.0 - */ -const normalizeTime = time => { - if (!lodash.isNumber(time)) { - return parseMs(0); - } - - const averageTime = time >= 0 ? time : -time; - - return parseMs(averageTime); -}; - -/** - * @function - * @name normalizeMetricTimes - * @description Normalize aggregation object with metric times to a standard - * format. Also parse those times to human readable format - * - * @param {object} data Aggregation result object for a single facet or a single - * object in a facet which returns an array - * @returns {object} Object which is has merged data from the aggregration results - * and parsed metrics times to human readable format - * - * @version 0.1.0 - * @since 0.5.0 - */ -const normalizeMetricTimes = data => { - const keys = [ - 'confirmTime', - 'assignTime', - 'attendTime', - 'completeTime', - 'verifyTime', - 'approveTime', - 'resolveTime', - 'lateTime', - 'callTime', - ]; - - const times = lodash.map(keys, key => ({ - [key]: { - minimum: normalizeTime(data[`minimum${lodash.upperFirst(key)}`]), - maximum: normalizeTime(data[`maximum${lodash.upperFirst(key)}`]), - average: normalizeTime(data[`average${lodash.upperFirst(key)}`]), - }, - })); - - const strippedObject = lodash.omit(data, [ - 'maximumAssignTime', - 'minimumAssignTime', - 'averageAssignTime', - 'maximumAttendTime', - 'minimumAttendTime', - 'averageAttendTime', - 'maximumCompleteTime', - 'minimumCompleteTime', - 'averageCompleteTime', - 'maximumVerifyTime', - 'minimumVerifyTime', - 'averageVerifyTime', - 'maximumApproveTime', - 'minimumApproveTime', - 'averageApproveTime', - 'maximumResolveTime', - 'minimumResolveTime', - 'averageResolveTime', - 'maximumLateTime', - 'minimumLateTime', - 'averageLateTime', - 'maximumConfirmTime', - 'minimumConfirmTime', - 'averageConfirmTime', - 'maximumCallTime', - 'minimumCallTime', - 'averageCallTime', - ]); - - return lodash.merge({}, strippedObject, ...times); -}; - -/** - * @function - * @name prepareReportResponse - * @description Prepare response for Reports by normalizing response shape and average times - * - * @param {object} results Aggregation results - * @returns {object} Normalized response object - * - * @version 0.2.0 - * @since 0.2.0 - */ -const prepareReportResponse = results => { - const defaultResults = { - data: {}, - }; - - const data = lodash.head(results); - - data.overall = lodash.head(data.overall); - - if (data.overall) { - data.overall = normalizeMetricTimes(data.overall); - } - - if (data.jurisdictions) { - data.jurisdictions = lodash.map(data.jurisdictions, normalizeMetricTimes); - } - - if (data.priorities) { - data.priorities = lodash.map(data.priorities, normalizeMetricTimes); - } - - if (data.services) { - data.services = lodash.map(data.services, normalizeMetricTimes); - } - - if (data.groups) { - data.groups = lodash.map(data.groups, normalizeMetricTimes); - } - - if (data.types) { - data.types = lodash.map(data.types, normalizeMetricTimes); - } - - // if (data.methods) { - // data.methods = map(data.methods, normalizeObjectTimes); - // } - - return { ...defaultResults, data }; -}; - /* eslint-disable jsdoc/check-tag-names */ /* local constants */ @@ -1016,7 +1042,11 @@ router.get(PATH_OVERVIEW, (request, response, next) => { const filter = options.filter || {}; - getOverviewReport(filter, (error, results) => { + const facets = options.facets || []; + + const facetKeys = [].concat(facets); + + getOverviewReport(filter, facetKeys, (error, results) => { if (error) { next(error); } else { diff --git a/src/http.router.js b/src/http.router.js index 1c2d3de..9d4948f 100644 --- a/src/http.router.js +++ b/src/http.router.js @@ -435,7 +435,11 @@ router.get(PATH_OVERVIEW, (request, response, next) => { const filter = options.filter || {}; - getOverviewReport(filter, (error, results) => { + const facets = options.facets || []; + + const facetKeys = [].concat(facets); + + getOverviewReport(filter, facetKeys, (error, results) => { if (error) { next(error); } else { diff --git a/src/reports/overview.js b/src/reports/overview.js index 8afeba9..9397ed3 100644 --- a/src/reports/overview.js +++ b/src/reports/overview.js @@ -21,6 +21,7 @@ /* dependencies */ import getBaseAggregation from '../base/servicerequest.base'; +import { getFacet } from '../util'; import { OVERALL_FACET, JURISDICTION_FACET, @@ -53,6 +54,7 @@ const OVERVIEW_FACET = { * @description Generate overview report based on provided criteria * * @param {object} criteria Criteria condition to be applied in $match + * @param {string[]} facetKeys Contain list of facets key to be used to generate report * @param {object} onResults Callback when aggregation operation finishes * @returns {object} executed aggregation * @@ -64,10 +66,12 @@ const OVERVIEW_FACET = { * ... * }); */ -const getOverviewReport = (criteria, onResults) => { +const getOverviewReport = (criteria, facetKeys, onResults) => { const baseAggregation = getBaseAggregation(criteria); - return baseAggregation.facet(OVERVIEW_FACET).exec(onResults); + const FACET = getFacet(OVERVIEW_FACET, facetKeys); + + return baseAggregation.facet(FACET).exec(onResults); }; export default getOverviewReport; diff --git a/src/util.js b/src/util.js index 1b5a0e6..47ee262 100644 --- a/src/util.js +++ b/src/util.js @@ -1,4 +1,13 @@ -import { head, map, merge, isNumber, omit, upperFirst } from 'lodash'; +import { + head, + map, + merge, + isNumber, + omit, + pick, + isEmpty, + upperFirst, +} from 'lodash'; import parseMs from 'parse-ms'; /** @@ -162,3 +171,26 @@ export const prepareReportResponse = results => { return { ...defaultResults, data }; }; + +/** + * @function + * @name getFacet + * @description Get final facet based on selected facet keys + * + * @param {object} facet Default facet for a report + * @param {string[]} facetKeys keys to be in the final facet + * + * @returns {object} final facet to be executed + * + * @version 0.1.0 + * @since 0.7.0 + */ +export const getFacet = (facet, facetKeys) => { + const newFacet = pick(facet, facetKeys); + + if (isEmpty(newFacet)) { + return facet; + } + + return newFacet; +}; diff --git a/test/unit/util.spec.js b/test/unit/util.spec.js index ba09cf5..3fde337 100644 --- a/test/unit/util.spec.js +++ b/test/unit/util.spec.js @@ -4,733 +4,472 @@ import { normalizeObjectTimes, normalizeMetricTimes, prepareReportResponse, + getFacet, } from '../../src/util'; describe('Utils', () => { - it('should return human readable parsed object', () => { - const timeInMilliseconds = 1000; - const expectedOutput = { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 1, - }; - - expect(normalizeTime(timeInMilliseconds)).to.be.eql(expectedOutput); - }); - - it('should handle negative time inputs', () => { - const timeInMilliseconds = -1000; - const expectedOutput = { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 1, - }; - - expect(normalizeTime(timeInMilliseconds)).to.be.eql(expectedOutput); - }); + describe('normalizeTime', () => { + it('should return human readable parsed object', () => { + const timeInMilliseconds = 1000; + const expectedOutput = { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 1, + }; - it('should handle null value input', () => { - const expectedOutput = { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }; + expect(normalizeTime(timeInMilliseconds)).to.be.eql(expectedOutput); + }); - expect(normalizeTime(null)).to.be.eql(expectedOutput); - }); - - it('should parse object times to human readable times', () => { - const input = { - count: 100, - averageResolveTime: 1000, - averageAttendTime: 2000, - }; - const expectedOutput = { - count: 100, - averageAttendTime: { + it('should handle negative time inputs', () => { + const timeInMilliseconds = -1000; + const expectedOutput = { days: 0, hours: 0, microseconds: 0, milliseconds: 0, minutes: 0, nanoseconds: 0, - seconds: 2, - }, - averageResolveTime: { + seconds: 1, + }; + + expect(normalizeTime(timeInMilliseconds)).to.be.eql(expectedOutput); + }); + + it('should handle null value input', () => { + const expectedOutput = { days: 0, hours: 0, microseconds: 0, milliseconds: 0, minutes: 0, nanoseconds: 0, - seconds: 1, - }, - }; + seconds: 0, + }; - expect(normalizeObjectTimes(input)).to.be.eql(expectedOutput); + expect(normalizeTime(null)).to.be.eql(expectedOutput); + }); }); - it('should normalize metrics times and restucture object results', () => { - const aggregationResult = { - count: 1, - pending: 20, - resolved: 2, - maximumAssignTime: null, - minimumAssignTime: null, - averageAssignTime: null, - maximumAttendTime: 7813, - minimumAttendTime: 7813, - averageAttendTime: 7813, - maximumCompleteTime: 0, - minimumCompleteTime: 0, - averageCompleteTime: 0, - maximumVerifyTime: 0, - minimumVerifyTime: 0, - averageVerifyTime: 0, - maximumApproveTime: 0, - minimumApproveTime: 0, - averageApproveTime: 0, - maximumResolveTime: 79624349, - minimumResolveTime: 18750, - averageResolveTime: 29821770.333333332, - maximumLateTime: 72424414, - minimumLateTime: 72424414, - averageLateTime: 72424414, - maximumConfirmTime: 7199946, - minimumConfirmTime: 7199946, - averageConfirmTime: 7199946, - maximumCallTime: 0, - minimumCallTime: 0, - averageCallTime: 0, - }; - - const expectedOutput = { - approveTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - }, - assignTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - }, - attendTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 813, - minutes: 0, - nanoseconds: 0, - seconds: 7, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 813, - minutes: 0, - nanoseconds: 0, - seconds: 7, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 813, - minutes: 0, - nanoseconds: 0, - seconds: 7, - }, - }, - completeTime: { - average: { + describe('normalizeObjectTimes', () => { + it('should parse object times to human readable times', () => { + const input = { + count: 100, + averageResolveTime: 1000, + averageAttendTime: 2000, + }; + const expectedOutput = { + count: 100, + averageAttendTime: { days: 0, hours: 0, microseconds: 0, milliseconds: 0, minutes: 0, nanoseconds: 0, - seconds: 0, + seconds: 2, }, - maximum: { + averageResolveTime: { days: 0, hours: 0, microseconds: 0, milliseconds: 0, minutes: 0, nanoseconds: 0, - seconds: 0, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - }, - confirmTime: { - average: { - days: 0, - hours: 1, - microseconds: 0, - milliseconds: 946, - minutes: 59, - nanoseconds: 0, - seconds: 59, - }, - maximum: { - days: 0, - hours: 1, - microseconds: 0, - milliseconds: 946, - minutes: 59, - nanoseconds: 0, - seconds: 59, - }, - minimum: { - days: 0, - hours: 1, - microseconds: 0, - milliseconds: 946, - minutes: 59, - nanoseconds: 0, - seconds: 59, - }, - }, - count: 1, - lateTime: { - average: { - days: 0, - hours: 20, - microseconds: 0, - milliseconds: 414, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, - maximum: { - days: 0, - hours: 20, - microseconds: 0, - milliseconds: 414, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, - minimum: { - days: 0, - hours: 20, - microseconds: 0, - milliseconds: 414, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, - }, - pending: 20, - resolveTime: { - average: { - days: 0, - hours: 8, - microseconds: 333, - milliseconds: 770, - minutes: 17, - nanoseconds: 333, seconds: 1, }, - maximum: { - days: 0, - hours: 22, - microseconds: 0, - milliseconds: 349, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 750, - minutes: 0, - nanoseconds: 0, - seconds: 18, - }, - }, - verifyTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, + }; + + expect(normalizeObjectTimes(input)).to.be.eql(expectedOutput); + }); + }); + + describe('normalizeMetricTimes', () => { + it('should normalize metrics times and restucture object results', () => { + const aggregationResult = { + count: 1, + pending: 20, + resolved: 2, + maximumAssignTime: null, + minimumAssignTime: null, + averageAssignTime: null, + maximumAttendTime: 7813, + minimumAttendTime: 7813, + averageAttendTime: 7813, + maximumCompleteTime: 0, + minimumCompleteTime: 0, + averageCompleteTime: 0, + maximumVerifyTime: 0, + minimumVerifyTime: 0, + averageVerifyTime: 0, + maximumApproveTime: 0, + minimumApproveTime: 0, + averageApproveTime: 0, + maximumResolveTime: 79624349, + minimumResolveTime: 18750, + averageResolveTime: 29821770.333333332, + maximumLateTime: 72424414, + minimumLateTime: 72424414, + averageLateTime: 72424414, + maximumConfirmTime: 7199946, + minimumConfirmTime: 7199946, + averageConfirmTime: 7199946, + maximumCallTime: 0, + minimumCallTime: 0, + averageCallTime: 0, + }; + + const expectedOutput = { + approveTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, + assignTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, }, - }, - callTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, + attendTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 813, + minutes: 0, + nanoseconds: 0, + seconds: 7, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 813, + minutes: 0, + nanoseconds: 0, + seconds: 7, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 813, + minutes: 0, + nanoseconds: 0, + seconds: 7, + }, }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, + completeTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, + confirmTime: { + average: { + days: 0, + hours: 1, + microseconds: 0, + milliseconds: 946, + minutes: 59, + nanoseconds: 0, + seconds: 59, + }, + maximum: { + days: 0, + hours: 1, + microseconds: 0, + milliseconds: 946, + minutes: 59, + nanoseconds: 0, + seconds: 59, + }, + minimum: { + days: 0, + hours: 1, + microseconds: 0, + milliseconds: 946, + minutes: 59, + nanoseconds: 0, + seconds: 59, + }, }, - }, - resolved: 2, - }; - - expect(normalizeMetricTimes(aggregationResult)).to.be.eql(expectedOutput); - }); - - it('should normalize aggregration results to response format', () => { - const aggregrationResults = [ - { - overall: [ - { - count: 1, - pending: 20, - resolved: 10, - maximumAssignTime: null, - minimumAssignTime: null, - averageAssignTime: null, - maximumAttendTime: 7813, - minimumAttendTime: 7813, - averageAttendTime: 7813, - maximumCompleteTime: 0, - minimumCompleteTime: 0, - averageCompleteTime: 0, - maximumVerifyTime: 0, - minimumVerifyTime: 0, - averageVerifyTime: 0, - maximumApproveTime: 0, - minimumApproveTime: 0, - averageApproveTime: 0, - maximumResolveTime: 79624349, - minimumResolveTime: 18750, - averageResolveTime: 29821770.333333332, - maximumLateTime: 72424414, - minimumLateTime: 72424414, - averageLateTime: 72424414, - maximumConfirmTime: 7199946, - minimumConfirmTime: 7199946, - averageConfirmTime: 7199946, - maximumCallTime: 0, - minimumCallTime: 0, - averageCallTime: 0, + count: 1, + lateTime: { + average: { + days: 0, + hours: 20, + microseconds: 0, + milliseconds: 414, + minutes: 7, + nanoseconds: 0, + seconds: 4, }, - ], - jurisdictions: [ - { - count: 1, - name: 'Area', - pending: 20, - resolved: 10, - maximumAssignTime: null, - minimumAssignTime: null, - averageAssignTime: null, - maximumAttendTime: 7813, - minimumAttendTime: 7813, - averageAttendTime: 7813, - maximumCompleteTime: 0, - minimumCompleteTime: 0, - averageCompleteTime: 0, - maximumVerifyTime: 0, - minimumVerifyTime: 0, - averageVerifyTime: 0, - maximumApproveTime: 0, - minimumApproveTime: 0, - averageApproveTime: 0, - maximumResolveTime: 79624349, - minimumResolveTime: 18750, - averageResolveTime: 29821770.333333332, - maximumLateTime: 72424414, - minimumLateTime: 72424414, - averageLateTime: 72424414, - maximumConfirmTime: 7199946, - minimumConfirmTime: 7199946, - averageConfirmTime: 7199946, + maximum: { + days: 0, + hours: 20, + microseconds: 0, + milliseconds: 414, + minutes: 7, + nanoseconds: 0, + seconds: 4, }, - ], - workspaces: [{ name: 'Call', count: 1 }], - }, - ]; - - const expectedOutput = { - data: { - overall: { - resolved: 10, - approveTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, + minimum: { + days: 0, + hours: 20, + microseconds: 0, + milliseconds: 414, + minutes: 7, + nanoseconds: 0, + seconds: 4, }, - assignTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, + }, + pending: 20, + resolveTime: { + average: { + days: 0, + hours: 8, + microseconds: 333, + milliseconds: 770, + minutes: 17, + nanoseconds: 333, + seconds: 1, }, - attendTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 813, - minutes: 0, - nanoseconds: 0, - seconds: 7, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 813, - minutes: 0, - nanoseconds: 0, - seconds: 7, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 813, - minutes: 0, - nanoseconds: 0, - seconds: 7, - }, + maximum: { + days: 0, + hours: 22, + microseconds: 0, + milliseconds: 349, + minutes: 7, + nanoseconds: 0, + seconds: 4, }, - completeTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 750, + minutes: 0, + nanoseconds: 0, + seconds: 18, }, - confirmTime: { - average: { - days: 0, - hours: 1, - microseconds: 0, - milliseconds: 946, - minutes: 59, - nanoseconds: 0, - seconds: 59, - }, - maximum: { - days: 0, - hours: 1, - microseconds: 0, - milliseconds: 946, - minutes: 59, - nanoseconds: 0, - seconds: 59, - }, - minimum: { - days: 0, - hours: 1, - microseconds: 0, - milliseconds: 946, - minutes: 59, - nanoseconds: 0, - seconds: 59, - }, + }, + verifyTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, }, - count: 1, - lateTime: { - average: { - days: 0, - hours: 20, - microseconds: 0, - milliseconds: 414, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, - maximum: { - days: 0, - hours: 20, - microseconds: 0, - milliseconds: 414, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, - minimum: { - days: 0, - hours: 20, - microseconds: 0, - milliseconds: 414, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, }, - pending: 20, - resolveTime: { - average: { - days: 0, - hours: 8, - microseconds: 333, - milliseconds: 770, - minutes: 17, - nanoseconds: 333, - seconds: 1, - }, - maximum: { - days: 0, - hours: 22, - microseconds: 0, - milliseconds: 349, - minutes: 7, - nanoseconds: 0, - seconds: 4, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 750, - minutes: 0, - nanoseconds: 0, - seconds: 18, - }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, }, - verifyTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, + }, + callTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, }, - callTime: { - average: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, - }, - maximum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + }, + resolved: 2, + }; + + expect(normalizeMetricTimes(aggregationResult)).to.be.eql(expectedOutput); + }); + }); + + describe('prepareReportResponse', () => { + it('should normalize aggregration results to response format', () => { + const aggregrationResults = [ + { + overall: [ + { + count: 1, + pending: 20, + resolved: 10, + maximumAssignTime: null, + minimumAssignTime: null, + averageAssignTime: null, + maximumAttendTime: 7813, + minimumAttendTime: 7813, + averageAttendTime: 7813, + maximumCompleteTime: 0, + minimumCompleteTime: 0, + averageCompleteTime: 0, + maximumVerifyTime: 0, + minimumVerifyTime: 0, + averageVerifyTime: 0, + maximumApproveTime: 0, + minimumApproveTime: 0, + averageApproveTime: 0, + maximumResolveTime: 79624349, + minimumResolveTime: 18750, + averageResolveTime: 29821770.333333332, + maximumLateTime: 72424414, + minimumLateTime: 72424414, + averageLateTime: 72424414, + maximumConfirmTime: 7199946, + minimumConfirmTime: 7199946, + averageConfirmTime: 7199946, + maximumCallTime: 0, + minimumCallTime: 0, + averageCallTime: 0, }, - minimum: { - days: 0, - hours: 0, - microseconds: 0, - milliseconds: 0, - minutes: 0, - nanoseconds: 0, - seconds: 0, + ], + jurisdictions: [ + { + count: 1, + name: 'Area', + pending: 20, + resolved: 10, + maximumAssignTime: null, + minimumAssignTime: null, + averageAssignTime: null, + maximumAttendTime: 7813, + minimumAttendTime: 7813, + averageAttendTime: 7813, + maximumCompleteTime: 0, + minimumCompleteTime: 0, + averageCompleteTime: 0, + maximumVerifyTime: 0, + minimumVerifyTime: 0, + averageVerifyTime: 0, + maximumApproveTime: 0, + minimumApproveTime: 0, + averageApproveTime: 0, + maximumResolveTime: 79624349, + minimumResolveTime: 18750, + averageResolveTime: 29821770.333333332, + maximumLateTime: 72424414, + minimumLateTime: 72424414, + averageLateTime: 72424414, + maximumConfirmTime: 7199946, + minimumConfirmTime: 7199946, + averageConfirmTime: 7199946, }, - }, + ], + workspaces: [{ name: 'Call', count: 1 }], }, - jurisdictions: [ - { - count: 1, - name: 'Area', + ]; + + const expectedOutput = { + data: { + overall: { resolved: 10, approveTime: { average: { @@ -877,6 +616,7 @@ describe('Utils', () => { seconds: 59, }, }, + count: 1, lateTime: { average: { days: 0, @@ -995,13 +735,302 @@ describe('Utils', () => { }, }, }, - ], - workspaces: [{ name: 'Call', count: 1 }], - }, + jurisdictions: [ + { + count: 1, + name: 'Area', + resolved: 10, + approveTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + }, + assignTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + }, + attendTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 813, + minutes: 0, + nanoseconds: 0, + seconds: 7, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 813, + minutes: 0, + nanoseconds: 0, + seconds: 7, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 813, + minutes: 0, + nanoseconds: 0, + seconds: 7, + }, + }, + completeTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + }, + confirmTime: { + average: { + days: 0, + hours: 1, + microseconds: 0, + milliseconds: 946, + minutes: 59, + nanoseconds: 0, + seconds: 59, + }, + maximum: { + days: 0, + hours: 1, + microseconds: 0, + milliseconds: 946, + minutes: 59, + nanoseconds: 0, + seconds: 59, + }, + minimum: { + days: 0, + hours: 1, + microseconds: 0, + milliseconds: 946, + minutes: 59, + nanoseconds: 0, + seconds: 59, + }, + }, + lateTime: { + average: { + days: 0, + hours: 20, + microseconds: 0, + milliseconds: 414, + minutes: 7, + nanoseconds: 0, + seconds: 4, + }, + maximum: { + days: 0, + hours: 20, + microseconds: 0, + milliseconds: 414, + minutes: 7, + nanoseconds: 0, + seconds: 4, + }, + minimum: { + days: 0, + hours: 20, + microseconds: 0, + milliseconds: 414, + minutes: 7, + nanoseconds: 0, + seconds: 4, + }, + }, + pending: 20, + resolveTime: { + average: { + days: 0, + hours: 8, + microseconds: 333, + milliseconds: 770, + minutes: 17, + nanoseconds: 333, + seconds: 1, + }, + maximum: { + days: 0, + hours: 22, + microseconds: 0, + milliseconds: 349, + minutes: 7, + nanoseconds: 0, + seconds: 4, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 750, + minutes: 0, + nanoseconds: 0, + seconds: 18, + }, + }, + verifyTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + }, + callTime: { + average: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + maximum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + minimum: { + days: 0, + hours: 0, + microseconds: 0, + milliseconds: 0, + minutes: 0, + nanoseconds: 0, + seconds: 0, + }, + }, + }, + ], + workspaces: [{ name: 'Call', count: 1 }], + }, + }; + + expect(prepareReportResponse(aggregrationResults)).to.be.eql( + expectedOutput + ); + }); + }); + + describe('getFacet', () => { + const defaultFacet = { + overall: [{ a: 1 }], + services: [{ b: 2 }], }; + it('should return new facet with only selected keys', () => { + expect(getFacet(defaultFacet, ['overall'])).to.be.eql({ + overall: [{ a: 1 }], + }); + }); + + it('should return default facet when provided key is not part of default facet', () => { + expect(getFacet(defaultFacet, ['statuses'])).to.eql(defaultFacet); + }); - expect(prepareReportResponse(aggregrationResults)).to.be.eql( - expectedOutput - ); + it('should return default facet when no key is provided', () => { + expect(getFacet(defaultFacet, [])).to.eql(defaultFacet); + }); }); });