diff options
Diffstat (limited to 'spec/javascripts')
15 files changed, 340 insertions, 99 deletions
diff --git a/spec/javascripts/clusters/components/applications_spec.js b/spec/javascripts/clusters/components/applications_spec.js index e2466bf326c..790e4b9602c 100644 --- a/spec/javascripts/clusters/components/applications_spec.js +++ b/spec/javascripts/clusters/components/applications_spec.js @@ -141,7 +141,7 @@ describe('Applications', () => { }); describe('without ip address', () => { - it('renders an input text with a question mark and an alert text', () => { + it('renders an input text with a loading icon and an alert text', () => { vm = mountComponent(Applications, { applications: { ...APPLICATIONS_MOCK_STATE, @@ -152,8 +152,7 @@ describe('Applications', () => { }, }); - expect(vm.$el.querySelector('.js-endpoint').value).toEqual('?'); - + expect(vm.$el.querySelector('.js-ingress-ip-loading-icon')).not.toBe(null); expect(vm.$el.querySelector('.js-no-endpoint-message')).not.toBe(null); }); }); @@ -330,7 +329,7 @@ describe('Applications', () => { }); describe('without ip address', () => { - it('renders an input text with a question mark and an alert text', () => { + it('renders an input text with a loading icon and an alert text', () => { vm = mountComponent(Applications, { applications: { ...APPLICATIONS_MOCK_STATE, @@ -342,8 +341,7 @@ describe('Applications', () => { }, }); - expect(vm.$el.querySelector('.js-knative-endpoint').value).toEqual('?'); - + expect(vm.$el.querySelector('.js-knative-ip-loading-icon')).not.toBe(null); expect(vm.$el.querySelector('.js-no-knative-endpoint-message')).not.toBe(null); }); }); diff --git a/spec/javascripts/diffs/components/diff_file_spec.js b/spec/javascripts/diffs/components/diff_file_spec.js index ba04c8c4a4c..d9b298e84da 100644 --- a/spec/javascripts/diffs/components/diff_file_spec.js +++ b/spec/javascripts/diffs/components/diff_file_spec.js @@ -109,6 +109,31 @@ describe('DiffFile', () => { done(); }); }); + + it('should update store state', done => { + spyOn(vm.$store, 'dispatch'); + + vm.isCollapsed = true; + + vm.$nextTick(() => { + expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/setFileCollapsed', { + filePath: vm.file.file_path, + collapsed: true, + }); + + done(); + }); + }); + + it('updates local state when changing file state', done => { + vm.file.viewer.collapsed = true; + + vm.$nextTick(() => { + expect(vm.isCollapsed).toBe(true); + + done(); + }); + }); }); }); diff --git a/spec/javascripts/diffs/store/actions_spec.js b/spec/javascripts/diffs/store/actions_spec.js index 070bfb2ccd0..6c637097893 100644 --- a/spec/javascripts/diffs/store/actions_spec.js +++ b/spec/javascripts/diffs/store/actions_spec.js @@ -35,6 +35,7 @@ import actions, { receiveFullDiffError, fetchFullDiff, toggleFullDiff, + setFileCollapsed, } from '~/diffs/store/actions'; import eventHub from '~/notes/event_hub'; import * as types from '~/diffs/store/mutation_types'; @@ -977,4 +978,17 @@ describe('DiffsStoreActions', () => { ); }); }); + + describe('setFileCollapsed', () => { + it('commits SET_FILE_COLLAPSED', done => { + testAction( + setFileCollapsed, + { filePath: 'test', collapsed: true }, + null, + [{ type: types.SET_FILE_COLLAPSED, payload: { filePath: 'test', collapsed: true } }], + [], + done, + ); + }); + }); }); diff --git a/spec/javascripts/diffs/store/mutations_spec.js b/spec/javascripts/diffs/store/mutations_spec.js index 270e7d75666..5556a994a14 100644 --- a/spec/javascripts/diffs/store/mutations_spec.js +++ b/spec/javascripts/diffs/store/mutations_spec.js @@ -58,13 +58,15 @@ describe('DiffsStoreMutations', () => { describe('EXPAND_ALL_FILES', () => { it('should change the collapsed prop from diffFiles', () => { const diffFile = { - collapsed: true, + viewer: { + collapsed: true, + }, }; const state = { expandAllFiles: true, diffFiles: [diffFile] }; mutations[types.EXPAND_ALL_FILES](state); - expect(state.diffFiles[0].collapsed).toEqual(false); + expect(state.diffFiles[0].viewer.collapsed).toEqual(false); }); }); @@ -742,4 +744,16 @@ describe('DiffsStoreMutations', () => { expect(state.diffFiles[0].isShowingFullFile).toBe(true); }); }); + + describe('SET_FILE_COLLAPSED', () => { + it('sets collapsed', () => { + const state = { + diffFiles: [{ file_path: 'test', viewer: { collapsed: false } }], + }; + + mutations[types.SET_FILE_COLLAPSED](state, { filePath: 'test', collapsed: true }); + + expect(state.diffFiles[0].viewer.collapsed).toBe(true); + }); + }); }); diff --git a/spec/javascripts/environments/environment_item_spec.js b/spec/javascripts/environments/environment_item_spec.js index a89e50045da..8b877994515 100644 --- a/spec/javascripts/environments/environment_item_spec.js +++ b/spec/javascripts/environments/environment_item_spec.js @@ -20,23 +20,23 @@ describe('Environment item', () => { size: 3, isFolder: true, environment_path: 'url', + log_path: 'url', }; component = new EnvironmentItem({ propsData: { model: mockItem, canReadEnvironment: true, - service: {}, }, }).$mount(); }); - it('Should render folder icon and name', () => { + it('should render folder icon and name', () => { expect(component.$el.querySelector('.folder-name').textContent).toContain(mockItem.name); expect(component.$el.querySelector('.folder-icon')).toBeDefined(); }); - it('Should render the number of children in a badge', () => { + it('should render the number of children in a badge', () => { expect(component.$el.querySelector('.folder-name .badge').textContent).toContain( mockItem.size, ); @@ -109,6 +109,7 @@ describe('Environment item', () => { }, has_stop_action: true, environment_path: 'root/ci-folders/environments/31', + log_path: 'root/ci-folders/environments/31/logs', created_at: '2016-11-07T11:11:16.525Z', updated_at: '2016-11-10T15:55:58.778Z', }; @@ -117,7 +118,6 @@ describe('Environment item', () => { propsData: { model: environment, canReadEnvironment: true, - service: {}, }, }).$mount(); }); @@ -157,13 +157,13 @@ describe('Environment item', () => { }); describe('With build url', () => { - it('Should link to build url provided', () => { + it('should link to build url provided', () => { expect(component.$el.querySelector('.build-link').getAttribute('href')).toEqual( environment.last_deployment.deployable.build_path, ); }); - it('Should render deployable name and id', () => { + it('should render deployable name and id', () => { expect(component.$el.querySelector('.build-link').getAttribute('href')).toEqual( environment.last_deployment.deployable.build_path, ); @@ -178,7 +178,7 @@ describe('Environment item', () => { }); describe('With manual actions', () => { - it('Should render actions component', () => { + it('should render actions component', () => { expect(component.$el.querySelector('.js-manual-actions-container')).toBeDefined(); }); }); @@ -190,13 +190,13 @@ describe('Environment item', () => { }); describe('With stop action', () => { - it('Should render stop action component', () => { + it('should render stop action component', () => { expect(component.$el.querySelector('.js-stop-component-container')).toBeDefined(); }); }); describe('With retry action', () => { - it('Should render rollback component', () => { + it('should render rollback component', () => { expect(component.$el.querySelector('.js-rollback-component-container')).toBeDefined(); }); }); diff --git a/spec/javascripts/environments/environment_table_spec.js b/spec/javascripts/environments/environment_table_spec.js index ecd28594873..a3f34232a85 100644 --- a/spec/javascripts/environments/environment_table_spec.js +++ b/spec/javascripts/environments/environment_table_spec.js @@ -6,6 +6,14 @@ describe('Environment table', () => { let Component; let vm; + const eeOnlyProps = { + canaryDeploymentFeatureId: 'canary_deployment', + showCanaryDeploymentCallout: true, + userCalloutsPath: '/callouts', + lockPromotionSvgPath: '/assets/illustrations/lock-promotion.svg', + helpCanaryDeploymentsPath: 'help/canary-deployments', + }; + beforeEach(() => { Component = Vue.extend(environmentTableComp); }); @@ -27,6 +35,7 @@ describe('Environment table', () => { vm = mountComponent(Component, { environments: [mockItem], canReadEnvironment: true, + ...eeOnlyProps, }); expect(vm.$el.getAttribute('class')).toContain('ci-table'); @@ -67,6 +76,7 @@ describe('Environment table', () => { vm = mountComponent(Component, { environments: mockItems, canReadEnvironment: true, + ...eeOnlyProps, }); const [old, newer, older, noDeploy] = mockItems; @@ -130,6 +140,7 @@ describe('Environment table', () => { vm = mountComponent(Component, { environments: mockItems, canReadEnvironment: true, + ...eeOnlyProps, }); const [prod, review, staging] = mockItems; @@ -166,6 +177,7 @@ describe('Environment table', () => { vm = mountComponent(Component, { environments: mockItems, canReadEnvironment: true, + ...eeOnlyProps, }); const [old, newer, older] = mockItems; @@ -192,6 +204,7 @@ describe('Environment table', () => { vm = mountComponent(Component, { environments: mockItems, canReadEnvironment: true, + ...eeOnlyProps, }); const [old, newer, older] = mockItems; @@ -240,6 +253,7 @@ describe('Environment table', () => { vm = mountComponent(Component, { environments: mockItems, canReadEnvironment: true, + ...eeOnlyProps, }); expect(vm.sortedEnvironments.map(env => env.name)).toEqual([ diff --git a/spec/javascripts/environments/environments_app_spec.js b/spec/javascripts/environments/environments_app_spec.js index b6a244f7cd3..0dcd8868aba 100644 --- a/spec/javascripts/environments/environments_app_spec.js +++ b/spec/javascripts/environments/environments_app_spec.js @@ -13,6 +13,11 @@ describe('Environment', () => { cssContainerClass: 'container', newEnvironmentPath: 'environments/new', helpPagePath: 'help', + canaryDeploymentFeatureId: 'canary_deployment', + showCanaryDeploymentCallout: true, + userCalloutsPath: '/callouts', + lockPromotionSvgPath: '/assets/illustrations/lock-promotion.svg', + helpCanaryDeploymentsPath: 'help/canary-deployments', }; let EnvironmentsComponent; diff --git a/spec/javascripts/environments/environments_store_spec.js b/spec/javascripts/environments/environments_store_spec.js index c3d16f10d72..8abdbcbbe54 100644 --- a/spec/javascripts/environments/environments_store_spec.js +++ b/spec/javascripts/environments/environments_store_spec.js @@ -34,54 +34,46 @@ describe('Store', () => { expect(store.state.stoppedCounter).toEqual(2); }); - describe('store environments', () => { - it('should store environments', () => { - store.storeEnvironments(serverData); - - expect(store.state.environments.length).toEqual(serverData.length); - }); - - it('should add folder keys when environment is a folder', () => { - const environment = { - name: 'bar', - size: 3, - id: 2, - }; + it('should add folder keys when environment is a folder', () => { + const environment = { + name: 'bar', + size: 3, + id: 2, + }; - store.storeEnvironments([environment]); + store.storeEnvironments([environment]); - expect(store.state.environments[0].isFolder).toEqual(true); - expect(store.state.environments[0].folderName).toEqual('bar'); - }); - - it('should extract content of `latest` key when provided', () => { - const environment = { - name: 'bar', - size: 3, - id: 2, - latest: { - last_deployment: {}, - isStoppable: true, - }, - }; - - store.storeEnvironments([environment]); + expect(store.state.environments[0].isFolder).toEqual(true); + expect(store.state.environments[0].folderName).toEqual('bar'); + }); - expect(store.state.environments[0].last_deployment).toEqual({}); - expect(store.state.environments[0].isStoppable).toEqual(true); - }); + it('should extract content of `latest` key when provided', () => { + const environment = { + name: 'bar', + size: 3, + id: 2, + latest: { + last_deployment: {}, + isStoppable: true, + }, + }; + + store.storeEnvironments([environment]); + + expect(store.state.environments[0].last_deployment).toEqual({}); + expect(store.state.environments[0].isStoppable).toEqual(true); + }); - it('should store latest.name when the environment is not a folder', () => { - store.storeEnvironments(serverData); + it('should store latest.name when the environment is not a folder', () => { + store.storeEnvironments(serverData); - expect(store.state.environments[0].name).toEqual(serverData[0].latest.name); - }); + expect(store.state.environments[0].name).toEqual(serverData[0].latest.name); + }); - it('should store root level name when environment is a folder', () => { - store.storeEnvironments(serverData); + it('should store root level name when environment is a folder', () => { + store.storeEnvironments(serverData); - expect(store.state.environments[1].folderName).toEqual(serverData[1].name); - }); + expect(store.state.environments[1].folderName).toEqual(serverData[1].name); }); describe('toggleFolder', () => { diff --git a/spec/javascripts/environments/folder/environments_folder_view_spec.js b/spec/javascripts/environments/folder/environments_folder_view_spec.js index 69ddd26eef1..ff15067aeac 100644 --- a/spec/javascripts/environments/folder/environments_folder_view_spec.js +++ b/spec/javascripts/environments/folder/environments_folder_view_spec.js @@ -3,6 +3,7 @@ import MockAdapter from 'axios-mock-adapter'; import axios from '~/lib/utils/axios_utils'; import environmentsFolderViewComponent from '~/environments/folder/environments_folder_view.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import { removeBreakLine, removeWhitespace } from 'spec/helpers/vue_component_helper'; import { environmentsList } from '../mock_data'; describe('Environments Folder View', () => { @@ -15,6 +16,11 @@ describe('Environments Folder View', () => { folderName: 'review', canReadEnvironment: true, cssContainerClass: 'container', + canaryDeploymentFeatureId: 'canary_deployment', + showCanaryDeploymentCallout: true, + userCalloutsPath: '/callouts', + lockPromotionSvgPath: '/assets/illustrations/lock-promotion.svg', + helpCanaryDeploymentsPath: 'help/canary-deployments', }; beforeEach(() => { @@ -89,9 +95,11 @@ describe('Environments Folder View', () => { it('should render parent folder name', done => { setTimeout(() => { - expect(component.$el.querySelector('.js-folder-name').textContent.trim()).toContain( - 'Environments / review', - ); + expect( + removeBreakLine( + removeWhitespace(component.$el.querySelector('.js-folder-name').textContent.trim()), + ), + ).toContain('Environments / review'); done(); }, 0); }); diff --git a/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js b/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js index f3dc35552d5..a72ea6ab547 100644 --- a/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js +++ b/spec/javascripts/filtered_search/filtered_search_visual_tokens_spec.js @@ -293,6 +293,7 @@ describe('Filtered Search Visual Tokens', () => { subject.addVisualTokenElement('milestone'); const token = tokensContainer.querySelector('.js-visual-token'); + expect(token.classList.contains('search-token-milestone')).toEqual(true); expect(token.classList.contains('filtered-search-token')).toEqual(true); expect(token.querySelector('.name').innerText).toEqual('milestone'); expect(token.querySelector('.value')).toEqual(null); @@ -302,6 +303,7 @@ describe('Filtered Search Visual Tokens', () => { subject.addVisualTokenElement('label', 'Frontend'); const token = tokensContainer.querySelector('.js-visual-token'); + expect(token.classList.contains('search-token-label')).toEqual(true); expect(token.classList.contains('filtered-search-token')).toEqual(true); expect(token.querySelector('.name').innerText).toEqual('label'); expect(token.querySelector('.value').innerText).toEqual('Frontend'); @@ -317,10 +319,12 @@ describe('Filtered Search Visual Tokens', () => { const labelToken = tokens[0]; const assigneeToken = tokens[1]; + expect(labelToken.classList.contains('search-token-label')).toEqual(true); expect(labelToken.classList.contains('filtered-search-token')).toEqual(true); expect(labelToken.querySelector('.name').innerText).toEqual('label'); expect(labelToken.querySelector('.value').innerText).toEqual('Frontend'); + expect(assigneeToken.classList.contains('search-token-assignee')).toEqual(true); expect(assigneeToken.classList.contains('filtered-search-token')).toEqual(true); expect(assigneeToken.querySelector('.name').innerText).toEqual('assignee'); expect(assigneeToken.querySelector('.value').innerText).toEqual('@root'); diff --git a/spec/javascripts/fixtures/emojis.rb b/spec/javascripts/fixtures/emojis.rb index f5fb008c7b3..4dab697e5e2 100644 --- a/spec/javascripts/fixtures/emojis.rb +++ b/spec/javascripts/fixtures/emojis.rb @@ -9,6 +9,8 @@ describe 'Emojis (JavaScript fixtures)' do it 'emojis/emojis.json' do |example| JavaScriptFixturesHelpers::FIXTURE_PATHS.each do |fixture_path| + next unless File.directory?(fixture_path) + # Copying the emojis.json from the public folder fixture_file_name = File.expand_path('emojis/emojis.json', fixture_path) FileUtils.mkdir_p(File.dirname(fixture_file_name)) diff --git a/spec/javascripts/helpers/filtered_search_spec_helper.js b/spec/javascripts/helpers/filtered_search_spec_helper.js index 8933dd5def4..fd06bb1f324 100644 --- a/spec/javascripts/helpers/filtered_search_spec_helper.js +++ b/spec/javascripts/helpers/filtered_search_spec_helper.js @@ -5,7 +5,7 @@ export default class FilteredSearchSpecHelper { static createFilterVisualToken(name, value, isSelected = false) { const li = document.createElement('li'); - li.classList.add('js-visual-token', 'filtered-search-token'); + li.classList.add('js-visual-token', 'filtered-search-token', `search-token-${name}`); li.innerHTML = ` <div class="selectable ${isSelected ? 'selected' : ''}" role="button"> diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js index 5eef5682bbd..235a17d13b0 100644 --- a/spec/javascripts/test_bundle.js +++ b/spec/javascripts/test_bundle.js @@ -69,7 +69,7 @@ window.gl = window.gl || {}; window.gl.TEST_HOST = TEST_HOST; window.gon = window.gon || {}; window.gon.test_env = true; -window.gon.ee = false; +window.gon.ee = process.env.EE; gon.relative_url_root = ''; let hasUnhandledPromiseRejections = false; @@ -122,19 +122,26 @@ afterEach(() => { const axiosDefaultAdapter = getDefaultAdapter(); // render all of our tests -const testsContext = require.context('.', true, /_spec$/); -testsContext.keys().forEach(function(path) { - try { - testsContext(path); - } catch (err) { - console.log(err); - console.error('[GL SPEC RUNNER ERROR] Unable to load spec: ', path); - describe('Test bundle', function() { - it(`includes '${path}'`, function() { - expect(err).toBeNull(); +const testContexts = [require.context('spec', true, /_spec$/)]; + +if (process.env.EE) { + testContexts.push(require.context('ee_spec', true, /_spec$/)); +} + +testContexts.forEach(context => { + context.keys().forEach(path => { + try { + context(path); + } catch (err) { + console.log(err); + console.error('[GL SPEC RUNNER ERROR] Unable to load spec: ', path); + describe('Test bundle', function() { + it(`includes '${path}'`, function() { + expect(err).toBeNull(); + }); }); - }); - } + } + }); }); describe('test errors', () => { @@ -204,24 +211,35 @@ if (process.env.BABEL_ENV === 'coverage') { ]; describe('Uncovered files', function() { - const sourceFiles = require.context('~', true, /\.(js|vue)$/); + const sourceFilesContexts = [require.context('~', true, /\.(js|vue)$/)]; + + if (process.env.EE) { + sourceFilesContexts.push(require.context('ee', true, /\.(js|vue)$/)); + } + + const allTestFiles = testContexts.reduce( + (accumulator, context) => accumulator.concat(context.keys()), + [], + ); $.holdReady(true); - sourceFiles.keys().forEach(function(path) { - // ignore if there is a matching spec file - if (testsContext.keys().indexOf(`${path.replace(/\.(js|vue)$/, '')}_spec`) > -1) { - return; - } - - it(`includes '${path}'`, function() { - try { - sourceFiles(path); - } catch (err) { - if (troubleMakers.indexOf(path) === -1) { - expect(err).toBeNull(); - } + sourceFilesContexts.forEach(context => { + context.keys().forEach(path => { + // ignore if there is a matching spec file + if (allTestFiles.indexOf(`${path.replace(/\.(js|vue)$/, '')}_spec`) > -1) { + return; } + + it(`includes '${path}'`, function() { + try { + context(path); + } catch (err) { + if (troubleMakers.indexOf(path) === -1) { + expect(err).toBeNull(); + } + } + }); }); }); }); diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_commits_header_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_commits_header_spec.js index 5cf6408cf34..9ee2f88c78d 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_commits_header_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_commits_header_spec.js @@ -15,6 +15,7 @@ describe('Commits header component', () => { isSquashEnabled: false, targetBranch: 'master', commitsCount: 5, + isFastForwardEnabled: false, ...props, }, }); @@ -31,6 +32,27 @@ describe('Commits header component', () => { const findTargetBranchMessage = () => wrapper.find('.label-branch'); const findModifyButton = () => wrapper.find('.modify-message-button'); + describe('when fast-forward is enabled', () => { + beforeEach(() => { + createComponent({ + isFastForwardEnabled: true, + isSquashEnabled: true, + }); + }); + + it('has commits count message showing 1 commit', () => { + expect(findCommitsCountMessage().text()).toBe('1 commit'); + }); + + it('has button with modify commit message', () => { + expect(findModifyButton().text()).toBe('Modify commit message'); + }); + + it('does not have merge commit part of the message', () => { + expect(findHeaderWrapper().text()).not.toContain('1 merge commit'); + }); + }); + describe('when collapsed', () => { it('toggle has aria-label equal to Expand', () => { createComponent(); @@ -78,6 +100,10 @@ describe('Commits header component', () => { expect(findTargetBranchMessage().text()).toBe('master'); }); + + it('does has merge commit part of the message', () => { + expect(findHeaderWrapper().text()).toContain('1 merge commit'); + }); }); describe('when expanded', () => { diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js index 08e173b0a10..30659ad16f3 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js @@ -18,6 +18,7 @@ const createTestMr = customConfig => { isPipelinePassing: false, isMergeAllowed: true, onlyAllowMergeIfPipelineSucceeds: false, + ffOnlyEnabled: false, hasCI: false, ciStatus: null, sha: '12345678', @@ -376,11 +377,29 @@ describe('ReadyToMerge', () => { }); describe('initiateMergePolling', () => { + beforeEach(() => { + jasmine.clock().install(); + }); + + afterEach(() => { + jasmine.clock().uninstall(); + }); + it('should call simplePoll', () => { const simplePoll = spyOnDependency(ReadyToMerge, 'simplePoll'); vm.initiateMergePolling(); - expect(simplePoll).toHaveBeenCalled(); + expect(simplePoll).toHaveBeenCalledWith(jasmine.any(Function), { timeout: 0 }); + }); + + it('should call handleMergePolling', () => { + spyOn(vm, 'handleMergePolling'); + + vm.initiateMergePolling(); + + jasmine.clock().tick(2000); + + expect(vm.handleMergePolling).toHaveBeenCalled(); }); }); @@ -624,6 +643,10 @@ describe('ReadyToMerge', () => { const findCommitsHeaderElement = () => wrapper.find(CommitsHeader); const findCommitEditElements = () => wrapper.findAll(CommitEdit); const findCommitDropdownElement = () => wrapper.find(CommitMessageDropdown); + const findFirstCommitEditLabel = () => + findCommitEditElements() + .at(0) + .props('label'); describe('squash checkbox', () => { it('should be rendered when squash before merge is enabled and there is more than 1 commit', () => { @@ -648,31 +671,129 @@ describe('ReadyToMerge', () => { }); describe('commits count collapsible header', () => { - it('should be rendered if fast-forward is disabled', () => { + it('should be rendered when fast-forward is disabled', () => { createLocalComponent(); expect(findCommitsHeaderElement().exists()).toBeTruthy(); }); - it('should not be rendered if fast-forward is enabled', () => { - createLocalComponent({ mr: { ffOnlyEnabled: true } }); + describe('when fast-forward is enabled', () => { + it('should be rendered if squash and squash before are enabled and there is more than 1 commit', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + enableSquashBeforeMerge: true, + squash: true, + commitsCount: 2, + }, + }); + + expect(findCommitsHeaderElement().exists()).toBeTruthy(); + }); + + it('should not be rendered if squash before merge is disabled', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + enableSquashBeforeMerge: false, + squash: true, + commitsCount: 2, + }, + }); + + expect(findCommitsHeaderElement().exists()).toBeFalsy(); + }); + + it('should not be rendered if squash is disabled', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + squash: false, + enableSquashBeforeMerge: true, + commitsCount: 2, + }, + }); + + expect(findCommitsHeaderElement().exists()).toBeFalsy(); + }); + + it('should not be rendered if commits count is 1', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + squash: true, + enableSquashBeforeMerge: true, + commitsCount: 1, + }, + }); - expect(findCommitsHeaderElement().exists()).toBeFalsy(); + expect(findCommitsHeaderElement().exists()).toBeFalsy(); + }); }); }); describe('commits edit components', () => { + describe('when fast-forward merge is enabled', () => { + it('should not be rendered if squash is disabled', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + squash: false, + enableSquashBeforeMerge: true, + commitsCount: 2, + }, + }); + + expect(findCommitEditElements().length).toBe(0); + }); + + it('should not be rendered if squash before merge is disabled', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + squash: true, + enableSquashBeforeMerge: false, + commitsCount: 2, + }, + }); + + expect(findCommitEditElements().length).toBe(0); + }); + + it('should not be rendered if there is only one commit', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + squash: true, + enableSquashBeforeMerge: true, + commitsCount: 1, + }, + }); + + expect(findCommitEditElements().length).toBe(0); + }); + + it('should have one edit component if squash is enabled and there is more than 1 commit', () => { + createLocalComponent({ + mr: { + ffOnlyEnabled: true, + squash: true, + enableSquashBeforeMerge: true, + commitsCount: 2, + }, + }); + + expect(findCommitEditElements().length).toBe(1); + expect(findFirstCommitEditLabel()).toBe('Squash commit message'); + }); + }); + it('should have one edit component when squash is disabled', () => { createLocalComponent(); expect(findCommitEditElements().length).toBe(1); }); - const findFirstCommitEditLabel = () => - findCommitEditElements() - .at(0) - .props('label'); - it('should have two edit components when squash is enabled and there is more than 1 commit', () => { createLocalComponent({ mr: { |