Skip to content
Snippets Groups Projects
Commit 8b614521 authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent f864f8a7
No related branches found
No related tags found
No related merge requests found
Showing
with 115 additions and 101 deletions
Loading
Loading
@@ -28,10 +28,10 @@ describe('AjaxFilter', () => {
let ajaxSpy;
 
beforeEach(() => {
spyOn(AjaxCache, 'retrieve').and.callFake(url => ajaxSpy(url));
spyOn(AjaxFilter, '_loadData');
jest.spyOn(AjaxCache, 'retrieve').mockImplementation(url => ajaxSpy(url));
jest.spyOn(AjaxFilter, '_loadData').mockImplementation(() => {});
 
dummyConfig.onLoadingFinished = jasmine.createSpy('spy');
dummyConfig.onLoadingFinished = jest.fn();
 
const dynamicList = document.createElement('div');
dynamicList.dataset.dynamic = true;
Loading
Loading
@@ -46,7 +46,7 @@ describe('AjaxFilter', () => {
 
AjaxFilter.trigger()
.then(() => {
expect(dummyConfig.onLoadingFinished.calls.count()).toBe(1);
expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(1);
})
.then(done)
.catch(done.fail);
Loading
Loading
@@ -63,7 +63,7 @@ describe('AjaxFilter', () => {
.then(done.fail)
.catch(error => {
expect(error).toBe(dummyError);
expect(dummyConfig.onLoadingFinished.calls.count()).toBe(0);
expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(0);
})
.then(done)
.catch(done.fail);
Loading
Loading
Loading
Loading
@@ -18,23 +18,23 @@ describe('Ajax', () => {
 
beforeEach(() => {
config.preprocessing = () => processedArray;
spyOn(config, 'preprocessing').and.callFake(() => processedArray);
jest.spyOn(config, 'preprocessing').mockImplementation(() => processedArray);
});
 
it('calls preprocessing', () => {
Ajax.preprocessing(config, []);
 
expect(config.preprocessing.calls.count()).toBe(1);
expect(config.preprocessing.mock.calls.length).toBe(1);
});
 
it('overrides AjaxCache', () => {
spyOn(AjaxCache, 'override').and.callFake((endpoint, results) => {
jest.spyOn(AjaxCache, 'override').mockImplementation((endpoint, results) => {
expect(results).toEqual(processedArray);
});
 
Ajax.preprocessing(config, []);
 
expect(AjaxCache.override.calls.count()).toBe(1);
expect(AjaxCache.override.mock.calls.length).toBe(1);
});
});
});
Loading
Loading
Loading
Loading
@@ -4,25 +4,25 @@ import bp from '~/breakpoints';
describe('feature highlight options', () => {
describe('domContentLoaded', () => {
it('should not call highlightFeatures when breakpoint is xs', () => {
spyOn(bp, 'getBreakpointSize').and.returnValue('xs');
jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('xs');
 
expect(domContentLoaded()).toBe(false);
});
 
it('should not call highlightFeatures when breakpoint is sm', () => {
spyOn(bp, 'getBreakpointSize').and.returnValue('sm');
jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('sm');
 
expect(domContentLoaded()).toBe(false);
});
 
it('should not call highlightFeatures when breakpoint is md', () => {
spyOn(bp, 'getBreakpointSize').and.returnValue('md');
jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('md');
 
expect(domContentLoaded()).toBe(false);
});
 
it('should call highlightFeatures when breakpoint is lg', () => {
spyOn(bp, 'getBreakpointSize').and.returnValue('lg');
jest.spyOn(bp, 'getBreakpointSize').mockReturnValue('lg');
 
expect(domContentLoaded()).toBe(true);
});
Loading
Loading
Loading
Loading
@@ -158,7 +158,7 @@ describe('RecentSearchesDropdownContent', () => {
let onRecentSearchesItemSelectedSpy;
 
beforeEach(() => {
onRecentSearchesItemSelectedSpy = jasmine.createSpy('spy');
onRecentSearchesItemSelectedSpy = jest.fn();
eventHub.$on('recentSearchesItemSelected', onRecentSearchesItemSelectedSpy);
 
vm = createComponent(propsDataWithItems);
Loading
Loading
@@ -180,7 +180,7 @@ describe('RecentSearchesDropdownContent', () => {
let onRequestClearRecentSearchesSpy;
 
beforeEach(() => {
onRequestClearRecentSearchesSpy = jasmine.createSpy('spy');
onRequestClearRecentSearchesSpy = jest.fn();
eventHub.$on('requestClearRecentSearches', onRequestClearRecentSearchesSpy);
 
vm = createComponent(propsDataWithItems);
Loading
Loading
Loading
Loading
@@ -8,10 +8,10 @@ describe('Dropdown User', () => {
let dropdownUser;
 
beforeEach(() => {
spyOn(DropdownUser.prototype, 'bindEvents').and.callFake(() => {});
spyOn(DropdownUser.prototype, 'getProjectId').and.callFake(() => {});
spyOn(DropdownUser.prototype, 'getGroupId').and.callFake(() => {});
spyOn(DropdownUtils, 'getSearchInput').and.callFake(() => {});
jest.spyOn(DropdownUser.prototype, 'bindEvents').mockImplementation(() => {});
jest.spyOn(DropdownUser.prototype, 'getProjectId').mockImplementation(() => {});
jest.spyOn(DropdownUser.prototype, 'getGroupId').mockImplementation(() => {});
jest.spyOn(DropdownUtils, 'getSearchInput').mockImplementation(() => {});
 
dropdownUser = new DropdownUser({
tokenKeys: IssuableFilteredTokenKeys,
Loading
Loading
@@ -19,7 +19,7 @@ describe('Dropdown User', () => {
});
 
it('should not return the double quote found in value', () => {
spyOn(FilteredSearchTokenizer, 'processTokens').and.returnValue({
jest.spyOn(FilteredSearchTokenizer, 'processTokens').mockReturnValue({
lastToken: '"johnny appleseed',
});
 
Loading
Loading
@@ -27,7 +27,7 @@ describe('Dropdown User', () => {
});
 
it('should not return the single quote found in value', () => {
spyOn(FilteredSearchTokenizer, 'processTokens').and.returnValue({
jest.spyOn(FilteredSearchTokenizer, 'processTokens').mockReturnValue({
lastToken: "'larry boy",
});
 
Loading
Loading
@@ -37,9 +37,9 @@ describe('Dropdown User', () => {
 
describe("config AjaxFilter's endpoint", () => {
beforeEach(() => {
spyOn(DropdownUser.prototype, 'bindEvents').and.callFake(() => {});
spyOn(DropdownUser.prototype, 'getProjectId').and.callFake(() => {});
spyOn(DropdownUser.prototype, 'getGroupId').and.callFake(() => {});
jest.spyOn(DropdownUser.prototype, 'bindEvents').mockImplementation(() => {});
jest.spyOn(DropdownUser.prototype, 'getProjectId').mockImplementation(() => {});
jest.spyOn(DropdownUser.prototype, 'getGroupId').mockImplementation(() => {});
});
 
it('should return endpoint', () => {
Loading
Loading
Loading
Loading
@@ -28,7 +28,7 @@ describe('FrequentItemsSearchInputComponent', () => {
describe('methods', () => {
describe('setFocus', () => {
it('should set focus to search input', () => {
spyOn(vm.$refs.search, 'focus');
jest.spyOn(vm.$refs.search, 'focus').mockImplementation(() => {});
 
vm.setFocus();
 
Loading
Loading
@@ -39,13 +39,13 @@ describe('FrequentItemsSearchInputComponent', () => {
 
describe('mounted', () => {
it('should listen `dropdownOpen` event', done => {
spyOn(eventHub, '$on');
jest.spyOn(eventHub, '$on').mockImplementation(() => {});
const vmX = createComponent().vm;
 
localVue.nextTick(() => {
expect(eventHub.$on).toHaveBeenCalledWith(
`${vmX.namespace}-dropdownOpen`,
jasmine.any(Function),
expect.any(Function),
);
done();
});
Loading
Loading
@@ -55,7 +55,7 @@ describe('FrequentItemsSearchInputComponent', () => {
describe('beforeDestroy', () => {
it('should unbind event listeners on eventHub', done => {
const vmX = createComponent().vm;
spyOn(eventHub, '$off');
jest.spyOn(eventHub, '$off').mockImplementation(() => {});
 
vmX.$mount();
vmX.$destroy();
Loading
Loading
@@ -63,7 +63,7 @@ describe('FrequentItemsSearchInputComponent', () => {
localVue.nextTick(() => {
expect(eventHub.$off).toHaveBeenCalledWith(
`${vmX.namespace}-dropdownOpen`,
jasmine.any(Function),
expect.any(Function),
);
done();
});
Loading
Loading
Loading
Loading
@@ -3,83 +3,89 @@
import $ from 'jquery';
import GlFieldErrors from '~/gl_field_errors';
 
describe('GL Style Field Errors', function() {
describe('GL Style Field Errors', () => {
let testContext;
beforeEach(() => {
testContext = {};
});
preloadFixtures('static/gl_field_errors.html');
 
beforeEach(function() {
beforeEach(() => {
loadFixtures('static/gl_field_errors.html');
const $form = $('form.gl-show-field-errors');
 
this.$form = $form;
this.fieldErrors = new GlFieldErrors($form);
testContext.$form = $form;
testContext.fieldErrors = new GlFieldErrors($form);
});
 
it('should select the correct input elements', function() {
expect(this.$form).toBeDefined();
expect(this.$form.length).toBe(1);
expect(this.fieldErrors).toBeDefined();
const { inputs } = this.fieldErrors.state;
it('should select the correct input elements', () => {
expect(testContext.$form).toBeDefined();
expect(testContext.$form.length).toBe(1);
expect(testContext.fieldErrors).toBeDefined();
const { inputs } = testContext.fieldErrors.state;
 
expect(inputs.length).toBe(4);
});
 
it('should ignore elements with custom error handling', function() {
it('should ignore elements with custom error handling', () => {
const customErrorFlag = 'gl-field-error-ignore';
const customErrorElem = $(`.${customErrorFlag}`);
 
expect(customErrorElem.length).toBe(1);
 
const customErrors = this.fieldErrors.state.inputs.filter(input => {
const customErrors = testContext.fieldErrors.state.inputs.filter(input => {
return input.inputElement.hasClass(customErrorFlag);
});
 
expect(customErrors.length).toBe(0);
});
 
it('should not show any errors before submit attempt', function() {
this.$form
it('should not show any errors before submit attempt', () => {
testContext.$form
.find('.email')
.val('not-a-valid-email')
.keyup();
this.$form
testContext.$form
.find('.text-required')
.val('')
.keyup();
this.$form
testContext.$form
.find('.alphanumberic')
.val('?---*')
.keyup();
 
const errorsShown = this.$form.find('.gl-field-error-outline');
const errorsShown = testContext.$form.find('.gl-field-error-outline');
 
expect(errorsShown.length).toBe(0);
});
 
it('should show errors when input valid is submitted', function() {
this.$form
it('should show errors when input valid is submitted', () => {
testContext.$form
.find('.email')
.val('not-a-valid-email')
.keyup();
this.$form
testContext.$form
.find('.text-required')
.val('')
.keyup();
this.$form
testContext.$form
.find('.alphanumberic')
.val('?---*')
.keyup();
 
this.$form.submit();
testContext.$form.submit();
 
const errorsShown = this.$form.find('.gl-field-error-outline');
const errorsShown = testContext.$form.find('.gl-field-error-outline');
 
expect(errorsShown.length).toBe(4);
});
 
it('should properly track validity state on input after invalid submission attempt', function() {
this.$form.submit();
it('should properly track validity state on input after invalid submission attempt', () => {
testContext.$form.submit();
 
const emailInputModel = this.fieldErrors.state.inputs[1];
const emailInputModel = testContext.fieldErrors.state.inputs[1];
const fieldState = emailInputModel.state;
const emailInputElement = emailInputModel.inputElement;
 
Loading
Loading
@@ -124,9 +130,9 @@ describe('GL Style Field Errors', function() {
expect(fieldState.valid).toBe(true);
});
 
it('should properly infer error messages', function() {
this.$form.submit();
const trackedInputs = this.fieldErrors.state.inputs;
it('should properly infer error messages', () => {
testContext.$form.submit();
const trackedInputs = testContext.fieldErrors.state.inputs;
const inputHasTitle = trackedInputs[1];
const hasTitleErrorElem = inputHasTitle.inputElement.siblings('.gl-field-error');
const inputNoTitle = trackedInputs[2];
Loading
Loading
Loading
Loading
@@ -38,7 +38,7 @@ describe('GpgBadges', () => {
 
it('does not make a request if there is no container element', done => {
setFixtures('');
spyOn(axios, 'get');
jest.spyOn(axios, 'get').mockImplementation(() => {});
 
GpgBadges.fetch()
.then(() => {
Loading
Loading
@@ -50,7 +50,7 @@ describe('GpgBadges', () => {
 
it('throws an error if the endpoint is missing', done => {
setFixtures('<div class="js-signature-container"></div>');
spyOn(axios, 'get');
jest.spyOn(axios, 'get').mockImplementation(() => {});
 
GpgBadges.fetch()
.then(() => done.fail('Expected error to be thrown'))
Loading
Loading
import $ from 'jquery';
import initTodoToggle from '~/header';
 
describe('Header', function() {
describe('Header', () => {
const todosPendingCount = '.todos-count';
const fixtureTemplate = 'issues/open-issue.html';
 
Loading
Loading
Loading
Loading
@@ -2,7 +2,13 @@
 
import './class_spec_helper';
 
describe('ClassSpecHelper', function() {
describe('ClassSpecHelper', () => {
let testContext;
beforeEach(() => {
testContext = {};
});
describe('itShouldBeAStaticMethod', () => {
beforeEach(() => {
class TestClass {
Loading
Loading
@@ -12,7 +18,7 @@ describe('ClassSpecHelper', function() {
static staticMethod() {}
}
 
this.TestClass = TestClass;
testContext.TestClass = TestClass;
});
 
ClassSpecHelper.itShouldBeAStaticMethod(ClassSpecHelper, 'itShouldBeAStaticMethod');
Loading
Loading
Loading
Loading
@@ -16,8 +16,8 @@ describe('IDE stage file button', () => {
path: f.path,
});
 
spyOn(vm, 'stageChange');
spyOn(vm, 'discardFileChanges');
jest.spyOn(vm, 'stageChange').mockImplementation(() => {});
jest.spyOn(vm, 'discardFileChanges').mockImplementation(() => {});
 
vm.$mount();
});
Loading
Loading
Loading
Loading
@@ -16,7 +16,7 @@ describe('IDE unstage file button', () => {
path: f.path,
});
 
spyOn(vm, 'unstageChange');
jest.spyOn(vm, 'unstageChange').mockImplementation(() => {});
 
vm.$mount();
});
Loading
Loading
Loading
Loading
@@ -40,7 +40,7 @@ describe('IDE job log scroll button', () => {
});
 
it('emits click event on click', () => {
spyOn(vm, '$emit');
jest.spyOn(vm, '$emit').mockImplementation(() => {});
 
vm.$el.querySelector('.btn-scroll').click();
 
Loading
Loading
Loading
Loading
@@ -24,7 +24,7 @@ describe('IDE store file actions', () => {
relative_url_root: RELATIVE_URL_ROOT,
};
 
spyOn(router, 'push');
jest.spyOn(router, 'push').mockImplementation(() => {});
});
 
afterEach(() => {
Loading
Loading
@@ -117,7 +117,7 @@ describe('IDE store file actions', () => {
let oldScrollToTab;
 
beforeEach(() => {
scrollToTabSpy = jasmine.createSpy('scrollToTab');
scrollToTabSpy = jest.fn();
oldScrollToTab = store._actions.scrollToTab; // eslint-disable-line
store._actions.scrollToTab = [scrollToTabSpy]; // eslint-disable-line
 
Loading
Loading
@@ -131,7 +131,7 @@ describe('IDE store file actions', () => {
});
 
it('calls scrollToTab', () => {
const dispatch = jasmine.createSpy();
const dispatch = jest.fn();
 
actions.setFileActive(
{ commit() {}, state: store.state, getters: store.getters, dispatch },
Loading
Loading
@@ -142,7 +142,7 @@ describe('IDE store file actions', () => {
});
 
it('commits SET_FILE_ACTIVE', () => {
const commit = jasmine.createSpy();
const commit = jest.fn();
 
actions.setFileActive(
{ commit, state: store.state, getters: store.getters, dispatch() {} },
Loading
Loading
@@ -161,7 +161,7 @@ describe('IDE store file actions', () => {
localFile.active = true;
store.state.openFiles.push(localFile);
 
const commit = jasmine.createSpy();
const commit = jest.fn();
 
actions.setFileActive(
{ commit, state: store.state, getters: store.getters, dispatch() {} },
Loading
Loading
@@ -179,7 +179,7 @@ describe('IDE store file actions', () => {
let localFile;
 
beforeEach(() => {
spyOn(service, 'getFileData').and.callThrough();
jest.spyOn(service, 'getFileData');
 
localFile = file(`newCreate-${Math.random()}`);
store.state.entries[localFile.path] = localFile;
Loading
Loading
@@ -329,7 +329,7 @@ describe('IDE store file actions', () => {
});
 
it('dispatches error action', done => {
const dispatch = jasmine.createSpy('dispatch');
const dispatch = jest.fn();
 
actions
.getFileData(
Loading
Loading
@@ -339,7 +339,7 @@ describe('IDE store file actions', () => {
.then(() => {
expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
text: 'An error occurred whilst loading the file.',
action: jasmine.any(Function),
action: expect.any(Function),
actionText: 'Please try again',
actionPayload: {
path: localFile.path,
Loading
Loading
@@ -358,7 +358,7 @@ describe('IDE store file actions', () => {
let tmpFile;
 
beforeEach(() => {
spyOn(service, 'getRawFileData').and.callThrough();
jest.spyOn(service, 'getRawFileData');
 
tmpFile = file('tmpFile');
store.state.entries[tmpFile.path] = tmpFile;
Loading
Loading
@@ -392,7 +392,7 @@ describe('IDE store file actions', () => {
});
 
it('calls also getBaseRawFileData service method', done => {
spyOn(service, 'getBaseRawFileData').and.returnValue(Promise.resolve('baseraw'));
jest.spyOn(service, 'getBaseRawFileData').mockReturnValue(Promise.resolve('baseraw'));
 
store.state.currentProjectId = 'gitlab-org/gitlab-ce';
store.state.currentMergeRequestId = '1';
Loading
Loading
@@ -443,7 +443,7 @@ describe('IDE store file actions', () => {
});
 
it('dispatches error action', done => {
const dispatch = jasmine.createSpy('dispatch');
const dispatch = jest.fn();
 
actions
.getRawFileData({ state: store.state, commit() {}, dispatch }, { path: tmpFile.path })
Loading
Loading
@@ -451,7 +451,7 @@ describe('IDE store file actions', () => {
.catch(() => {
expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
text: 'An error occurred whilst loading the file content.',
action: jasmine.any(Function),
action: expect.any(Function),
actionText: 'Please try again',
actionPayload: {
path: tmpFile.path,
Loading
Loading
@@ -575,8 +575,8 @@ describe('IDE store file actions', () => {
let tmpFile;
 
beforeEach(() => {
spyOn(eventHub, '$on');
spyOn(eventHub, '$emit');
jest.spyOn(eventHub, '$on').mockImplementation(() => {});
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
 
tmpFile = file();
tmpFile.content = 'testing';
Loading
Loading
@@ -756,7 +756,7 @@ describe('IDE store file actions', () => {
let f;
 
beforeEach(() => {
spyOn(eventHub, '$emit');
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
 
f = {
...file('pendingFile'),
Loading
Loading
@@ -789,7 +789,7 @@ describe('IDE store file actions', () => {
 
describe('triggerFilesChange', () => {
beforeEach(() => {
spyOn(eventHub, '$emit');
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
});
 
it('emits event that files have changed', done => {
Loading
Loading
Loading
Loading
@@ -14,8 +14,8 @@ describe('initImageDiff', () => {
<div class="diff-file"></div>
`;
 
spyOn(ReplacedImageDiff.prototype, 'init').and.callFake(() => {});
spyOn(ImageDiff.prototype, 'init').and.callFake(() => {});
jest.spyOn(ReplacedImageDiff.prototype, 'init').mockImplementation(() => {});
jest.spyOn(ImageDiff.prototype, 'init').mockImplementation(() => {});
});
 
afterEach(() => {
Loading
Loading
Loading
Loading
@@ -12,29 +12,31 @@ describe('initDiscussionTab', () => {
});
 
it('should pass canCreateNote as false to initImageDiff', done => {
spyOn(initImageDiffHelper, 'initImageDiff').and.callFake((diffFileEl, canCreateNote) => {
expect(canCreateNote).toEqual(false);
done();
});
jest
.spyOn(initImageDiffHelper, 'initImageDiff')
.mockImplementation((diffFileEl, canCreateNote) => {
expect(canCreateNote).toEqual(false);
done();
});
 
initDiscussionTab();
});
 
it('should pass renderCommentBadge as true to initImageDiff', done => {
spyOn(initImageDiffHelper, 'initImageDiff').and.callFake(
(diffFileEl, canCreateNote, renderCommentBadge) => {
jest
.spyOn(initImageDiffHelper, 'initImageDiff')
.mockImplementation((diffFileEl, canCreateNote, renderCommentBadge) => {
expect(renderCommentBadge).toEqual(true);
done();
},
);
});
 
initDiscussionTab();
});
 
it('should call initImageDiff for each diffFileEls', () => {
spyOn(initImageDiffHelper, 'initImageDiff').and.callFake(() => {});
jest.spyOn(initImageDiffHelper, 'initImageDiff').mockImplementation(() => {});
initDiscussionTab();
 
expect(initImageDiffHelper.initImageDiff.calls.count()).toEqual(2);
expect(initImageDiffHelper.initImageDiff.mock.calls.length).toEqual(2);
});
});
Loading
Loading
@@ -15,7 +15,7 @@ describe('Edit Actions components', () => {
});
store.formState.title = 'test';
 
spyOn(eventHub, '$emit');
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
 
vm = new Component({
propsData: {
Loading
Loading
@@ -101,14 +101,14 @@ describe('Edit Actions components', () => {
 
describe('deleteIssuable', () => {
it('sends delete.issuable event when clicking save button', () => {
spyOn(window, 'confirm').and.returnValue(true);
jest.spyOn(window, 'confirm').mockReturnValue(true);
vm.$el.querySelector('.btn-danger').click();
 
expect(eventHub.$emit).toHaveBeenCalledWith('delete.issuable', { destroy_confirm: true });
});
 
it('shows loading icon after clicking delete button', done => {
spyOn(window, 'confirm').and.returnValue(true);
jest.spyOn(window, 'confirm').mockReturnValue(true);
vm.$el.querySelector('.btn-danger').click();
 
Vue.nextTick(() => {
Loading
Loading
@@ -119,7 +119,7 @@ describe('Edit Actions components', () => {
});
 
it('does no actions when confirm is false', done => {
spyOn(window, 'confirm').and.returnValue(false);
jest.spyOn(window, 'confirm').mockReturnValue(false);
vm.$el.querySelector('.btn-danger').click();
 
Vue.nextTick(() => {
Loading
Loading
Loading
Loading
@@ -20,7 +20,7 @@ describe('Description field component', () => {
 
document.body.appendChild(el);
 
spyOn(eventHub, '$emit');
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
 
vm = new Component({
el,
Loading
Loading
Loading
Loading
@@ -17,7 +17,7 @@ describe('Title field component', () => {
});
store.formState.title = 'test';
 
spyOn(eventHub, '$emit');
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
 
vm = new Component({
propsData: {
Loading
Loading
Loading
Loading
@@ -10,7 +10,7 @@ describe('Issue show index', () => {
});
document.body.appendChild(d);
 
const alertSpy = spyOn(window, 'alert');
const alertSpy = jest.spyOn(window, 'alert');
initIssueableApp();
 
expect(alertSpy).not.toHaveBeenCalled();
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment