diff options
Diffstat (limited to 'spec/frontend/onboarding_issues/index_spec.js')
-rw-r--r-- | spec/frontend/onboarding_issues/index_spec.js | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/spec/frontend/onboarding_issues/index_spec.js b/spec/frontend/onboarding_issues/index_spec.js new file mode 100644 index 00000000000..b844caa07aa --- /dev/null +++ b/spec/frontend/onboarding_issues/index_spec.js @@ -0,0 +1,137 @@ +import $ from 'jquery'; +import { showLearnGitLabIssuesPopover } from '~/onboarding_issues'; +import { getCookie, setCookie, removeCookie } from '~/lib/utils/common_utils'; +import setWindowLocation from 'helpers/set_window_location_helper'; +import Tracking from '~/tracking'; + +describe('Onboarding Issues Popovers', () => { + const COOKIE_NAME = 'onboarding_issues_settings'; + const getCookieValue = () => JSON.parse(getCookie(COOKIE_NAME)); + + beforeEach(() => { + jest.spyOn($.fn, 'popover'); + }); + + afterEach(() => { + $.fn.popover.mockRestore(); + document.getElementsByTagName('html')[0].innerHTML = ''; + removeCookie(COOKIE_NAME); + }); + + const setupShowLearnGitLabIssuesPopoverTest = ({ + currentPath = 'group/learn-gitlab', + isIssuesBoardsLinkShown = true, + isCookieSet = true, + cookieValue = true, + } = {}) => { + setWindowLocation(`http://example.com/${currentPath}`); + + if (isIssuesBoardsLinkShown) { + const elem = document.createElement('a'); + elem.setAttribute('data-qa-selector', 'issue_boards_link'); + document.body.appendChild(elem); + } + + if (isCookieSet) { + setCookie(COOKIE_NAME, { previous: true, 'issues#index': cookieValue }); + } + + showLearnGitLabIssuesPopover(); + }; + + describe('showLearnGitLabIssuesPopover', () => { + describe('when on another project', () => { + beforeEach(() => { + setupShowLearnGitLabIssuesPopoverTest({ + currentPath: 'group/another-project', + }); + }); + + it('does not show a popover', () => { + expect($.fn.popover).not.toHaveBeenCalled(); + }); + }); + + describe('when the issues boards link is not shown', () => { + beforeEach(() => { + setupShowLearnGitLabIssuesPopoverTest({ + isIssuesBoardsLinkShown: false, + }); + }); + + it('does not show a popover', () => { + expect($.fn.popover).not.toHaveBeenCalled(); + }); + }); + + describe('when the cookie is not set', () => { + beforeEach(() => { + setupShowLearnGitLabIssuesPopoverTest({ + isCookieSet: false, + }); + }); + + it('does not show a popover', () => { + expect($.fn.popover).not.toHaveBeenCalled(); + }); + }); + + describe('when the cookie value is false', () => { + beforeEach(() => { + setupShowLearnGitLabIssuesPopoverTest({ + cookieValue: false, + }); + }); + + it('does not show a popover', () => { + expect($.fn.popover).not.toHaveBeenCalled(); + }); + }); + + describe('with all the right conditions', () => { + beforeEach(() => { + setupShowLearnGitLabIssuesPopoverTest(); + }); + + it('shows a popover', () => { + expect($.fn.popover).toHaveBeenCalled(); + }); + + it('does not change the cookie value', () => { + expect(getCookieValue()['issues#index']).toBe(true); + }); + + it('disables the previous popover', () => { + expect(getCookieValue().previous).toBe(false); + }); + + describe('when clicking the issues boards link', () => { + beforeEach(() => { + document.querySelector('a[data-qa-selector="issue_boards_link"]').click(); + }); + + it('deletes the cookie', () => { + expect(getCookie(COOKIE_NAME)).toBe(undefined); + }); + }); + + describe('when dismissing the popover', () => { + beforeEach(() => { + jest.spyOn(Tracking, 'event'); + document.querySelector('.learn-gitlab.popover .close').click(); + }); + + it('deletes the cookie', () => { + expect(getCookie(COOKIE_NAME)).toBe(undefined); + }); + + it('sends a tracking event', () => { + expect(Tracking.event).toHaveBeenCalledWith( + 'Growth::Conversion::Experiment::OnboardingIssues', + 'dismiss_popover', + ); + }); + }); + }); + }); +}); |