From cc68fab58e4d0f62b45b5e93cf8cbff534e6bb87 Mon Sep 17 00:00:00 2001
From: Wilson Pinto <wilsonpinto360@gmail.com>
Date: Thu, 5 Sep 2024 19:03:10 +0200
Subject: [PATCH] Add complementary tests for diffs to assert track metrics
 calls

---
 spec/frontend/diffs/components/app_spec.js | 72 ++++++++++++++++++++++
 1 file changed, 72 insertions(+)

diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index 8ecbff0571b8a..cfe7b73ff1995 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -5,6 +5,7 @@ import Vue, { nextTick } from 'vue';
 import VueApollo from 'vue-apollo';
 // eslint-disable-next-line no-restricted-imports
 import Vuex from 'vuex';
+import api from '~/api';
 import getMRCodequalityAndSecurityReports from '~/diffs/components/graphql/get_mr_codequality_and_security_reports.query.graphql';
 import createMockApollo from 'helpers/mock_apollo_helper';
 import setWindowLocation from 'helpers/set_window_location_helper';
@@ -46,6 +47,8 @@ const UPDATED_COMMIT_URL = `${TEST_HOST}/COMMIT/NEW`;
 const ENDPOINT_BATCH_URL = `${TEST_HOST}/diff/endpointBatch`;
 const ENDPOINT_METADATA_URL = `${TEST_HOST}/diff/endpointMetadata`;
 
+jest.mock('~/api.js');
+
 Vue.use(Vuex);
 Vue.use(VueApollo);
 
@@ -1112,4 +1115,73 @@ describe('diffs/components/app', () => {
       expect(rootWrapper.emitted(BV_HIDE_TOOLTIP)).toStrictEqual(undefined);
     });
   });
+
+  describe('track "trackRedisHllUserEvent" and "trackRedisCounterEvent" metrics', () => {
+    let mockGetTime;
+
+    beforeEach(() => {
+      jest.clearAllMocks();
+      mockGetTime = jest.spyOn(Date.prototype, 'getTime');
+    });
+
+    afterEach(() => {
+      mockGetTime.mockRestore();
+    });
+
+    const simulateKeydown = async (key, time) => {
+      await nextTick();
+
+      mockGetTime.mockReturnValue(time);
+      Mousetrap.trigger(key);
+    };
+
+    it('should not track metrics if keydownTime is not set', async () => {
+      createComponent({ props: { shouldShow: true } });
+
+      await nextTick();
+      window.dispatchEvent(new Event('blur'));
+
+      expect(api.trackRedisHllUserEvent).not.toHaveBeenCalled();
+      expect(api.trackRedisCounterEvent).not.toHaveBeenCalled();
+    });
+
+    it('should track metrics if delta is between 0 and 1000ms', async () => {
+      createComponent({ props: { shouldShow: true } });
+
+      // delta 500 ms
+      await simulateKeydown('mod+f', 1000);
+      mockGetTime.mockReturnValue(1500);
+
+      window.dispatchEvent(new Event('blur'));
+
+      expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith('i_code_review_user_searches_diff');
+      expect(api.trackRedisCounterEvent).toHaveBeenCalledWith('diff_searches');
+    });
+
+    it('should not track metrics if delta is greater than or equal to 1000ms', async () => {
+      createComponent({ props: { shouldShow: true } });
+
+      // delta 1050 ms
+      await simulateKeydown('mod+f', 1000);
+      mockGetTime.mockReturnValue(2050);
+
+      window.dispatchEvent(new Event('blur'));
+
+      expect(api.trackRedisHllUserEvent).not.toHaveBeenCalled();
+      expect(api.trackRedisCounterEvent).not.toHaveBeenCalled();
+    });
+
+    it('should not track metrics if delta is negative', async () => {
+      createComponent({ props: { shouldShow: true } });
+
+      // delta -500 ms
+      await simulateKeydown('mod+f', 1500);
+      mockGetTime.mockReturnValue(1000);
+
+      window.dispatchEvent(new Event('blur'));
+
+      expect(api.trackRedisHllUserEvent).not.toHaveBeenCalled();
+      expect(api.trackRedisCounterEvent).not.toHaveBeenCalled();
+    });
+  });
 });
-- 
GitLab