From 2baec50ef2946a15ee3874df50a82844ae1a743c Mon Sep 17 00:00:00 2001 From: vikhy-aws <191836418+vikhy-aws@users.noreply.github.com> Date: Mon, 6 Jan 2025 14:28:13 -0800 Subject: [PATCH] fix: add unit tests. change timezone to UTC Signed-off-by: vikhy-aws <191836418+vikhy-aws@users.noreply.github.com> --- public/pages/CreateTrigger/utils/helper.js | 14 +- .../pages/CreateTrigger/utils/helper.test.js | 167 +++++++++++++++++- 2 files changed, 174 insertions(+), 7 deletions(-) diff --git a/public/pages/CreateTrigger/utils/helper.js b/public/pages/CreateTrigger/utils/helper.js index 7721cdf40..a02835354 100644 --- a/public/pages/CreateTrigger/utils/helper.js +++ b/public/pages/CreateTrigger/utils/helper.js @@ -73,11 +73,11 @@ export const getTriggerContext = (executeResponse, monitor, values, triggerIndex let trigger = formikToTrigger(values, _.get(monitor, 'ui_metadata', {})); if (_.isArray(trigger) && triggerIndex >= 0) trigger = trigger[triggerIndex]; + console.log("Values: ", JSON.stringify(values)); + return { - // Backend only supports, UTC timezone. - // Don't use user's local timezone. - periodStart: moment.utc(_.get(executeResponse, 'period_start', Date.now())).format(), - periodEnd: moment.utc(_.get(executeResponse, 'period_end', Date.now())).format(), + periodStart: moment.utc(_.get(executeResponse, 'period_start', Date.now())).tz(getTimeZone()).format(), + periodEnd: moment.utc(_.get(executeResponse, 'period_end', Date.now())).tz(getTimeZone()).format(), results: [_.get(executeResponse, 'input_results.results[0]')].filter((result) => !!result), trigger: trigger, alert: null, @@ -124,6 +124,8 @@ export const conditionToExpressions = (condition = '', monitors) => { }; export function getTimeZone() { - const detectedTimeZone = getUISettings().get('dateFormat:tz', 'Browser'); - return detectedTimeZone === 'Browser' ? (moment.tz.guess() || moment.format('Z')) : detectedTimeZone; + // TODO: Include support to configure timezones rather than using the default UTC as requested here - https://github.com/opensearch-project/alerting/issues/1744 + // const detectedTimeZone = getUISettings().get('dateFormat:tz', 'Browser'); + // return detectedTimeZone === 'Browser' ? (moment.tz.guess() || moment.format('Z')) : detectedTimeZone; + return "UTC"; } diff --git a/public/pages/CreateTrigger/utils/helper.test.js b/public/pages/CreateTrigger/utils/helper.test.js index 24f9c0687..60fc032f8 100644 --- a/public/pages/CreateTrigger/utils/helper.test.js +++ b/public/pages/CreateTrigger/utils/helper.test.js @@ -4,7 +4,7 @@ */ import _ from 'lodash'; -import { getDefaultScript } from './helper'; +import { getDefaultScript, getTriggerContext, getTimeZone } from './helper'; import { MONITOR_TYPE } from '../../../utils/constants'; import { FORMIK_INITIAL_DOC_LEVEL_SCRIPT, @@ -14,6 +14,8 @@ import { API_TYPES, DEFAULT_CLUSTER_METRICS_SCRIPT, } from '../../CreateMonitor/components/ClusterMetricsMonitor/utils/clusterMetricsMonitorConstants'; +import moment from 'moment-timezone'; +import { formikToTrigger } from '../containers/CreateTrigger/utils/formikToTrigger'; describe('CreateTrigger/utils/helper', () => { describe('getDefaultScript', () => { @@ -81,4 +83,167 @@ describe('CreateTrigger/utils/helper', () => { }); }); }); + + describe('getTriggerContext', () => { + test("Should return a proper trigger context", () => { + const mockMonitor = { + "name": "Test", + "type": "monitor", + "monitor_type": "query_level_monitor", + "enabled": true, + "schedule": { + "period": { + "interval": 1, + "unit": "MINUTES" + } + }, + "inputs": [ + { + "search": { + "indices": [ + "opensearch_dashboards_sample_data_ecommerce" + ], + "query": { + "size": 0, + "aggregations": {}, + "query": { + "bool": { + "filter": [ + { + "range": { + "order_date": { + "gte": "{{period_end}}||-1h", + "lte": "{{period_end}}", + "format": "epoch_millis" + } + } + } + ] + } + } + } + } + } + ], + "triggers": [], + "ui_metadata": { + "schedule": { + "timezone": null, + "frequency": "interval", + "period": { + "interval": 1, + "unit": "MINUTES" + }, + "daily": 0, + "weekly": { + "mon": false, + "tue": false, + "wed": false, + "thur": false, + "fri": false, + "sat": false, + "sun": false + }, + "monthly": { + "type": "day", + "day": 1 + }, + "cronExpression": "0 */1 * * *" + }, + "monitor_type": "query_level_monitor", + "search": { + "searchType": "graph", + "timeField": "order_date", + "aggregations": [], + "groupBy": [], + "bucketValue": 1, + "bucketUnitOfTime": "h", + "filters": [] + } + } + }; + const mockInputResults = { + results: [ + { + "_shards": { + "total": 1, + "failed": 0, + "successful": 1, + "skipped": 0 + }, + "hits": { + "hits": [], + "total": { + "value": 33, + "relation": "eq" + }, + "max_score": null + }, + "took": 3, + "timed_out": false, + "aggregations": { + "over": { + "buckets": [ + { + "key_as_string": "2025-01-06T08:00:00.000-08:00", + "doc_count": 8, + "key": 1736179200000 + }, + { + "key_as_string": "2025-01-06T09:00:00.000-08:00", + "doc_count": 4, + "key": 1736182800000 + }, + { + "key_as_string": "2025-01-06T10:00:00.000-08:00", + "doc_count": 8, + "key": 1736186400000 + }, + { + "key_as_string": "2025-01-06T11:00:00.000-08:00", + "doc_count": 7, + "key": 1736190000000 + }, + { + "key_as_string": "2025-01-06T12:00:00.000-08:00", + "doc_count": 5, + "key": 1736193600000 + }, + { + "key_as_string": "2025-01-06T13:00:00.000-08:00", + "doc_count": 1, + "key": 1736197200000 + } + ] + } + } + } + ] + }; + const mockExecuteResponse = { + period_start: "2025-01-06T21:11:41Z", + period_end: "2025-01-06T21:12:41Z", + input_results: mockInputResults, + }; + const mockValues = { + name: "Test", + severity: "1", + condition: { + script: "ctx.results[0].hits.total.value > 10000" + } + }; + const mockTrigger = formikToTrigger(mockValues, _.get(mockMonitor, 'ui_metadata', {})); + if (_.isArray(mockTrigger) && triggerIndex >= 0) mockTrigger = mockTrigger[triggerIndex]; + const result = getTriggerContext(mockExecuteResponse, mockMonitor, mockValues); + expect(result).toEqual({ + periodStart: moment.utc(_.get(mockExecuteResponse, 'period_start', Date.now())).tz(getTimeZone()).format(), + periodEnd: moment.utc(_.get(mockExecuteResponse, 'period_end', Date.now())).tz(getTimeZone()).format(), + results: [_.get(mockExecuteResponse, 'input_results.results[0]')].filter((result) => !!result), + trigger: mockTrigger, + alert: null, + error: null, + monitor: mockMonitor + }); + }); + }); });