summaryrefslogtreecommitdiff
path: root/spec/frontend/error_tracking/components/error_details_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/error_tracking/components/error_details_spec.js')
-rw-r--r--spec/frontend/error_tracking/components/error_details_spec.js72
1 files changed, 64 insertions, 8 deletions
diff --git a/spec/frontend/error_tracking/components/error_details_spec.js b/spec/frontend/error_tracking/components/error_details_spec.js
index adbbc04ce78..fd2164d05fc 100644
--- a/spec/frontend/error_tracking/components/error_details_spec.js
+++ b/spec/frontend/error_tracking/components/error_details_spec.js
@@ -18,6 +18,12 @@ import {
severityLevelVariant,
errorStatus,
} from '~/error_tracking/components/constants';
+import Tracking from '~/tracking';
+import {
+ trackClickErrorLinkToSentryOptions,
+ trackErrorDetailsViewsOptions,
+ trackErrorStatusUpdateOptions,
+} from '~/error_tracking/utils';
jest.mock('~/flash');
@@ -30,12 +36,19 @@ describe('ErrorDetails', () => {
let actions;
let getters;
let mocks;
+ const externalUrl = 'https://sentry.io/organizations/test-sentry-nk/issues/1/?project=1';
const findInput = name => {
const inputs = wrapper.findAll(GlFormInput).filter(c => c.attributes('name') === name);
return inputs.length ? inputs.at(0) : inputs;
};
+ const findUpdateIgnoreStatusButton = () =>
+ wrapper.find('[data-testid="update-ignore-status-btn"]');
+ const findUpdateResolveStatusButton = () =>
+ wrapper.find('[data-testid="update-resolve-status-btn"]');
+ const findExternalUrl = () => wrapper.find('[data-testid="external-url-link"]');
+
function mountComponent() {
wrapper = shallowMount(ErrorDetails, {
stubs: { GlDeprecatedButton, GlSprintf },
@@ -57,7 +70,7 @@ describe('ErrorDetails', () => {
beforeEach(() => {
actions = {
startPollingStacktrace: () => {},
- updateIgnoreStatus: jest.fn(),
+ updateIgnoreStatus: jest.fn().mockResolvedValue({}),
updateResolveStatus: jest.fn().mockResolvedValue({ closed_issue_iid: 1 }),
};
@@ -170,6 +183,9 @@ describe('ErrorDetails', () => {
count: 12,
userCount: 2,
},
+ stacktraceData: {
+ date_received: '2020-05-20',
+ },
});
});
@@ -235,7 +251,7 @@ describe('ErrorDetails', () => {
},
});
return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.find(GlBadge).attributes('variant')).toEqual(
+ expect(wrapper.find(GlBadge).props('variant')).toEqual(
severityLevelVariant[severityLevel[level]],
);
});
@@ -249,7 +265,7 @@ describe('ErrorDetails', () => {
},
});
return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.find(GlBadge).attributes('variant')).toEqual(
+ expect(wrapper.find(GlBadge).props('variant')).toEqual(
severityLevelVariant[severityLevel.ERROR],
);
});
@@ -302,11 +318,6 @@ describe('ErrorDetails', () => {
});
describe('Status update', () => {
- const findUpdateIgnoreStatusButton = () =>
- wrapper.find('[data-qa-selector="update_ignore_status_button"]');
- const findUpdateResolveStatusButton = () =>
- wrapper.find('[data-qa-selector="update_resolve_status_button"]');
-
afterEach(() => {
actions.updateIgnoreStatus.mockClear();
actions.updateResolveStatus.mockClear();
@@ -491,4 +502,49 @@ describe('ErrorDetails', () => {
});
});
});
+
+ describe('Snowplow tracking', () => {
+ beforeEach(() => {
+ jest.spyOn(Tracking, 'event');
+ mocks.$apollo.queries.error.loading = false;
+ mountComponent();
+ wrapper.setData({
+ error: { externalUrl },
+ });
+ });
+
+ it('should track detail page views', () => {
+ const { category, action } = trackErrorDetailsViewsOptions;
+ expect(Tracking.event).toHaveBeenCalledWith(category, action);
+ });
+
+ it('should track IGNORE status update', () => {
+ Tracking.event.mockClear();
+ findUpdateIgnoreStatusButton().vm.$emit('click');
+ setImmediate(() => {
+ const { category, action } = trackErrorStatusUpdateOptions('ignored');
+ expect(Tracking.event).toHaveBeenCalledWith(category, action);
+ });
+ });
+
+ it('should track RESOLVE status update', () => {
+ Tracking.event.mockClear();
+ findUpdateResolveStatusButton().vm.$emit('click');
+ setImmediate(() => {
+ const { category, action } = trackErrorStatusUpdateOptions('resolved');
+ expect(Tracking.event).toHaveBeenCalledWith(category, action);
+ });
+ });
+
+ it('should track external Sentry link views', () => {
+ Tracking.event.mockClear();
+ findExternalUrl().trigger('click');
+ setImmediate(() => {
+ const { category, action, label, property } = trackClickErrorLinkToSentryOptions(
+ externalUrl,
+ );
+ expect(Tracking.event).toHaveBeenCalledWith(category, action, { label, property });
+ });
+ });
+ });
});