diff options
Diffstat (limited to 'spec/frontend/notes/components/comment_form_spec.js')
-rw-r--r-- | spec/frontend/notes/components/comment_form_spec.js | 143 |
1 files changed, 116 insertions, 27 deletions
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js index 002c4f206cb..2f58f75ab70 100644 --- a/spec/frontend/notes/components/comment_form_spec.js +++ b/spec/frontend/notes/components/comment_form_spec.js @@ -1,15 +1,15 @@ -import { nextTick } from 'vue'; import { mount, shallowMount } from '@vue/test-utils'; -import MockAdapter from 'axios-mock-adapter'; import Autosize from 'autosize'; +import MockAdapter from 'axios-mock-adapter'; +import { nextTick } from 'vue'; +import { extendedWrapper } from 'helpers/vue_test_utils_helper'; +import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests'; import { deprecatedCreateFlash as flash } from '~/flash'; import axios from '~/lib/utils/axios_utils'; -import createStore from '~/notes/stores'; import CommentForm from '~/notes/components/comment_form.vue'; import * as constants from '~/notes/constants'; import eventHub from '~/notes/event_hub'; -import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests'; -import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue'; +import createStore from '~/notes/stores'; import { loggedOutnoteableData, notesDataMock, userDataMock, noteableDataMock } from '../mock_data'; jest.mock('autosize'); @@ -22,11 +22,25 @@ describe('issue_comment_form component', () => { let wrapper; let axiosMock; - const findCloseReopenButton = () => wrapper.find('[data-testid="close-reopen-button"]'); + const findCloseReopenButton = () => wrapper.findByTestId('close-reopen-button'); + const findCommentButton = () => wrapper.findByTestId('comment-button'); + const findTextArea = () => wrapper.findByTestId('comment-field'); + const findConfidentialNoteCheckbox = () => wrapper.findByTestId('confidential-note-checkbox'); - const findCommentButton = () => wrapper.find('[data-testid="comment-button"]'); + const createNotableDataMock = (data = {}) => { + return { + ...noteableDataMock, + ...data, + }; + }; - const findTextArea = () => wrapper.find('[data-testid="comment-field"]'); + const notableDataMockCanUpdateIssuable = createNotableDataMock({ + current_user: { can_update: true, can_create_note: true }, + }); + + const notableDataMockCannotUpdateIssuable = createNotableDataMock({ + current_user: { can_update: false, can_create_note: true }, + }); const mountComponent = ({ initialData = {}, @@ -34,23 +48,29 @@ describe('issue_comment_form component', () => { noteableData = noteableDataMock, notesData = notesDataMock, userData = userDataMock, + features = {}, mountFunction = shallowMount, } = {}) => { store.dispatch('setNoteableData', noteableData); store.dispatch('setNotesData', notesData); store.dispatch('setUserData', userData); - wrapper = mountFunction(CommentForm, { - propsData: { - noteableType, - }, - data() { - return { - ...initialData, - }; - }, - store, - }); + wrapper = extendedWrapper( + mountFunction(CommentForm, { + propsData: { + noteableType, + }, + data() { + return { + ...initialData, + }; + }, + store, + provide: { + glFeatures: features, + }, + }), + ); }; beforeEach(() => { @@ -64,14 +84,6 @@ describe('issue_comment_form component', () => { }); describe('user is logged in', () => { - describe('avatar', () => { - it('should render user avatar with link', () => { - mountComponent({ mountFunction: mount }); - - expect(wrapper.find(UserAvatarLink).attributes('href')).toBe(userDataMock.path); - }); - }); - describe('handleSave', () => { it('should request to save note when note is entered', () => { mountComponent({ mountFunction: mount, initialData: { note: 'hello world' } }); @@ -368,6 +380,83 @@ describe('issue_comment_form component', () => { }); }); }); + + describe('confidential notes checkbox', () => { + describe('when confidentialNotes feature flag is `false`', () => { + const features = { confidentialNotes: false }; + + it('should not render checkbox', () => { + mountComponent({ + mountFunction: mount, + initialData: { note: 'confidential note' }, + noteableData: { ...notableDataMockCanUpdateIssuable }, + features, + }); + + const checkbox = findConfidentialNoteCheckbox(); + expect(checkbox.exists()).toBe(false); + }); + }); + + describe('when confidentialNotes feature flag is `true`', () => { + const features = { confidentialNotes: true }; + + it('should render checkbox as unchecked by default', () => { + mountComponent({ + mountFunction: mount, + initialData: { note: 'confidential note' }, + noteableData: { ...notableDataMockCanUpdateIssuable }, + features, + }); + + const checkbox = findConfidentialNoteCheckbox(); + expect(checkbox.exists()).toBe(true); + expect(checkbox.element.checked).toBe(false); + }); + + describe.each` + shouldCheckboxBeChecked + ${true} + ${false} + `('when checkbox value is `$shouldCheckboxBeChecked`', ({ shouldCheckboxBeChecked }) => { + it(`sets \`confidential\` to \`${shouldCheckboxBeChecked}\``, async () => { + mountComponent({ + mountFunction: mount, + initialData: { note: 'confidential note' }, + noteableData: { ...notableDataMockCanUpdateIssuable }, + features, + }); + + jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue({}); + + const checkbox = findConfidentialNoteCheckbox(); + + // check checkbox + checkbox.element.checked = shouldCheckboxBeChecked; + checkbox.trigger('change'); + await wrapper.vm.$nextTick(); + + // submit comment + wrapper.findByTestId('comment-button').trigger('click'); + + const [providedData] = wrapper.vm.saveNote.mock.calls[0]; + expect(providedData.data.note.confidential).toBe(shouldCheckboxBeChecked); + }); + }); + + describe('when user cannot update issuable', () => { + it('should not render checkbox', () => { + mountComponent({ + mountFunction: mount, + noteableData: { ...notableDataMockCannotUpdateIssuable }, + features, + }); + + expect(findConfidentialNoteCheckbox().exists()).toBe(false); + }); + }); + }); + }); }); describe('user is not logged in', () => { |