diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-14 15:09:08 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-14 15:09:08 +0000 |
commit | b3a736ed88a1db0391cd9881e70b987bab7d89d1 (patch) | |
tree | a91ca3a06abd4c3412775ac3c49b11e3151df2be /spec/javascripts | |
parent | 5366964a10484c2783a646b35a6da9eece01b242 (diff) | |
download | gitlab-ce-b3a736ed88a1db0391cd9881e70b987bab7d89d1.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/javascripts')
5 files changed, 161 insertions, 49 deletions
diff --git a/spec/javascripts/ide/components/commit_sidebar/new_merge_request_option_spec.js b/spec/javascripts/ide/components/commit_sidebar/new_merge_request_option_spec.js index 02caf689c50..7c0b4000229 100644 --- a/spec/javascripts/ide/components/commit_sidebar/new_merge_request_option_spec.js +++ b/spec/javascripts/ide/components/commit_sidebar/new_merge_request_option_spec.js @@ -1,13 +1,15 @@ import Vue from 'vue'; import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; import { projectData, branches } from 'spec/ide/mock_data'; -import { resetStore } from 'spec/ide/helpers'; import NewMergeRequestOption from '~/ide/components/commit_sidebar/new_merge_request_option.vue'; -import store from '~/ide/stores'; -import consts from '../../../../../app/assets/javascripts/ide/stores/modules/commit/constants'; +import { createStore } from '~/ide/stores'; +import { PERMISSION_CREATE_MR } from '~/ide/constants'; +import consts from '~/ide/stores/modules/commit/constants'; describe('create new MR checkbox', () => { + let store; let vm; + const setMR = () => { vm.$store.state.currentMergeRequestId = '1'; vm.$store.state.projects[store.state.currentProjectId].mergeRequests[ @@ -15,6 +17,10 @@ describe('create new MR checkbox', () => { ] = { foo: 'bar' }; }; + const setPermissions = permissions => { + store.state.projects[store.state.currentProjectId].userPermissions = permissions; + }; + const createComponent = ({ currentBranchId = 'master', createNewBranch = false } = {}) => { const Component = Vue.extend(NewMergeRequestOption); @@ -25,20 +31,29 @@ describe('create new MR checkbox', () => { : consts.COMMIT_TO_CURRENT_BRANCH; vm.$store.state.currentBranchId = currentBranchId; - vm.$store.state.currentProjectId = 'abcproject'; - const proj = JSON.parse(JSON.stringify(projectData)); - proj.branches[currentBranchId] = branches.find(branch => branch.name === currentBranchId); - - Vue.set(vm.$store.state.projects, 'abcproject', proj); + store.state.projects.abcproject.branches[currentBranchId] = branches.find( + branch => branch.name === currentBranchId, + ); return vm.$mount(); }; + const findInput = () => vm.$el.querySelector('input[type="checkbox"]'); + const findLabel = () => vm.$el.querySelector('.js-ide-commit-new-mr'); + + beforeEach(() => { + store = createStore(); + + store.state.currentProjectId = 'abcproject'; + + const proj = JSON.parse(JSON.stringify(projectData)); + proj.userPermissions[PERMISSION_CREATE_MR] = true; + Vue.set(store.state.projects, 'abcproject', proj); + }); + afterEach(() => { vm.$destroy(); - - resetStore(vm.$store); }); describe('for default branch', () => { @@ -160,6 +175,24 @@ describe('create new MR checkbox', () => { .then(done) .catch(done.fail); }); + + it('shows enablded checkbox', () => { + expect(findLabel().classList.contains('is-disabled')).toBe(false); + expect(findInput().disabled).toBe(false); + }); + }); + + describe('when user cannot create MR', () => { + beforeEach(() => { + setPermissions({ [PERMISSION_CREATE_MR]: false }); + + createComponent({ currentBranchId: 'regular' }); + }); + + it('disabled checkbox', () => { + expect(findLabel().classList.contains('is-disabled')).toBe(true); + expect(findInput().disabled).toBe(true); + }); }); it('dispatches toggleShouldCreateMR when clicking checkbox', () => { diff --git a/spec/javascripts/ide/components/nav_dropdown_button_spec.js b/spec/javascripts/ide/components/nav_dropdown_button_spec.js index 0d63869fba2..bbaf97164ea 100644 --- a/spec/javascripts/ide/components/nav_dropdown_button_spec.js +++ b/spec/javascripts/ide/components/nav_dropdown_button_spec.js @@ -2,62 +2,92 @@ import Vue from 'vue'; import { trimText } from 'spec/helpers/text_helper'; import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; import NavDropdownButton from '~/ide/components/nav_dropdown_button.vue'; -import store from '~/ide/stores'; -import { resetStore } from '../helpers'; +import { createStore } from '~/ide/stores'; describe('NavDropdown', () => { const TEST_BRANCH_ID = 'lorem-ipsum-dolar'; const TEST_MR_ID = '12345'; - const Component = Vue.extend(NavDropdownButton); + let store; let vm; beforeEach(() => { - vm = mountComponentWithStore(Component, { store }); - - vm.$mount(); + store = createStore(); }); afterEach(() => { vm.$destroy(); - - resetStore(store); }); - it('renders empty placeholders, if state is falsey', () => { - expect(trimText(vm.$el.textContent)).toEqual('- -'); - }); + const createComponent = (props = {}) => { + vm = mountComponentWithStore(Vue.extend(NavDropdownButton), { props, store }); + vm.$mount(); + }; - it('renders branch name, if state has currentBranchId', done => { - vm.$store.state.currentBranchId = TEST_BRANCH_ID; + const findIcon = name => vm.$el.querySelector(`.ic-${name}`); + const findMRIcon = () => findIcon('merge-request'); + const findBranchIcon = () => findIcon('branch'); - vm.$nextTick() - .then(() => { - expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} -`); - }) - .then(done) - .catch(done.fail); - }); + describe('normal', () => { + beforeEach(() => { + createComponent(); + }); + + it('renders empty placeholders, if state is falsey', () => { + expect(trimText(vm.$el.textContent)).toEqual('- -'); + }); - it('renders mr id, if state has currentMergeRequestId', done => { - vm.$store.state.currentMergeRequestId = TEST_MR_ID; + it('renders branch name, if state has currentBranchId', done => { + vm.$store.state.currentBranchId = TEST_BRANCH_ID; - vm.$nextTick() - .then(() => { - expect(trimText(vm.$el.textContent)).toEqual(`- !${TEST_MR_ID}`); - }) - .then(done) - .catch(done.fail); + vm.$nextTick() + .then(() => { + expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} -`); + }) + .then(done) + .catch(done.fail); + }); + + it('renders mr id, if state has currentMergeRequestId', done => { + vm.$store.state.currentMergeRequestId = TEST_MR_ID; + + vm.$nextTick() + .then(() => { + expect(trimText(vm.$el.textContent)).toEqual(`- !${TEST_MR_ID}`); + }) + .then(done) + .catch(done.fail); + }); + + it('renders branch and mr, if state has both', done => { + vm.$store.state.currentBranchId = TEST_BRANCH_ID; + vm.$store.state.currentMergeRequestId = TEST_MR_ID; + + vm.$nextTick() + .then(() => { + expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} !${TEST_MR_ID}`); + }) + .then(done) + .catch(done.fail); + }); + + it('shows icons', () => { + expect(findBranchIcon()).toBeTruthy(); + expect(findMRIcon()).toBeTruthy(); + }); }); - it('renders branch and mr, if state has both', done => { - vm.$store.state.currentBranchId = TEST_BRANCH_ID; - vm.$store.state.currentMergeRequestId = TEST_MR_ID; + describe('with showMergeRequests false', () => { + beforeEach(() => { + createComponent({ showMergeRequests: false }); + }); + + it('shows single empty placeholder, if state is falsey', () => { + expect(trimText(vm.$el.textContent)).toEqual('-'); + }); - vm.$nextTick() - .then(() => { - expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} !${TEST_MR_ID}`); - }) - .then(done) - .catch(done.fail); + it('shows only branch icon', () => { + expect(findBranchIcon()).toBeTruthy(); + expect(findMRIcon()).toBe(null); + }); }); }); diff --git a/spec/javascripts/ide/components/nav_dropdown_spec.js b/spec/javascripts/ide/components/nav_dropdown_spec.js index fe1d0ca371d..dfb4d03540f 100644 --- a/spec/javascripts/ide/components/nav_dropdown_spec.js +++ b/spec/javascripts/ide/components/nav_dropdown_spec.js @@ -3,6 +3,9 @@ import Vue from 'vue'; import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; import store from '~/ide/stores'; import NavDropdown from '~/ide/components/nav_dropdown.vue'; +import { PERMISSION_READ_MR } from '~/ide/constants'; + +const TEST_PROJECT_ID = 'lorem-ipsum'; describe('IDE NavDropdown', () => { const Component = Vue.extend(NavDropdown); @@ -10,6 +13,12 @@ describe('IDE NavDropdown', () => { let $dropdown; beforeEach(() => { + store.state.currentProjectId = TEST_PROJECT_ID; + Vue.set(store.state.projects, TEST_PROJECT_ID, { + userPermissions: { + [PERMISSION_READ_MR]: true, + }, + }); vm = mountComponentWithStore(Component, { store }); $dropdown = $(vm.$el); @@ -21,6 +30,9 @@ describe('IDE NavDropdown', () => { vm.$destroy(); }); + const findIcon = name => vm.$el.querySelector(`.ic-${name}`); + const findMRIcon = () => findIcon('merge-request'); + it('renders nothing initially', () => { expect(vm.$el).not.toContainElement('.ide-nav-form'); }); @@ -47,4 +59,22 @@ describe('IDE NavDropdown', () => { .then(done) .catch(done.fail); }); + + it('renders merge request icon', () => { + expect(findMRIcon()).not.toBeNull(); + }); + + describe('when user cannot read merge requests', () => { + beforeEach(done => { + store.state.projects[TEST_PROJECT_ID].userPermissions = {}; + + vm.$nextTick() + .then(done) + .catch(done.fail); + }); + + it('does not render merge requests', () => { + expect(findMRIcon()).toBeNull(); + }); + }); }); diff --git a/spec/javascripts/ide/stores/actions/merge_request_spec.js b/spec/javascripts/ide/stores/actions/merge_request_spec.js index 498e5142f0c..4917984cd42 100644 --- a/spec/javascripts/ide/stores/actions/merge_request_spec.js +++ b/spec/javascripts/ide/stores/actions/merge_request_spec.js @@ -8,7 +8,7 @@ import actions, { openMergeRequest, } from '~/ide/stores/actions/merge_request'; import service from '~/ide/services'; -import { activityBarViews } from '~/ide/constants'; +import { activityBarViews, PERMISSION_READ_MR } from '~/ide/constants'; import { resetStore } from '../../helpers'; const TEST_PROJECT = 'abcproject'; @@ -23,6 +23,9 @@ describe('IDE store merge request actions', () => { store.state.projects[TEST_PROJECT] = { id: TEST_PROJECT_ID, mergeRequests: {}, + userPermissions: { + [PERMISSION_READ_MR]: true, + }, }; }); @@ -79,6 +82,19 @@ describe('IDE store merge request actions', () => { }) .catch(done.fail); }); + + it('does nothing if user cannot read MRs', done => { + store.state.projects[TEST_PROJECT].userPermissions[PERMISSION_READ_MR] = false; + + store + .dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'bar' }) + .then(() => { + expect(service.getProjectMergeRequests).not.toHaveBeenCalled(); + expect(store.state.currentMergeRequestId).toBe(''); + }) + .then(done) + .catch(done.fail); + }); }); describe('no merge requests for branch available case', () => { diff --git a/spec/javascripts/ide/stores/modules/commit/actions_spec.js b/spec/javascripts/ide/stores/modules/commit/actions_spec.js index 056822bcfe5..fb8cb300209 100644 --- a/spec/javascripts/ide/stores/modules/commit/actions_spec.js +++ b/spec/javascripts/ide/stores/modules/commit/actions_spec.js @@ -7,7 +7,7 @@ import eventHub from '~/ide/eventhub'; import consts from '~/ide/stores/modules/commit/constants'; import * as mutationTypes from '~/ide/stores/modules/commit/mutation_types'; import * as actions from '~/ide/stores/modules/commit/actions'; -import { commitActionTypes } from '~/ide/constants'; +import { commitActionTypes, PERMISSION_CREATE_MR } from '~/ide/constants'; import testAction from '../../../../helpers/vuex_action_helper'; const TEST_COMMIT_SHA = '123456789'; @@ -313,6 +313,9 @@ describe('IDE commit module actions', () => { }, }, }, + userPermissions: { + [PERMISSION_CREATE_MR]: true, + }, }, }, }); |