diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-11 18:09:37 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-11 18:09:37 +0300 |
commit | 6217d19741a8ea4351813b13c6fb39cc6a746602 (patch) | |
tree | 148b37b12e23835691de2a6dad4a425e678bc33d /spec/javascripts | |
parent | e3190840bc2e05ed04a49869978a54b7b518edf1 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/javascripts')
-rw-r--r-- | spec/javascripts/ajax_loading_spinner_spec.js | 57 | ||||
-rw-r--r-- | spec/javascripts/avatar_helper_spec.js | 98 | ||||
-rw-r--r-- | spec/javascripts/bootstrap_linked_tabs_spec.js | 67 | ||||
-rw-r--r-- | spec/javascripts/close_reopen_report_toggle_spec.js | 272 | ||||
-rw-r--r-- | spec/javascripts/commit_merge_requests_spec.js | 69 | ||||
-rw-r--r-- | spec/javascripts/commits_spec.js | 98 | ||||
-rw-r--r-- | spec/javascripts/create_item_dropdown_spec.js | 195 | ||||
-rw-r--r-- | spec/javascripts/diff_comments_store_spec.js | 141 | ||||
-rw-r--r-- | spec/javascripts/emoji_spec.js | 485 | ||||
-rw-r--r-- | spec/javascripts/flash_spec.js | 236 | ||||
-rw-r--r-- | spec/javascripts/issuable_spec.js | 64 | ||||
-rw-r--r-- | spec/javascripts/landing_spec.js | 166 | ||||
-rw-r--r-- | spec/javascripts/oauth_remember_me_spec.js | 39 | ||||
-rw-r--r-- | spec/javascripts/pipelines_spec.js | 19 | ||||
-rw-r--r-- | spec/javascripts/settings_panels_spec.js | 45 |
15 files changed, 0 insertions, 2051 deletions
diff --git a/spec/javascripts/ajax_loading_spinner_spec.js b/spec/javascripts/ajax_loading_spinner_spec.js deleted file mode 100644 index 89195a4397f..00000000000 --- a/spec/javascripts/ajax_loading_spinner_spec.js +++ /dev/null @@ -1,57 +0,0 @@ -import $ from 'jquery'; -import AjaxLoadingSpinner from '~/ajax_loading_spinner'; - -describe('Ajax Loading Spinner', () => { - const fixtureTemplate = 'static/ajax_loading_spinner.html'; - preloadFixtures(fixtureTemplate); - - beforeEach(() => { - loadFixtures(fixtureTemplate); - AjaxLoadingSpinner.init(); - }); - - it('change current icon with spinner icon and disable link while waiting ajax response', done => { - spyOn($, 'ajax').and.callFake(req => { - const xhr = new XMLHttpRequest(); - const ajaxLoadingSpinner = document.querySelector('.js-ajax-loading-spinner'); - const icon = ajaxLoadingSpinner.querySelector('i'); - - req.beforeSend(xhr, { dataType: 'text/html' }); - - expect(icon).not.toHaveClass('fa-trash-o'); - expect(icon).toHaveClass('fa-spinner'); - expect(icon).toHaveClass('fa-spin'); - expect(icon.dataset.icon).toEqual('fa-trash-o'); - expect(ajaxLoadingSpinner.getAttribute('disabled')).toEqual(''); - - req.complete({}); - - done(); - const deferred = $.Deferred(); - return deferred.promise(); - }); - document.querySelector('.js-ajax-loading-spinner').click(); - }); - - it('use original icon again and enabled the link after complete the ajax request', done => { - spyOn($, 'ajax').and.callFake(req => { - const xhr = new XMLHttpRequest(); - const ajaxLoadingSpinner = document.querySelector('.js-ajax-loading-spinner'); - - req.beforeSend(xhr, { dataType: 'text/html' }); - req.complete({}); - - const icon = ajaxLoadingSpinner.querySelector('i'); - - expect(icon).toHaveClass('fa-trash-o'); - expect(icon).not.toHaveClass('fa-spinner'); - expect(icon).not.toHaveClass('fa-spin'); - expect(ajaxLoadingSpinner.getAttribute('disabled')).toEqual(null); - - done(); - const deferred = $.Deferred(); - return deferred.promise(); - }); - document.querySelector('.js-ajax-loading-spinner').click(); - }); -}); diff --git a/spec/javascripts/avatar_helper_spec.js b/spec/javascripts/avatar_helper_spec.js deleted file mode 100644 index c1ef08e0f1b..00000000000 --- a/spec/javascripts/avatar_helper_spec.js +++ /dev/null @@ -1,98 +0,0 @@ -import { TEST_HOST } from 'spec/test_constants'; -import { getFirstCharacterCapitalized } from '~/lib/utils/text_utility'; -import { - DEFAULT_SIZE_CLASS, - IDENTICON_BG_COUNT, - renderAvatar, - renderIdenticon, - getIdenticonBackgroundClass, - getIdenticonTitle, -} from '~/helpers/avatar_helper'; - -function matchAll(str) { - return new RegExp(`^${str}$`); -} - -describe('avatar_helper', () => { - describe('getIdenticonBackgroundClass', () => { - it('returns identicon bg class from id', () => { - expect(getIdenticonBackgroundClass(1)).toEqual('bg2'); - }); - - it(`wraps around if id is bigger than ${IDENTICON_BG_COUNT}`, () => { - expect(getIdenticonBackgroundClass(IDENTICON_BG_COUNT + 4)).toEqual('bg5'); - expect(getIdenticonBackgroundClass(IDENTICON_BG_COUNT * 5 + 6)).toEqual('bg7'); - }); - }); - - describe('getIdenticonTitle', () => { - it('returns identicon title from name', () => { - expect(getIdenticonTitle('Lorem')).toEqual('L'); - expect(getIdenticonTitle('dolar-sit-amit')).toEqual('D'); - expect(getIdenticonTitle('%-with-special-chars')).toEqual('%'); - }); - - it('returns space if name is falsey', () => { - expect(getIdenticonTitle('')).toEqual(' '); - expect(getIdenticonTitle(null)).toEqual(' '); - }); - }); - - describe('renderIdenticon', () => { - it('renders with the first letter as title and bg based on id', () => { - const entity = { - id: IDENTICON_BG_COUNT + 3, - name: 'Xavior', - }; - const options = { - sizeClass: 's32', - }; - - const result = renderIdenticon(entity, options); - - expect(result).toHaveClass(`identicon ${options.sizeClass} bg4`); - expect(result).toHaveText(matchAll(getFirstCharacterCapitalized(entity.name))); - }); - - it('renders with defaults, if no options are given', () => { - const entity = { - id: 1, - name: 'tanuki', - }; - - const result = renderIdenticon(entity); - - expect(result).toHaveClass(`identicon ${DEFAULT_SIZE_CLASS} bg2`); - expect(result).toHaveText(matchAll(getFirstCharacterCapitalized(entity.name))); - }); - }); - - describe('renderAvatar', () => { - it('renders an image with the avatarUrl', () => { - const avatarUrl = `${TEST_HOST}/not-real-assets/test.png`; - - const result = renderAvatar({ - avatar_url: avatarUrl, - }); - - expect(result).toBeMatchedBy('img'); - expect(result).toHaveAttr('src', avatarUrl); - expect(result).toHaveClass(DEFAULT_SIZE_CLASS); - }); - - it('renders an identicon if no avatarUrl', () => { - const entity = { - id: 1, - name: 'walrus', - }; - const options = { - sizeClass: 's16', - }; - - const result = renderAvatar(entity, options); - - expect(result).toHaveClass(`identicon ${options.sizeClass} bg2`); - expect(result).toHaveText(matchAll(getFirstCharacterCapitalized(entity.name))); - }); - }); -}); diff --git a/spec/javascripts/bootstrap_linked_tabs_spec.js b/spec/javascripts/bootstrap_linked_tabs_spec.js deleted file mode 100644 index 1d21637ceae..00000000000 --- a/spec/javascripts/bootstrap_linked_tabs_spec.js +++ /dev/null @@ -1,67 +0,0 @@ -import LinkedTabs from '~/lib/utils/bootstrap_linked_tabs'; - -describe('Linked Tabs', () => { - preloadFixtures('static/linked_tabs.html'); - - beforeEach(() => { - loadFixtures('static/linked_tabs.html'); - }); - - describe('when is initialized', () => { - beforeEach(() => { - spyOn(window.history, 'replaceState').and.callFake(function() {}); - }); - - it('should activate the tab correspondent to the given action', () => { - // eslint-disable-next-line no-new - new LinkedTabs({ - action: 'tab1', - defaultAction: 'tab1', - parentEl: '.linked-tabs', - }); - - expect(document.querySelector('#tab1').classList).toContain('active'); - }); - - it('should active the default tab action when the action is show', () => { - // eslint-disable-next-line no-new - new LinkedTabs({ - action: 'show', - defaultAction: 'tab1', - parentEl: '.linked-tabs', - }); - - expect(document.querySelector('#tab1').classList).toContain('active'); - }); - }); - - describe('on click', () => { - it('should change the url according to the clicked tab', () => { - const historySpy = spyOn(window.history, 'replaceState').and.callFake(() => {}); - - const linkedTabs = new LinkedTabs({ - action: 'show', - defaultAction: 'tab1', - parentEl: '.linked-tabs', - }); - - const secondTab = document.querySelector('.linked-tabs li:nth-child(2) a'); - const newState = - secondTab.getAttribute('href') + - linkedTabs.currentLocation.search + - linkedTabs.currentLocation.hash; - - secondTab.click(); - - if (historySpy) { - expect(historySpy).toHaveBeenCalledWith( - { - url: newState, - }, - document.title, - newState, - ); - } - }); - }); -}); diff --git a/spec/javascripts/close_reopen_report_toggle_spec.js b/spec/javascripts/close_reopen_report_toggle_spec.js deleted file mode 100644 index 04a7ae7f429..00000000000 --- a/spec/javascripts/close_reopen_report_toggle_spec.js +++ /dev/null @@ -1,272 +0,0 @@ -/* eslint-disable jasmine/no-unsafe-spy */ - -import CloseReopenReportToggle from '~/close_reopen_report_toggle'; -import DropLab from '~/droplab/drop_lab'; - -describe('CloseReopenReportToggle', () => { - describe('class constructor', () => { - const dropdownTrigger = {}; - const dropdownList = {}; - const button = {}; - let commentTypeToggle; - - beforeEach(function() { - commentTypeToggle = new CloseReopenReportToggle({ - dropdownTrigger, - dropdownList, - button, - }); - }); - - it('sets .dropdownTrigger', function() { - expect(commentTypeToggle.dropdownTrigger).toBe(dropdownTrigger); - }); - - it('sets .dropdownList', function() { - expect(commentTypeToggle.dropdownList).toBe(dropdownList); - }); - - it('sets .button', function() { - expect(commentTypeToggle.button).toBe(button); - }); - }); - - describe('initDroplab', () => { - let closeReopenReportToggle; - const dropdownList = jasmine.createSpyObj('dropdownList', ['querySelector']); - const dropdownTrigger = {}; - const button = {}; - const reopenItem = {}; - const closeItem = {}; - const config = {}; - - beforeEach(() => { - spyOn(DropLab.prototype, 'init'); - dropdownList.querySelector.and.returnValues(reopenItem, closeItem); - - closeReopenReportToggle = new CloseReopenReportToggle({ - dropdownTrigger, - dropdownList, - button, - }); - - spyOn(closeReopenReportToggle, 'setConfig').and.returnValue(config); - - closeReopenReportToggle.initDroplab(); - }); - - it('sets .reopenItem and .closeItem', () => { - expect(dropdownList.querySelector).toHaveBeenCalledWith('.reopen-item'); - expect(dropdownList.querySelector).toHaveBeenCalledWith('.close-item'); - expect(closeReopenReportToggle.reopenItem).toBe(reopenItem); - expect(closeReopenReportToggle.closeItem).toBe(closeItem); - }); - - it('sets .droplab', () => { - expect(closeReopenReportToggle.droplab).toEqual(jasmine.any(Object)); - }); - - it('calls .setConfig', () => { - expect(closeReopenReportToggle.setConfig).toHaveBeenCalled(); - }); - - it('calls droplab.init', () => { - expect(DropLab.prototype.init).toHaveBeenCalledWith( - dropdownTrigger, - dropdownList, - jasmine.any(Array), - config, - ); - }); - }); - - describe('updateButton', () => { - let closeReopenReportToggle; - const dropdownList = {}; - const dropdownTrigger = {}; - const button = jasmine.createSpyObj('button', ['blur']); - const isClosed = true; - - beforeEach(() => { - closeReopenReportToggle = new CloseReopenReportToggle({ - dropdownTrigger, - dropdownList, - button, - }); - - spyOn(closeReopenReportToggle, 'toggleButtonType'); - - closeReopenReportToggle.updateButton(isClosed); - }); - - it('calls .toggleButtonType', () => { - expect(closeReopenReportToggle.toggleButtonType).toHaveBeenCalledWith(isClosed); - }); - - it('calls .button.blur', () => { - expect(closeReopenReportToggle.button.blur).toHaveBeenCalled(); - }); - }); - - describe('toggleButtonType', () => { - let closeReopenReportToggle; - const dropdownList = {}; - const dropdownTrigger = {}; - const button = {}; - const isClosed = true; - const showItem = jasmine.createSpyObj('showItem', ['click']); - const hideItem = {}; - showItem.classList = jasmine.createSpyObj('classList', ['add', 'remove']); - hideItem.classList = jasmine.createSpyObj('classList', ['add', 'remove']); - - beforeEach(() => { - closeReopenReportToggle = new CloseReopenReportToggle({ - dropdownTrigger, - dropdownList, - button, - }); - - spyOn(closeReopenReportToggle, 'getButtonTypes').and.returnValue([showItem, hideItem]); - - closeReopenReportToggle.toggleButtonType(isClosed); - }); - - it('calls .getButtonTypes', () => { - expect(closeReopenReportToggle.getButtonTypes).toHaveBeenCalledWith(isClosed); - }); - - it('removes hide class and add selected class to showItem, opposite for hideItem', () => { - expect(showItem.classList.remove).toHaveBeenCalledWith('hidden'); - expect(showItem.classList.add).toHaveBeenCalledWith('droplab-item-selected'); - expect(hideItem.classList.add).toHaveBeenCalledWith('hidden'); - expect(hideItem.classList.remove).toHaveBeenCalledWith('droplab-item-selected'); - }); - - it('clicks the showItem', () => { - expect(showItem.click).toHaveBeenCalled(); - }); - }); - - describe('getButtonTypes', () => { - let closeReopenReportToggle; - const dropdownList = {}; - const dropdownTrigger = {}; - const button = {}; - const reopenItem = {}; - const closeItem = {}; - - beforeEach(() => { - closeReopenReportToggle = new CloseReopenReportToggle({ - dropdownTrigger, - dropdownList, - button, - }); - - closeReopenReportToggle.reopenItem = reopenItem; - closeReopenReportToggle.closeItem = closeItem; - }); - - it('returns reopenItem, closeItem if isClosed is true', () => { - const buttonTypes = closeReopenReportToggle.getButtonTypes(true); - - expect(buttonTypes).toEqual([reopenItem, closeItem]); - }); - - it('returns closeItem, reopenItem if isClosed is false', () => { - const buttonTypes = closeReopenReportToggle.getButtonTypes(false); - - expect(buttonTypes).toEqual([closeItem, reopenItem]); - }); - }); - - describe('setDisable', () => { - let closeReopenReportToggle; - const dropdownList = {}; - const dropdownTrigger = jasmine.createSpyObj('button', ['setAttribute', 'removeAttribute']); - const button = jasmine.createSpyObj('button', ['setAttribute', 'removeAttribute']); - - beforeEach(() => { - closeReopenReportToggle = new CloseReopenReportToggle({ - dropdownTrigger, - dropdownList, - button, - }); - }); - - it('disable .button and .dropdownTrigger if shouldDisable is true', () => { - closeReopenReportToggle.setDisable(true); - - expect(button.setAttribute).toHaveBeenCalledWith('disabled', 'true'); - expect(dropdownTrigger.setAttribute).toHaveBeenCalledWith('disabled', 'true'); - }); - - it('disable .button and .dropdownTrigger if shouldDisable is undefined', () => { - closeReopenReportToggle.setDisable(); - - expect(button.setAttribute).toHaveBeenCalledWith('disabled', 'true'); - expect(dropdownTrigger.setAttribute).toHaveBeenCalledWith('disabled', 'true'); - }); - - it('enable .button and .dropdownTrigger if shouldDisable is false', () => { - closeReopenReportToggle.setDisable(false); - - expect(button.removeAttribute).toHaveBeenCalledWith('disabled'); - expect(dropdownTrigger.removeAttribute).toHaveBeenCalledWith('disabled'); - }); - }); - - describe('setConfig', () => { - let closeReopenReportToggle; - const dropdownList = {}; - const dropdownTrigger = {}; - const button = {}; - let config; - - beforeEach(() => { - closeReopenReportToggle = new CloseReopenReportToggle({ - dropdownTrigger, - dropdownList, - button, - }); - - config = closeReopenReportToggle.setConfig(); - }); - - it('returns a config object', () => { - expect(config).toEqual({ - InputSetter: [ - { - input: button, - valueAttribute: 'data-text', - inputAttribute: 'data-value', - }, - { - input: button, - valueAttribute: 'data-text', - inputAttribute: 'title', - }, - { - input: button, - valueAttribute: 'data-button-class', - inputAttribute: 'class', - }, - { - input: dropdownTrigger, - valueAttribute: 'data-toggle-class', - inputAttribute: 'class', - }, - { - input: button, - valueAttribute: 'data-url', - inputAttribute: 'href', - }, - { - input: button, - valueAttribute: 'data-method', - inputAttribute: 'data-method', - }, - ], - }); - }); - }); -}); diff --git a/spec/javascripts/commit_merge_requests_spec.js b/spec/javascripts/commit_merge_requests_spec.js deleted file mode 100644 index 82968e028d1..00000000000 --- a/spec/javascripts/commit_merge_requests_spec.js +++ /dev/null @@ -1,69 +0,0 @@ -import * as CommitMergeRequests from '~/commit_merge_requests'; - -describe('CommitMergeRequests', () => { - describe('createContent', () => { - it('should return created content', () => { - const content1 = CommitMergeRequests.createContent([ - { iid: 1, path: '/path1', title: 'foo' }, - { iid: 2, path: '/path2', title: 'baz' }, - ])[0]; - - expect(content1.tagName).toEqual('SPAN'); - expect(content1.childElementCount).toEqual(4); - - const content2 = CommitMergeRequests.createContent([])[0]; - - expect(content2.tagName).toEqual('SPAN'); - expect(content2.childElementCount).toEqual(0); - expect(content2.innerText).toEqual('No related merge requests found'); - }); - }); - - describe('getHeaderText', () => { - it('should return header text', () => { - expect(CommitMergeRequests.getHeaderText(0, 1)).toEqual('1 merge request'); - expect(CommitMergeRequests.getHeaderText(0, 2)).toEqual('2 merge requests'); - expect(CommitMergeRequests.getHeaderText(1, 1)).toEqual(','); - expect(CommitMergeRequests.getHeaderText(1, 2)).toEqual(','); - }); - }); - - describe('createHeader', () => { - it('should return created header', () => { - const header = CommitMergeRequests.createHeader(0, 1)[0]; - - expect(header.tagName).toEqual('SPAN'); - expect(header.innerText).toEqual('1 merge request'); - }); - }); - - describe('createItem', () => { - it('should return created item', () => { - const item = CommitMergeRequests.createItem({ iid: 1, path: '/path', title: 'foo' })[0]; - - expect(item.tagName).toEqual('SPAN'); - expect(item.childElementCount).toEqual(2); - expect(item.children[0].tagName).toEqual('A'); - expect(item.children[1].tagName).toEqual('SPAN'); - }); - }); - - describe('createLink', () => { - it('should return created link', () => { - const link = CommitMergeRequests.createLink({ iid: 1, path: '/path', title: 'foo' })[0]; - - expect(link.tagName).toEqual('A'); - expect(link.href).toMatch(/\/path$/); - expect(link.innerText).toEqual('!1'); - }); - }); - - describe('createTitle', () => { - it('should return created title', () => { - const title = CommitMergeRequests.createTitle({ iid: 1, path: '/path', title: 'foo' })[0]; - - expect(title.tagName).toEqual('SPAN'); - expect(title.innerText).toEqual('foo'); - }); - }); -}); diff --git a/spec/javascripts/commits_spec.js b/spec/javascripts/commits_spec.js deleted file mode 100644 index 28b89157bd3..00000000000 --- a/spec/javascripts/commits_spec.js +++ /dev/null @@ -1,98 +0,0 @@ -import $ from 'jquery'; -import 'vendor/jquery.endless-scroll'; -import MockAdapter from 'axios-mock-adapter'; -import axios from '~/lib/utils/axios_utils'; -import CommitsList from '~/commits'; -import Pager from '~/pager'; - -describe('Commits List', () => { - let commitsList; - - beforeEach(() => { - setFixtures(` - <form class="commits-search-form" action="/h5bp/html5-boilerplate/commits/master"> - <input id="commits-search"> - </form> - <ol id="commits-list"></ol> - `); - spyOn(Pager, 'init').and.stub(); - commitsList = new CommitsList(25); - }); - - it('should be defined', () => { - expect(CommitsList).toBeDefined(); - }); - - describe('processCommits', () => { - it('should join commit headers', () => { - commitsList.$contentList = $(` - <div> - <li class="commit-header" data-day="2016-09-20"> - <span class="day">20 Sep, 2016</span> - <span class="commits-count">1 commit</span> - </li> - <li class="commit"></li> - </div> - `); - - const data = ` - <li class="commit-header" data-day="2016-09-20"> - <span class="day">20 Sep, 2016</span> - <span class="commits-count">1 commit</span> - </li> - <li class="commit"></li> - `; - - // The last commit header should be removed - // since the previous one has the same data-day value. - expect(commitsList.processCommits(data).find('li.commit-header').length).toBe(0); - }); - }); - - describe('on entering input', () => { - let ajaxSpy; - let mock; - - beforeEach(() => { - commitsList.searchField.val(''); - - spyOn(window.history, 'replaceState').and.stub(); - mock = new MockAdapter(axios); - - mock.onGet('/h5bp/html5-boilerplate/commits/master').reply(200, { - html: '<li>Result</li>', - }); - - ajaxSpy = spyOn(axios, 'get').and.callThrough(); - }); - - afterEach(() => { - mock.restore(); - }); - - it('should save the last search string', done => { - commitsList.searchField.val('GitLab'); - commitsList - .filterResults() - .then(() => { - expect(ajaxSpy).toHaveBeenCalled(); - expect(commitsList.lastSearch).toEqual('GitLab'); - - done(); - }) - .catch(done.fail); - }); - - it('should not make ajax call if the input does not change', done => { - commitsList - .filterResults() - .then(() => { - expect(ajaxSpy).not.toHaveBeenCalled(); - expect(commitsList.lastSearch).toEqual(''); - - done(); - }) - .catch(done.fail); - }); - }); -}); diff --git a/spec/javascripts/create_item_dropdown_spec.js b/spec/javascripts/create_item_dropdown_spec.js deleted file mode 100644 index a814952faab..00000000000 --- a/spec/javascripts/create_item_dropdown_spec.js +++ /dev/null @@ -1,195 +0,0 @@ -import $ from 'jquery'; -import CreateItemDropdown from '~/create_item_dropdown'; - -const DROPDOWN_ITEM_DATA = [ - { - title: 'one', - id: 'one', - text: 'one', - }, - { - title: 'two', - id: 'two', - text: 'two', - }, - { - title: 'three', - id: 'three', - text: 'three', - }, -]; - -describe('CreateItemDropdown', () => { - preloadFixtures('static/create_item_dropdown.html'); - - let $wrapperEl; - let createItemDropdown; - - function createItemAndClearInput(text) { - // Filter for the new item - $wrapperEl - .find('.dropdown-input-field') - .val(text) - .trigger('input'); - - // Create the new item - const $createButton = $wrapperEl.find('.js-dropdown-create-new-item'); - $createButton.click(); - - // Clear out the filter - $wrapperEl - .find('.dropdown-input-field') - .val('') - .trigger('input'); - } - - beforeEach(() => { - loadFixtures('static/create_item_dropdown.html'); - $wrapperEl = $('.js-create-item-dropdown-fixture-root'); - }); - - afterEach(() => { - $wrapperEl.remove(); - }); - - describe('items', () => { - beforeEach(() => { - createItemDropdown = new CreateItemDropdown({ - $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'), - defaultToggleLabel: 'All variables', - fieldName: 'variable[environment]', - getData: (term, callback) => { - callback(DROPDOWN_ITEM_DATA); - }, - }); - }); - - it('should have a dropdown item for each piece of data', () => { - // Get the data in the dropdown - $('.js-dropdown-menu-toggle').click(); - - const $itemEls = $wrapperEl.find('.js-dropdown-content a'); - - expect($itemEls.length).toEqual(DROPDOWN_ITEM_DATA.length); - }); - }); - - describe('created items', () => { - const NEW_ITEM_TEXT = 'foobarbaz'; - - beforeEach(() => { - createItemDropdown = new CreateItemDropdown({ - $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'), - defaultToggleLabel: 'All variables', - fieldName: 'variable[environment]', - getData: (term, callback) => { - callback(DROPDOWN_ITEM_DATA); - }, - }); - - // Open the dropdown - $('.js-dropdown-menu-toggle').click(); - - // Filter for the new item - $wrapperEl - .find('.dropdown-input-field') - .val(NEW_ITEM_TEXT) - .trigger('input'); - }); - - it('create new item button should include the filter text', () => { - expect($wrapperEl.find('.js-dropdown-create-new-item code').text()).toEqual(NEW_ITEM_TEXT); - }); - - it('should update the dropdown with the newly created item', () => { - // Create the new item - const $createButton = $wrapperEl.find('.js-dropdown-create-new-item'); - $createButton.click(); - - expect($wrapperEl.find('.dropdown-toggle-text').text()).toEqual(NEW_ITEM_TEXT); - expect($wrapperEl.find('input[name="variable[environment]"]').val()).toEqual(NEW_ITEM_TEXT); - }); - - it('should include newly created item in dropdown list', () => { - createItemAndClearInput(NEW_ITEM_TEXT); - - const $itemEls = $wrapperEl.find('.js-dropdown-content a'); - - expect($itemEls.length).toEqual(1 + DROPDOWN_ITEM_DATA.length); - expect($($itemEls.get(DROPDOWN_ITEM_DATA.length)).text()).toEqual(NEW_ITEM_TEXT); - }); - - it('should not duplicate an item when trying to create an existing item', () => { - createItemAndClearInput(DROPDOWN_ITEM_DATA[0].text); - - const $itemEls = $wrapperEl.find('.js-dropdown-content a'); - - expect($itemEls.length).toEqual(DROPDOWN_ITEM_DATA.length); - }); - }); - - describe('clearDropdown()', () => { - beforeEach(() => { - createItemDropdown = new CreateItemDropdown({ - $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'), - defaultToggleLabel: 'All variables', - fieldName: 'variable[environment]', - getData: (term, callback) => { - callback(DROPDOWN_ITEM_DATA); - }, - }); - }); - - it('should clear all data and filter input', () => { - const filterInput = $wrapperEl.find('.dropdown-input-field'); - - // Get the data in the dropdown - $('.js-dropdown-menu-toggle').click(); - - // Filter for an item - filterInput.val('one').trigger('input'); - - const $itemElsAfterFilter = $wrapperEl.find('.js-dropdown-content a'); - - expect($itemElsAfterFilter.length).toEqual(1); - - createItemDropdown.clearDropdown(); - - const $itemElsAfterClear = $wrapperEl.find('.js-dropdown-content a'); - - expect($itemElsAfterClear.length).toEqual(0); - expect(filterInput.val()).toEqual(''); - }); - }); - - describe('createNewItemFromValue option', () => { - beforeEach(() => { - createItemDropdown = new CreateItemDropdown({ - $dropdown: $wrapperEl.find('.js-dropdown-menu-toggle'), - defaultToggleLabel: 'All variables', - fieldName: 'variable[environment]', - getData: (term, callback) => { - callback(DROPDOWN_ITEM_DATA); - }, - createNewItemFromValue: newValue => ({ - title: `${newValue}-title`, - id: `${newValue}-id`, - text: `${newValue}-text`, - }), - }); - }); - - it('all items go through createNewItemFromValue', () => { - // Get the data in the dropdown - $('.js-dropdown-menu-toggle').click(); - - createItemAndClearInput('new-item'); - - const $itemEls = $wrapperEl.find('.js-dropdown-content a'); - - expect($itemEls.length).toEqual(1 + DROPDOWN_ITEM_DATA.length); - expect($($itemEls[3]).text()).toEqual('new-item-text'); - expect($wrapperEl.find('.dropdown-toggle-text').text()).toEqual('new-item-title'); - }); - }); -}); diff --git a/spec/javascripts/diff_comments_store_spec.js b/spec/javascripts/diff_comments_store_spec.js deleted file mode 100644 index a6d363ce88e..00000000000 --- a/spec/javascripts/diff_comments_store_spec.js +++ /dev/null @@ -1,141 +0,0 @@ -/* eslint-disable jasmine/no-global-setup, dot-notation, jasmine/no-expect-in-setup-teardown */ -/* global CommentsStore */ - -import '~/diff_notes/models/discussion'; -import '~/diff_notes/models/note'; -import '~/diff_notes/stores/comments'; - -function createDiscussion(noteId = 1, resolved = true) { - CommentsStore.create({ - discussionId: 'a', - noteId, - canResolve: true, - resolved, - resolvedBy: 'test', - authorName: 'test', - authorAvatar: 'test', - noteTruncated: 'test...', - }); -} - -beforeEach(() => { - CommentsStore.state = {}; -}); - -describe('New discussion', () => { - it('creates new discussion', () => { - expect(Object.keys(CommentsStore.state).length).toBe(0); - createDiscussion(); - - expect(Object.keys(CommentsStore.state).length).toBe(1); - }); - - it('creates new note in discussion', () => { - createDiscussion(); - createDiscussion(2); - - const discussion = CommentsStore.state['a']; - - expect(Object.keys(discussion.notes).length).toBe(2); - }); -}); - -describe('Get note', () => { - beforeEach(() => { - expect(Object.keys(CommentsStore.state).length).toBe(0); - createDiscussion(); - }); - - it('gets note by ID', () => { - const note = CommentsStore.get('a', 1); - - expect(note).toBeDefined(); - expect(note.id).toBe(1); - }); -}); - -describe('Delete discussion', () => { - beforeEach(() => { - expect(Object.keys(CommentsStore.state).length).toBe(0); - createDiscussion(); - }); - - it('deletes discussion by ID', () => { - CommentsStore.delete('a', 1); - - expect(Object.keys(CommentsStore.state).length).toBe(0); - }); - - it('deletes discussion when no more notes', () => { - createDiscussion(); - createDiscussion(2); - - expect(Object.keys(CommentsStore.state).length).toBe(1); - expect(Object.keys(CommentsStore.state['a'].notes).length).toBe(2); - - CommentsStore.delete('a', 1); - CommentsStore.delete('a', 2); - - expect(Object.keys(CommentsStore.state).length).toBe(0); - }); -}); - -describe('Update note', () => { - beforeEach(() => { - expect(Object.keys(CommentsStore.state).length).toBe(0); - createDiscussion(); - }); - - it('updates note to be unresolved', () => { - CommentsStore.update('a', 1, false, 'test'); - - const note = CommentsStore.get('a', 1); - - expect(note.resolved).toBe(false); - }); -}); - -describe('Discussion resolved', () => { - beforeEach(() => { - expect(Object.keys(CommentsStore.state).length).toBe(0); - createDiscussion(); - }); - - it('is resolved with single note', () => { - const discussion = CommentsStore.state['a']; - - expect(discussion.isResolved()).toBe(true); - }); - - it('is unresolved with 2 notes', () => { - const discussion = CommentsStore.state['a']; - createDiscussion(2, false); - - expect(discussion.isResolved()).toBe(false); - }); - - it('is resolved with 2 notes', () => { - const discussion = CommentsStore.state['a']; - createDiscussion(2); - - expect(discussion.isResolved()).toBe(true); - }); - - it('resolve all notes', () => { - const discussion = CommentsStore.state['a']; - createDiscussion(2, false); - - discussion.resolveAllNotes(); - - expect(discussion.isResolved()).toBe(true); - }); - - it('unresolve all notes', () => { - const discussion = CommentsStore.state['a']; - createDiscussion(2); - - discussion.unResolveAllNotes(); - - expect(discussion.isResolved()).toBe(false); - }); -}); diff --git a/spec/javascripts/emoji_spec.js b/spec/javascripts/emoji_spec.js deleted file mode 100644 index 25bc95e0dd6..00000000000 --- a/spec/javascripts/emoji_spec.js +++ /dev/null @@ -1,485 +0,0 @@ -import { glEmojiTag } from '~/emoji'; -import isEmojiUnicodeSupported, { - isFlagEmoji, - isRainbowFlagEmoji, - isKeycapEmoji, - isSkinToneComboEmoji, - isHorceRacingSkinToneComboEmoji, - isPersonZwjEmoji, -} from '~/emoji/support/is_emoji_unicode_supported'; - -const emptySupportMap = { - personZwj: false, - horseRacing: false, - flag: false, - skinToneModifier: false, - '9.0': false, - '8.0': false, - '7.0': false, - 6.1: false, - '6.0': false, - 5.2: false, - 5.1: false, - 4.1: false, - '4.0': false, - 3.2: false, - '3.0': false, - 1.1: false, -}; - -const emojiFixtureMap = { - bomb: { - name: 'bomb', - moji: 'π£', - unicodeVersion: '6.0', - }, - construction_worker_tone5: { - name: 'construction_worker_tone5', - moji: 'π·πΏ', - unicodeVersion: '8.0', - }, - five: { - name: 'five', - moji: '5οΈβ£', - unicodeVersion: '3.0', - }, - grey_question: { - name: 'grey_question', - moji: 'β', - unicodeVersion: '6.0', - }, -}; - -function markupToDomElement(markup) { - const div = document.createElement('div'); - div.innerHTML = markup; - return div.firstElementChild; -} - -function testGlEmojiImageFallback(element, name, src) { - expect(element.tagName.toLowerCase()).toBe('img'); - expect(element.getAttribute('src')).toBe(src); - expect(element.getAttribute('title')).toBe(`:${name}:`); - expect(element.getAttribute('alt')).toBe(`:${name}:`); -} - -const defaults = { - forceFallback: false, - sprite: false, -}; - -function testGlEmojiElement(element, name, unicodeVersion, unicodeMoji, options = {}) { - const opts = { ...defaults, ...options }; - expect(element.tagName.toLowerCase()).toBe('gl-emoji'); - expect(element.dataset.name).toBe(name); - expect(element.dataset.fallbackSrc.length).toBeGreaterThan(0); - expect(element.dataset.unicodeVersion).toBe(unicodeVersion); - - const fallbackSpriteClass = `emoji-${name}`; - if (opts.sprite) { - expect(element.dataset.fallbackSpriteClass).toBe(fallbackSpriteClass); - } - - if (opts.forceFallback && opts.sprite) { - expect(element.getAttribute('class')).toBe(`emoji-icon ${fallbackSpriteClass}`); - } - - if (opts.forceFallback && !opts.sprite) { - // Check for image fallback - testGlEmojiImageFallback(element.firstElementChild, name, element.dataset.fallbackSrc); - } else { - // Otherwise make sure things are still unicode text - expect(element.textContent.trim()).toBe(unicodeMoji); - } -} - -describe('gl_emoji', () => { - describe('glEmojiTag', () => { - it('bomb emoji', () => { - const emojiKey = 'bomb'; - const markup = glEmojiTag(emojiFixtureMap[emojiKey].name); - const glEmojiElement = markupToDomElement(markup); - testGlEmojiElement( - glEmojiElement, - emojiFixtureMap[emojiKey].name, - emojiFixtureMap[emojiKey].unicodeVersion, - emojiFixtureMap[emojiKey].moji, - ); - }); - - it('bomb emoji with image fallback', () => { - const emojiKey = 'bomb'; - const markup = glEmojiTag(emojiFixtureMap[emojiKey].name, { - forceFallback: true, - }); - const glEmojiElement = markupToDomElement(markup); - testGlEmojiElement( - glEmojiElement, - emojiFixtureMap[emojiKey].name, - emojiFixtureMap[emojiKey].unicodeVersion, - emojiFixtureMap[emojiKey].moji, - { - forceFallback: true, - }, - ); - }); - - it('bomb emoji with sprite fallback readiness', () => { - const emojiKey = 'bomb'; - const markup = glEmojiTag(emojiFixtureMap[emojiKey].name, { - sprite: true, - }); - const glEmojiElement = markupToDomElement(markup); - testGlEmojiElement( - glEmojiElement, - emojiFixtureMap[emojiKey].name, - emojiFixtureMap[emojiKey].unicodeVersion, - emojiFixtureMap[emojiKey].moji, - { - sprite: true, - }, - ); - }); - - it('bomb emoji with sprite fallback', () => { - const emojiKey = 'bomb'; - const markup = glEmojiTag(emojiFixtureMap[emojiKey].name, { - forceFallback: true, - sprite: true, - }); - const glEmojiElement = markupToDomElement(markup); - testGlEmojiElement( - glEmojiElement, - emojiFixtureMap[emojiKey].name, - emojiFixtureMap[emojiKey].unicodeVersion, - emojiFixtureMap[emojiKey].moji, - { - forceFallback: true, - sprite: true, - }, - ); - }); - - it('question mark when invalid emoji name given', () => { - const name = 'invalid_emoji'; - const emojiKey = 'grey_question'; - const markup = glEmojiTag(name); - const glEmojiElement = markupToDomElement(markup); - testGlEmojiElement( - glEmojiElement, - emojiFixtureMap[emojiKey].name, - emojiFixtureMap[emojiKey].unicodeVersion, - emojiFixtureMap[emojiKey].moji, - ); - }); - - it('question mark with image fallback when invalid emoji name given', () => { - const name = 'invalid_emoji'; - const emojiKey = 'grey_question'; - const markup = glEmojiTag(name, { - forceFallback: true, - }); - const glEmojiElement = markupToDomElement(markup); - testGlEmojiElement( - glEmojiElement, - emojiFixtureMap[emojiKey].name, - emojiFixtureMap[emojiKey].unicodeVersion, - emojiFixtureMap[emojiKey].moji, - { - forceFallback: true, - }, - ); - }); - }); - - describe('isFlagEmoji', () => { - it('should gracefully handle empty string', () => { - expect(isFlagEmoji('')).toBeFalsy(); - }); - - it('should detect flag_ac', () => { - expect(isFlagEmoji('π¦π¨')).toBeTruthy(); - }); - - it('should detect flag_us', () => { - expect(isFlagEmoji('πΊπΈ')).toBeTruthy(); - }); - - it('should detect flag_zw', () => { - expect(isFlagEmoji('πΏπΌ')).toBeTruthy(); - }); - - it('should not detect flags', () => { - expect(isFlagEmoji('π')).toBeFalsy(); - }); - - it('should not detect triangular_flag_on_post', () => { - expect(isFlagEmoji('π©')).toBeFalsy(); - }); - - it('should not detect single letter', () => { - expect(isFlagEmoji('π¦')).toBeFalsy(); - }); - - it('should not detect >2 letters', () => { - expect(isFlagEmoji('π¦π§π¨')).toBeFalsy(); - }); - }); - - describe('isRainbowFlagEmoji', () => { - it('should gracefully handle empty string', () => { - expect(isRainbowFlagEmoji('')).toBeFalsy(); - }); - - it('should detect rainbow_flag', () => { - expect(isRainbowFlagEmoji('π³π')).toBeTruthy(); - }); - - it("should not detect flag_white on its' own", () => { - expect(isRainbowFlagEmoji('π³')).toBeFalsy(); - }); - - it("should not detect rainbow on its' own", () => { - expect(isRainbowFlagEmoji('π')).toBeFalsy(); - }); - - it('should not detect flag_white with something else', () => { - expect(isRainbowFlagEmoji('π³π΅')).toBeFalsy(); - }); - }); - - describe('isKeycapEmoji', () => { - it('should gracefully handle empty string', () => { - expect(isKeycapEmoji('')).toBeFalsy(); - }); - - it('should detect one(keycap)', () => { - expect(isKeycapEmoji('1οΈβ£')).toBeTruthy(); - }); - - it('should detect nine(keycap)', () => { - expect(isKeycapEmoji('9οΈβ£')).toBeTruthy(); - }); - - it('should not detect ten(keycap)', () => { - expect(isKeycapEmoji('π')).toBeFalsy(); - }); - - it('should not detect hash(keycap)', () => { - expect(isKeycapEmoji('#β£')).toBeFalsy(); - }); - }); - - describe('isSkinToneComboEmoji', () => { - it('should gracefully handle empty string', () => { - expect(isSkinToneComboEmoji('')).toBeFalsy(); - }); - - it('should detect hand_splayed_tone5', () => { - expect(isSkinToneComboEmoji('ππΏ')).toBeTruthy(); - }); - - it('should not detect hand_splayed', () => { - expect(isSkinToneComboEmoji('π')).toBeFalsy(); - }); - - it('should detect lifter_tone1', () => { - expect(isSkinToneComboEmoji('ππ»')).toBeTruthy(); - }); - - it('should not detect lifter', () => { - expect(isSkinToneComboEmoji('π')).toBeFalsy(); - }); - - it('should detect rowboat_tone4', () => { - expect(isSkinToneComboEmoji('π£πΎ')).toBeTruthy(); - }); - - it('should not detect rowboat', () => { - expect(isSkinToneComboEmoji('π£')).toBeFalsy(); - }); - - it('should not detect individual tone emoji', () => { - expect(isSkinToneComboEmoji('π»')).toBeFalsy(); - }); - }); - - describe('isHorceRacingSkinToneComboEmoji', () => { - it('should gracefully handle empty string', () => { - expect(isHorceRacingSkinToneComboEmoji('')).toBeFalsy(); - }); - - it('should detect horse_racing_tone2', () => { - expect(isHorceRacingSkinToneComboEmoji('ππΌ')).toBeTruthy(); - }); - - it('should not detect horse_racing', () => { - expect(isHorceRacingSkinToneComboEmoji('π')).toBeFalsy(); - }); - }); - - describe('isPersonZwjEmoji', () => { - it('should gracefully handle empty string', () => { - expect(isPersonZwjEmoji('')).toBeFalsy(); - }); - - it('should detect couple_mm', () => { - expect(isPersonZwjEmoji('π¨ββ€οΈβπ¨')).toBeTruthy(); - }); - - it('should not detect couple_with_heart', () => { - expect(isPersonZwjEmoji('π')).toBeFalsy(); - }); - - it('should not detect couplekiss', () => { - expect(isPersonZwjEmoji('π')).toBeFalsy(); - }); - - it('should detect family_mmb', () => { - expect(isPersonZwjEmoji('π¨βπ¨βπ¦')).toBeTruthy(); - }); - - it('should detect family_mwgb', () => { - expect(isPersonZwjEmoji('π¨βπ©βπ§βπ¦')).toBeTruthy(); - }); - - it('should not detect family', () => { - expect(isPersonZwjEmoji('πͺ')).toBeFalsy(); - }); - - it('should detect kiss_ww', () => { - expect(isPersonZwjEmoji('π©ββ€οΈβπβπ©')).toBeTruthy(); - }); - - it('should not detect girl', () => { - expect(isPersonZwjEmoji('π§')).toBeFalsy(); - }); - - it('should not detect girl_tone5', () => { - expect(isPersonZwjEmoji('π§πΏ')).toBeFalsy(); - }); - - it('should not detect man', () => { - expect(isPersonZwjEmoji('π¨')).toBeFalsy(); - }); - - it('should not detect woman', () => { - expect(isPersonZwjEmoji('π©')).toBeFalsy(); - }); - }); - - describe('isEmojiUnicodeSupported', () => { - it('should gracefully handle empty string with unicode support', () => { - const isSupported = isEmojiUnicodeSupported({ '1.0': true }, '', '1.0'); - - expect(isSupported).toBeTruthy(); - }); - - it('should gracefully handle empty string without unicode support', () => { - const isSupported = isEmojiUnicodeSupported({}, '', '1.0'); - - expect(isSupported).toBeFalsy(); - }); - - it('bomb(6.0) with 6.0 support', () => { - const emojiKey = 'bomb'; - const unicodeSupportMap = { ...emptySupportMap, '6.0': true }; - const isSupported = isEmojiUnicodeSupported( - unicodeSupportMap, - emojiFixtureMap[emojiKey].moji, - emojiFixtureMap[emojiKey].unicodeVersion, - ); - - expect(isSupported).toBeTruthy(); - }); - - it('bomb(6.0) without 6.0 support', () => { - const emojiKey = 'bomb'; - const unicodeSupportMap = emptySupportMap; - const isSupported = isEmojiUnicodeSupported( - unicodeSupportMap, - emojiFixtureMap[emojiKey].moji, - emojiFixtureMap[emojiKey].unicodeVersion, - ); - - expect(isSupported).toBeFalsy(); - }); - - it('bomb(6.0) without 6.0 but with 9.0 support', () => { - const emojiKey = 'bomb'; - const unicodeSupportMap = { ...emptySupportMap, '9.0': true }; - const isSupported = isEmojiUnicodeSupported( - unicodeSupportMap, - emojiFixtureMap[emojiKey].moji, - emojiFixtureMap[emojiKey].unicodeVersion, - ); - - expect(isSupported).toBeFalsy(); - }); - - it('construction_worker_tone5(8.0) without skin tone modifier support', () => { - const emojiKey = 'construction_worker_tone5'; - const unicodeSupportMap = { - ...emptySupportMap, - skinToneModifier: false, - '9.0': true, - '8.0': true, - '7.0': true, - 6.1: true, - '6.0': true, - 5.2: true, - 5.1: true, - 4.1: true, - '4.0': true, - 3.2: true, - '3.0': true, - 1.1: true, - }; - const isSupported = isEmojiUnicodeSupported( - unicodeSupportMap, - emojiFixtureMap[emojiKey].moji, - emojiFixtureMap[emojiKey].unicodeVersion, - ); - - expect(isSupported).toBeFalsy(); - }); - - it('use native keycap on >=57 chrome', () => { - const emojiKey = 'five'; - const unicodeSupportMap = { - ...emptySupportMap, - '3.0': true, - meta: { - isChrome: true, - chromeVersion: 57, - }, - }; - const isSupported = isEmojiUnicodeSupported( - unicodeSupportMap, - emojiFixtureMap[emojiKey].moji, - emojiFixtureMap[emojiKey].unicodeVersion, - ); - - expect(isSupported).toBeTruthy(); - }); - - it('fallback keycap on <57 chrome', () => { - const emojiKey = 'five'; - const unicodeSupportMap = { - ...emptySupportMap, - '3.0': true, - meta: { - isChrome: true, - chromeVersion: 50, - }, - }; - const isSupported = isEmojiUnicodeSupported( - unicodeSupportMap, - emojiFixtureMap[emojiKey].moji, - emojiFixtureMap[emojiKey].unicodeVersion, - ); - - expect(isSupported).toBeFalsy(); - }); - }); -}); diff --git a/spec/javascripts/flash_spec.js b/spec/javascripts/flash_spec.js deleted file mode 100644 index 39ca4eedb69..00000000000 --- a/spec/javascripts/flash_spec.js +++ /dev/null @@ -1,236 +0,0 @@ -import flash, { createFlashEl, createAction, hideFlash, removeFlashClickListener } from '~/flash'; - -describe('Flash', () => { - describe('createFlashEl', () => { - let el; - - beforeEach(() => { - el = document.createElement('div'); - }); - - afterEach(() => { - el.innerHTML = ''; - }); - - it('creates flash element with type', () => { - el.innerHTML = createFlashEl('testing', 'alert'); - - expect(el.querySelector('.flash-alert')).not.toBeNull(); - }); - - it('escapes text', () => { - el.innerHTML = createFlashEl('<script>alert("a");</script>', 'alert'); - - expect(el.querySelector('.flash-text').textContent.trim()).toBe( - '<script>alert("a");</script>', - ); - }); - }); - - describe('hideFlash', () => { - let el; - - beforeEach(() => { - el = document.createElement('div'); - el.className = 'js-testing'; - }); - - it('sets transition style', () => { - hideFlash(el); - - expect(el.style['transition-property']).toBe('opacity'); - - expect(el.style['transition-duration']).toBe('0.15s'); - }); - - it('sets opacity style', () => { - hideFlash(el); - - expect(el.style.opacity).toBe('0'); - }); - - it('does not set styles when fadeTransition is false', () => { - hideFlash(el, false); - - expect(el.style.opacity).toBe(''); - - expect(el.style.transition).toBe(''); - }); - - it('removes element after transitionend', () => { - document.body.appendChild(el); - - hideFlash(el); - el.dispatchEvent(new Event('transitionend')); - - expect(document.querySelector('.js-testing')).toBeNull(); - }); - - it('calls event listener callback once', () => { - spyOn(el, 'remove').and.callThrough(); - document.body.appendChild(el); - - hideFlash(el); - - el.dispatchEvent(new Event('transitionend')); - el.dispatchEvent(new Event('transitionend')); - - expect(el.remove.calls.count()).toBe(1); - }); - }); - - describe('createAction', () => { - let el; - - beforeEach(() => { - el = document.createElement('div'); - }); - - it('creates link with href', () => { - el.innerHTML = createAction({ - href: 'testing', - title: 'test', - }); - - expect(el.querySelector('.flash-action').href).toContain('testing'); - }); - - it('uses hash as href when no href is present', () => { - el.innerHTML = createAction({ - title: 'test', - }); - - expect(el.querySelector('.flash-action').href).toContain('#'); - }); - - it('adds role when no href is present', () => { - el.innerHTML = createAction({ - title: 'test', - }); - - expect(el.querySelector('.flash-action').getAttribute('role')).toBe('button'); - }); - - it('escapes the title text', () => { - el.innerHTML = createAction({ - title: '<script>alert("a")</script>', - }); - - expect(el.querySelector('.flash-action').textContent.trim()).toBe( - '<script>alert("a")</script>', - ); - }); - }); - - describe('createFlash', () => { - describe('no flash-container', () => { - it('does not add to the DOM', () => { - const flashEl = flash('testing'); - - expect(flashEl).toBeNull(); - - expect(document.querySelector('.flash-alert')).toBeNull(); - }); - }); - - describe('with flash-container', () => { - beforeEach(() => { - document.body.innerHTML += ` - <div class="content-wrapper js-content-wrapper"> - <div class="flash-container"></div> - </div> - `; - }); - - afterEach(() => { - document.querySelector('.js-content-wrapper').remove(); - }); - - it('adds flash element into container', () => { - flash('test', 'alert', document, null, false, true); - - expect(document.querySelector('.flash-alert')).not.toBeNull(); - - expect(document.body.className).toContain('flash-shown'); - }); - - it('adds flash into specified parent', () => { - flash('test', 'alert', document.querySelector('.content-wrapper')); - - expect(document.querySelector('.content-wrapper .flash-alert')).not.toBeNull(); - }); - - it('adds container classes when inside content-wrapper', () => { - flash('test'); - - expect(document.querySelector('.flash-text').className).toBe('flash-text'); - }); - - it('does not add container when outside of content-wrapper', () => { - document.querySelector('.content-wrapper').className = 'js-content-wrapper'; - flash('test'); - - expect(document.querySelector('.flash-text').className.trim()).toContain('flash-text'); - }); - - it('removes element after clicking', () => { - flash('test', 'alert', document, null, false, true); - - document.querySelector('.flash-alert .js-close-icon').click(); - - expect(document.querySelector('.flash-alert')).toBeNull(); - - expect(document.body.className).not.toContain('flash-shown'); - }); - - describe('with actionConfig', () => { - it('adds action link', () => { - flash('test', 'alert', document, { - title: 'test', - }); - - expect(document.querySelector('.flash-action')).not.toBeNull(); - }); - - it('calls actionConfig clickHandler on click', () => { - const actionConfig = { - title: 'test', - clickHandler: jasmine.createSpy('actionConfig'), - }; - - flash('test', 'alert', document, actionConfig); - - document.querySelector('.flash-action').click(); - - expect(actionConfig.clickHandler).toHaveBeenCalled(); - }); - }); - }); - }); - - describe('removeFlashClickListener', () => { - beforeEach(() => { - document.body.innerHTML += ` - <div class="flash-container"> - <div class="flash"> - <div class="close-icon js-close-icon"></div> - </div> - </div> - `; - }); - - it('removes global flash on click', done => { - const flashEl = document.querySelector('.flash'); - - removeFlashClickListener(flashEl, false); - - flashEl.querySelector('.js-close-icon').click(); - - setTimeout(() => { - expect(document.querySelector('.flash')).toBeNull(); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/issuable_spec.js b/spec/javascripts/issuable_spec.js deleted file mode 100644 index 4d57bfb1b33..00000000000 --- a/spec/javascripts/issuable_spec.js +++ /dev/null @@ -1,64 +0,0 @@ -import $ from 'jquery'; -import MockAdaptor from 'axios-mock-adapter'; -import axios from '~/lib/utils/axios_utils'; -import IssuableIndex from '~/issuable_index'; -import issuableInitBulkUpdateSidebar from '~/issuable_init_bulk_update_sidebar'; - -describe('Issuable', () => { - describe('initBulkUpdate', () => { - it('should not set bulkUpdateSidebar', () => { - new IssuableIndex('issue_'); // eslint-disable-line no-new - - expect(issuableInitBulkUpdateSidebar.bulkUpdateSidebar).toBeNull(); - }); - - it('should set bulkUpdateSidebar', () => { - const element = document.createElement('div'); - element.classList.add('issues-bulk-update'); - document.body.appendChild(element); - - new IssuableIndex('issue_'); // eslint-disable-line no-new - - expect(issuableInitBulkUpdateSidebar.bulkUpdateSidebar).toBeDefined(); - }); - }); - - describe('resetIncomingEmailToken', () => { - let mock; - - beforeEach(() => { - const element = document.createElement('a'); - element.classList.add('incoming-email-token-reset'); - element.setAttribute('href', 'foo'); - document.body.appendChild(element); - - const input = document.createElement('input'); - input.setAttribute('id', 'issuable_email'); - document.body.appendChild(input); - - new IssuableIndex('issue_'); // eslint-disable-line no-new - - mock = new MockAdaptor(axios); - - mock.onPut('foo').reply(200, { - new_address: 'testing123', - }); - }); - - afterEach(() => { - mock.restore(); - }); - - it('should send request to reset email token', done => { - spyOn(axios, 'put').and.callThrough(); - document.querySelector('.incoming-email-token-reset').click(); - - setTimeout(() => { - expect(axios.put).toHaveBeenCalledWith('foo'); - expect($('#issuable_email').val()).toBe('testing123'); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/landing_spec.js b/spec/javascripts/landing_spec.js deleted file mode 100644 index bffef8fc64f..00000000000 --- a/spec/javascripts/landing_spec.js +++ /dev/null @@ -1,166 +0,0 @@ -import Cookies from 'js-cookie'; -import Landing from '~/landing'; - -describe('Landing', function() { - describe('class constructor', function() { - beforeEach(function() { - this.landingElement = {}; - this.dismissButton = {}; - this.cookieName = 'cookie_name'; - - this.landing = new Landing(this.landingElement, this.dismissButton, this.cookieName); - }); - - it('should set .landing', function() { - expect(this.landing.landingElement).toBe(this.landingElement); - }); - - it('should set .cookieName', function() { - expect(this.landing.cookieName).toBe(this.cookieName); - }); - - it('should set .dismissButton', function() { - expect(this.landing.dismissButton).toBe(this.dismissButton); - }); - - it('should set .eventWrapper', function() { - expect(this.landing.eventWrapper).toEqual({}); - }); - }); - - describe('toggle', function() { - beforeEach(function() { - this.isDismissed = false; - this.landingElement = { classList: jasmine.createSpyObj('classList', ['toggle']) }; - this.landing = { - isDismissed: () => {}, - addEvents: () => {}, - landingElement: this.landingElement, - }; - - spyOn(this.landing, 'isDismissed').and.returnValue(this.isDismissed); - spyOn(this.landing, 'addEvents'); - - Landing.prototype.toggle.call(this.landing); - }); - - it('should call .isDismissed', function() { - expect(this.landing.isDismissed).toHaveBeenCalled(); - }); - - it('should call .classList.toggle', function() { - expect(this.landingElement.classList.toggle).toHaveBeenCalledWith('hidden', this.isDismissed); - }); - - it('should call .addEvents', function() { - expect(this.landing.addEvents).toHaveBeenCalled(); - }); - - describe('if isDismissed is true', function() { - beforeEach(function() { - this.isDismissed = true; - this.landingElement = { classList: jasmine.createSpyObj('classList', ['toggle']) }; - this.landing = { - isDismissed: () => {}, - addEvents: () => {}, - landingElement: this.landingElement, - }; - - spyOn(this.landing, 'isDismissed').and.returnValue(this.isDismissed); - spyOn(this.landing, 'addEvents'); - - this.landing.isDismissed.calls.reset(); - - Landing.prototype.toggle.call(this.landing); - }); - - it('should not call .addEvents', function() { - expect(this.landing.addEvents).not.toHaveBeenCalled(); - }); - }); - }); - - describe('addEvents', function() { - beforeEach(function() { - this.dismissButton = jasmine.createSpyObj('dismissButton', ['addEventListener']); - this.eventWrapper = {}; - this.landing = { - eventWrapper: this.eventWrapper, - dismissButton: this.dismissButton, - dismissLanding: () => {}, - }; - - Landing.prototype.addEvents.call(this.landing); - }); - - it('should set .eventWrapper.dismissLanding', function() { - expect(this.eventWrapper.dismissLanding).toEqual(jasmine.any(Function)); - }); - - it('should call .addEventListener', function() { - expect(this.dismissButton.addEventListener).toHaveBeenCalledWith( - 'click', - this.eventWrapper.dismissLanding, - ); - }); - }); - - describe('removeEvents', function() { - beforeEach(function() { - this.dismissButton = jasmine.createSpyObj('dismissButton', ['removeEventListener']); - this.eventWrapper = { dismissLanding: () => {} }; - this.landing = { - eventWrapper: this.eventWrapper, - dismissButton: this.dismissButton, - }; - - Landing.prototype.removeEvents.call(this.landing); - }); - - it('should call .removeEventListener', function() { - expect(this.dismissButton.removeEventListener).toHaveBeenCalledWith( - 'click', - this.eventWrapper.dismissLanding, - ); - }); - }); - - describe('dismissLanding', function() { - beforeEach(function() { - this.landingElement = { classList: jasmine.createSpyObj('classList', ['add']) }; - this.cookieName = 'cookie_name'; - this.landing = { landingElement: this.landingElement, cookieName: this.cookieName }; - - spyOn(Cookies, 'set'); - - Landing.prototype.dismissLanding.call(this.landing); - }); - - it('should call .classList.add', function() { - expect(this.landingElement.classList.add).toHaveBeenCalledWith('hidden'); - }); - - it('should call Cookies.set', function() { - expect(Cookies.set).toHaveBeenCalledWith(this.cookieName, 'true', { expires: 365 }); - }); - }); - - describe('isDismissed', function() { - beforeEach(function() { - this.cookieName = 'cookie_name'; - this.landing = { cookieName: this.cookieName }; - - spyOn(Cookies, 'get').and.returnValue('true'); - - this.isDismissed = Landing.prototype.isDismissed.call(this.landing); - }); - - it('should call Cookies.get', function() { - expect(Cookies.get).toHaveBeenCalledWith(this.cookieName); - }); - - it('should return a boolean', function() { - expect(typeof this.isDismissed).toEqual('boolean'); - }); - }); -}); diff --git a/spec/javascripts/oauth_remember_me_spec.js b/spec/javascripts/oauth_remember_me_spec.js deleted file mode 100644 index 381be82697e..00000000000 --- a/spec/javascripts/oauth_remember_me_spec.js +++ /dev/null @@ -1,39 +0,0 @@ -import $ from 'jquery'; -import OAuthRememberMe from '~/pages/sessions/new/oauth_remember_me'; - -describe('OAuthRememberMe', () => { - preloadFixtures('static/oauth_remember_me.html'); - - beforeEach(() => { - loadFixtures('static/oauth_remember_me.html'); - - new OAuthRememberMe({ container: $('#oauth-container') }).bindEvents(); - }); - - it('adds the "remember_me" query parameter to all OAuth login buttons', () => { - $('#oauth-container #remember_me').click(); - - expect($('#oauth-container .oauth-login.twitter').attr('href')).toBe( - 'http://example.com/?remember_me=1', - ); - - expect($('#oauth-container .oauth-login.github').attr('href')).toBe( - 'http://example.com/?remember_me=1', - ); - - expect($('#oauth-container .oauth-login.facebook').attr('href')).toBe( - 'http://example.com/?redirect_fragment=L1&remember_me=1', - ); - }); - - it('removes the "remember_me" query parameter from all OAuth login buttons', () => { - $('#oauth-container #remember_me').click(); - $('#oauth-container #remember_me').click(); - - expect($('#oauth-container .oauth-login.twitter').attr('href')).toBe('http://example.com/'); - expect($('#oauth-container .oauth-login.github').attr('href')).toBe('http://example.com/'); - expect($('#oauth-container .oauth-login.facebook').attr('href')).toBe( - 'http://example.com/?redirect_fragment=L1', - ); - }); -}); diff --git a/spec/javascripts/pipelines_spec.js b/spec/javascripts/pipelines_spec.js deleted file mode 100644 index 6d4d634c575..00000000000 --- a/spec/javascripts/pipelines_spec.js +++ /dev/null @@ -1,19 +0,0 @@ -import Pipelines from '~/pipelines'; - -describe('Pipelines', () => { - preloadFixtures('static/pipeline_graph.html'); - - beforeEach(() => { - loadFixtures('static/pipeline_graph.html'); - }); - - it('should be defined', () => { - expect(Pipelines).toBeDefined(); - }); - - it('should create a `Pipelines` instance without options', () => { - expect(() => { - new Pipelines(); // eslint-disable-line no-new - }).not.toThrow(); - }); -}); diff --git a/spec/javascripts/settings_panels_spec.js b/spec/javascripts/settings_panels_spec.js deleted file mode 100644 index 2c5d91a45bc..00000000000 --- a/spec/javascripts/settings_panels_spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import $ from 'jquery'; -import initSettingsPanels from '~/settings_panels'; - -describe('Settings Panels', () => { - preloadFixtures('groups/edit.html'); - - beforeEach(() => { - loadFixtures('groups/edit.html'); - }); - - describe('initSettingsPane', () => { - afterEach(() => { - window.location.hash = ''; - }); - - it('should expand linked hash fragment panel', () => { - window.location.hash = '#js-general-settings'; - - const panel = document.querySelector('#js-general-settings'); - // Our test environment automatically expands everything so we need to clear that out first - panel.classList.remove('expanded'); - - expect(panel.classList.contains('expanded')).toBe(false); - - initSettingsPanels(); - - expect(panel.classList.contains('expanded')).toBe(true); - }); - }); - - it('does not change the text content of triggers', () => { - const panel = document.querySelector('#js-general-settings'); - const trigger = panel.querySelector('.js-settings-toggle-trigger-only'); - const originalText = trigger.textContent; - - initSettingsPanels(); - - expect(panel.classList.contains('expanded')).toBe(true); - - $(trigger).click(); - - expect(panel.classList.contains('expanded')).toBe(false); - expect(trigger.textContent).toEqual(originalText); - }); -}); |