From 25f0a70bf9c941b6bbe814ce6983847b741f01b6 Mon Sep 17 00:00:00 2001 From: CD Cabrera Date: Wed, 6 Jul 2022 10:11:39 -0400 Subject: [PATCH] fix(rhsmTransformers): ent-5213 allow first dates to draw line (#955) * rhsmTransformers, shift x axis index for first dates --- .../rhsmTransformers.test.js.snap | 120 ++++++++++++++++++ .../rhsm/__tests__/rhsmTransformers.test.js | 72 +++++++++++ src/services/rhsm/rhsmTransformers.js | 24 ++++ 3 files changed, 216 insertions(+) diff --git a/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap b/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap index 5a7d17bc7..d3323813b 100644 --- a/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap +++ b/src/services/rhsm/__tests__/__snapshots__/rhsmTransformers.test.js.snap @@ -15,6 +15,126 @@ Object { } `; +exports[`RHSM Transformers should attempt to parse a tally response: tally, daily like first of month granularity 1`] = ` +Object { + "data": Array [ + Object { + "date": "2019-07-20T00:00:00Z", + "hasData": true, + "isCurrentDate": false, + "isFutureDate": false, + "x": 0, + "y": 0.1, + }, + Object { + "date": "2019-07-20T00:00:00Z", + "hasData": true, + "isCurrentDate": true, + "isFutureDate": false, + "x": 1, + "y": 0.1, + }, + Object { + "date": "2019-07-21T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 2, + "y": null, + }, + Object { + "date": "2019-07-22T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 3, + "y": null, + }, + Object { + "date": "2019-07-23T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 4, + "y": null, + }, + Object { + "date": "2019-07-24T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 5, + "y": null, + }, + Object { + "date": "2019-07-25T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 6, + "y": null, + }, + Object { + "date": "2019-07-26T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 7, + "y": null, + }, + Object { + "date": "2019-07-27T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 8, + "y": null, + }, + Object { + "date": "2019-07-28T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 9, + "y": null, + }, + Object { + "date": "2019-07-29T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 10, + "y": null, + }, + Object { + "date": "2019-07-30T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 11, + "y": null, + }, + Object { + "date": "2019-07-31T00:00:00Z", + "hasData": false, + "isCurrentDate": false, + "isFutureDate": true, + "x": 12, + "y": null, + }, + ], + "meta": Object { + "cloudigradeHasMismatch": undefined, + "count": undefined, + "metricId": undefined, + "productId": undefined, + "totalMonthlyDate": undefined, + "totalMonthlyHasData": undefined, + "totalMonthlyValue": undefined, + }, +} +`; + exports[`RHSM Transformers should attempt to parse a tally response: tally, daily like granularity 1`] = ` Object { "data": Array [ diff --git a/src/services/rhsm/__tests__/rhsmTransformers.test.js b/src/services/rhsm/__tests__/rhsmTransformers.test.js index 4faea8401..fe691794e 100644 --- a/src/services/rhsm/__tests__/rhsmTransformers.test.js +++ b/src/services/rhsm/__tests__/rhsmTransformers.test.js @@ -97,6 +97,78 @@ describe('RHSM Transformers', () => { expect(rhsmTransformers.tally(dailyTallyResponse)).toMatchSnapshot('tally, daily like granularity'); + const dailyTallyFirstMonthResponse = { + [rhsmConstants.RHSM_API_RESPONSE_DATA]: [ + { + [TALLY_DATA_TYPES.DATE]: '2019-07-20T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.1, + [TALLY_DATA_TYPES.HAS_DATA]: true + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-21T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-22T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-23T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-24T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-25T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-26T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-27T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-28T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-29T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-30T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + }, + { + [TALLY_DATA_TYPES.DATE]: '2019-07-31T00:00:00Z', + [TALLY_DATA_TYPES.VALUE]: 0.0, + [TALLY_DATA_TYPES.HAS_DATA]: false + } + ], + [rhsmConstants.RHSM_API_RESPONSE_META]: {} + }; + + const transformedDailyTallyFirstMonthResponse = rhsmTransformers.tally(dailyTallyFirstMonthResponse); + + expect(dailyTallyFirstMonthResponse[rhsmConstants.RHSM_API_RESPONSE_DATA].length).toBe(12); + expect(transformedDailyTallyFirstMonthResponse.data.length).toBe(13); + expect(transformedDailyTallyFirstMonthResponse).toMatchSnapshot('tally, daily like first of month granularity'); + const monthlyTallyResponse = { [rhsmConstants.RHSM_API_RESPONSE_DATA]: [ { diff --git a/src/services/rhsm/rhsmTransformers.js b/src/services/rhsm/rhsmTransformers.js index f682a955d..4039b23f6 100644 --- a/src/services/rhsm/rhsmTransformers.js +++ b/src/services/rhsm/rhsmTransformers.js @@ -52,6 +52,11 @@ const rhsmInstances = response => { return updatedResponse; }; +/** + * ToDo: Evaluate granularity alterations, transform logic is targeted at daily granularity + * Specifically, the "isCurrentDate" condition is targeted at daily. Weekly, monthly, and + * quarterly have not been tested, and may need logic adjustments for "isCurrentLikeDate". + */ /** * Parse RHSM tally response for caching. * @@ -63,6 +68,7 @@ const rhsmTally = response => { const { [rhsmConstants.RHSM_API_RESPONSE_DATA]: data = [], [rhsmConstants.RHSM_API_RESPONSE_META]: meta = {} } = response || {}; const currentDate = moment.utc(dateHelpers.getCurrentDate()).format('MM-D-YYYY'); + let futureDateCount = 0; updatedResponse.data = data.map( ( @@ -73,6 +79,10 @@ const rhsmTally = response => { const isCurrentDate = updatedDate.format('MM-D-YYYY') === currentDate; const isFutureDate = updatedDate.diff(currentDate) > 0; + if (isFutureDate) { + futureDateCount += 1; + } + return { x: index, y: (hasData === false && isFutureDate) || (hasData === false && isCurrentDate) ? null : value, @@ -84,6 +94,20 @@ const rhsmTally = response => { } ); + /** + * Add an extra date to the first entry of the range to help Victory charts display. + */ + if (futureDateCount === updatedResponse.data.length - 1) { + updatedResponse.data = [ + { + ...updatedResponse.data[0], + x: 0, + isCurrentDate: false + }, + ...updatedResponse.data + ].map((props, index) => ({ ...props, x: index })); + } + updatedResponse.meta = { count: meta[TALLY_META_TYPES.COUNT], cloudigradeHasMismatch: meta[TALLY_META_TYPES.HAS_CLOUDIGRADE_MISMATCH],