diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-12-20 16:37:47 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-12-20 16:37:47 +0300 |
commit | aee0a117a889461ce8ced6fcf73207fe017f1d99 (patch) | |
tree | 891d9ef189227a8445d83f35c1b0fc99573f4380 /spec/frontend/repository | |
parent | 8d46af3258650d305f53b819eabf7ab18d22f59e (diff) |
Add latest changes from gitlab-org/gitlab@14-6-stable-eev14.6.0-rc42
Diffstat (limited to 'spec/frontend/repository')
11 files changed, 157 insertions, 89 deletions
diff --git a/spec/frontend/repository/commits_service_spec.js b/spec/frontend/repository/commits_service_spec.js index d924974aede..697fa7c4fd1 100644 --- a/spec/frontend/repository/commits_service_spec.js +++ b/spec/frontend/repository/commits_service_spec.js @@ -52,13 +52,6 @@ describe('commits service', () => { expect(axios.get.mock.calls.length).toEqual(1); }); - it('calls axios get twice if an offset is larger than 25', async () => { - await requestCommits(100); - - expect(axios.get.mock.calls[0][1]).toEqual({ params: { format: 'json', offset: 75 } }); - expect(axios.get.mock.calls[1][1]).toEqual({ params: { format: 'json', offset: 100 } }); - }); - it('updates the list of requested offsets', async () => { await requestCommits(200); diff --git a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap index be4f8a688e0..7854325e4ed 100644 --- a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap +++ b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap @@ -2,7 +2,7 @@ exports[`Repository last commit component renders commit widget 1`] = ` <div - class="info-well d-none d-sm-flex project-last-commit commit p-3" + class="well-segment commit gl-p-5 gl-w-full" > <user-avatar-link-stub class="avatar-cell" @@ -99,6 +99,7 @@ exports[`Repository last commit component renders commit widget 1`] = ` text="123456789" title="Copy commit SHA" tooltipplacement="top" + variant="default" /> </gl-button-group-stub> </div> @@ -108,7 +109,7 @@ exports[`Repository last commit component renders commit widget 1`] = ` exports[`Repository last commit component renders the signature HTML as returned by the backend 1`] = ` <div - class="info-well d-none d-sm-flex project-last-commit commit p-3" + class="well-segment commit gl-p-5 gl-w-full" > <user-avatar-link-stub class="avatar-cell" @@ -209,6 +210,7 @@ exports[`Repository last commit component renders the signature HTML as returned text="123456789" title="Copy commit SHA" tooltipplacement="top" + variant="default" /> </gl-button-group-stub> </div> diff --git a/spec/frontend/repository/components/blob_button_group_spec.js b/spec/frontend/repository/components/blob_button_group_spec.js index f2a3354f204..9f9d574a8ed 100644 --- a/spec/frontend/repository/components/blob_button_group_spec.js +++ b/spec/frontend/repository/components/blob_button_group_spec.js @@ -9,6 +9,7 @@ const DEFAULT_PROPS = { name: 'some name', path: 'some/path', canPushCode: true, + canPushToBranch: true, replacePath: 'some/replace/path', deletePath: 'some/delete/path', emptyRepo: false, diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js index d40e97bf5a3..9e00a2d0408 100644 --- a/spec/frontend/repository/components/blob_content_viewer_spec.js +++ b/spec/frontend/repository/components/blob_content_viewer_spec.js @@ -15,7 +15,7 @@ import ForkSuggestion from '~/repository/components/fork_suggestion.vue'; import { loadViewer, viewerProps } from '~/repository/components/blob_viewers'; import DownloadViewer from '~/repository/components/blob_viewers/download_viewer.vue'; import EmptyViewer from '~/repository/components/blob_viewers/empty_viewer.vue'; -import TextViewer from '~/repository/components/blob_viewers/text_viewer.vue'; +import SourceViewer from '~/vue_shared/components/source_viewer.vue'; import blobInfoQuery from '~/repository/queries/blob_info.query.graphql'; import { redirectTo } from '~/lib/utils/url_utility'; import { isLoggedIn } from '~/lib/utils/common_utils'; @@ -98,7 +98,7 @@ describe('Blob content viewer component', () => { const findForkSuggestion = () => wrapper.findComponent(ForkSuggestion); beforeEach(() => { - gon.features = { refactorTextViewer: true }; + gon.features = { highlightJs: true }; isLoggedIn.mockReturnValue(true); }); @@ -215,7 +215,7 @@ describe('Blob content viewer component', () => { viewer | loadViewerReturnValue | viewerPropsReturnValue ${'empty'} | ${EmptyViewer} | ${{}} ${'download'} | ${DownloadViewer} | ${{ filePath: '/some/file/path', fileName: 'test.js', fileSize: 100 }} - ${'text'} | ${TextViewer} | ${{ content: 'test', fileName: 'test.js', readOnly: true }} + ${'text'} | ${SourceViewer} | ${{ content: 'test', autoDetect: true }} `( 'renders viewer component for $viewer files', async ({ viewer, loadViewerReturnValue, viewerPropsReturnValue }) => { @@ -318,8 +318,14 @@ describe('Blob content viewer component', () => { repository: { empty }, } = projectMock; + afterEach(() => { + delete gon.current_user_id; + delete gon.current_username; + }); + it('renders component', async () => { window.gon.current_user_id = 1; + window.gon.current_username = 'root'; await createComponent({ pushCode, downloadCode, empty }, mount); @@ -330,28 +336,34 @@ describe('Blob content viewer component', () => { deletePath: webPath, canPushCode: pushCode, canLock: true, - isLocked: false, + isLocked: true, emptyRepo: empty, }); }); it.each` - canPushCode | canDownloadCode | canLock - ${true} | ${true} | ${true} - ${false} | ${true} | ${false} - ${true} | ${false} | ${false} - `('passes the correct lock states', async ({ canPushCode, canDownloadCode, canLock }) => { - await createComponent( - { - pushCode: canPushCode, - downloadCode: canDownloadCode, - empty, - }, - mount, - ); + canPushCode | canDownloadCode | username | canLock + ${true} | ${true} | ${'root'} | ${true} + ${false} | ${true} | ${'root'} | ${false} + ${true} | ${false} | ${'root'} | ${false} + ${true} | ${true} | ${'peter'} | ${false} + `( + 'passes the correct lock states', + async ({ canPushCode, canDownloadCode, username, canLock }) => { + gon.current_username = username; + + await createComponent( + { + pushCode: canPushCode, + downloadCode: canDownloadCode, + empty, + }, + mount, + ); - expect(findBlobButtonGroup().props('canLock')).toBe(canLock); - }); + expect(findBlobButtonGroup().props('canLock')).toBe(canLock); + }, + ); it('does not render if not logged in', async () => { isLoggedIn.mockReturnValueOnce(false); diff --git a/spec/frontend/repository/components/blob_viewers/pdf_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/pdf_viewer_spec.js new file mode 100644 index 00000000000..fd910002529 --- /dev/null +++ b/spec/frontend/repository/components/blob_viewers/pdf_viewer_spec.js @@ -0,0 +1,59 @@ +import { GlButton } from '@gitlab/ui'; +import Component from '~/repository/components/blob_viewers/pdf_viewer.vue'; +import PdfViewer from '~/blob/pdf/pdf_viewer.vue'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; + +describe('PDF Viewer', () => { + let wrapper; + + const defaultPropsData = { url: 'some/pdf_blob.pdf' }; + + const createComponent = (fileSize = 999) => { + wrapper = shallowMountExtended(Component, { propsData: { ...defaultPropsData, fileSize } }); + }; + + const findPDFViewer = () => wrapper.findComponent(PdfViewer); + const findHelpText = () => wrapper.find('p'); + const findDownLoadButton = () => wrapper.findComponent(GlButton); + + it('renders a PDF Viewer component', () => { + createComponent(); + + expect(findPDFViewer().exists()).toBe(true); + expect(findPDFViewer().props('pdf')).toBe(defaultPropsData.url); + }); + + describe('Too large', () => { + beforeEach(() => createComponent(20000000)); + + it('does not a PDF Viewer component', () => { + expect(findPDFViewer().exists()).toBe(false); + }); + + it('renders help text', () => { + expect(findHelpText().text()).toBe( + 'This PDF is too large to display. Please download to view.', + ); + }); + + it('renders a download button', () => { + expect(findDownLoadButton().text()).toBe('Download PDF'); + expect(findDownLoadButton().props('icon')).toBe('download'); + }); + }); + + describe('Too many pages', () => { + beforeEach(() => { + createComponent(); + findPDFViewer().vm.$emit('pdflabload', 100); + }); + + it('does not a PDF Viewer component', () => { + expect(findPDFViewer().exists()).toBe(false); + }); + + it('renders a download button', () => { + expect(findDownLoadButton().exists()).toBe(true); + }); + }); +}); diff --git a/spec/frontend/repository/components/blob_viewers/text_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/text_viewer_spec.js deleted file mode 100644 index 88c5bee6564..00000000000 --- a/spec/frontend/repository/components/blob_viewers/text_viewer_spec.js +++ /dev/null @@ -1,30 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import waitForPromises from 'helpers/wait_for_promises'; -import TextViewer from '~/repository/components/blob_viewers/text_viewer.vue'; -import SourceEditor from '~/vue_shared/components/source_editor.vue'; - -describe('Text Viewer', () => { - let wrapper; - const propsData = { - content: 'Some content', - fileName: 'file_name.js', - readOnly: true, - }; - - const createComponent = () => { - wrapper = shallowMount(TextViewer, { propsData }); - }; - - const findEditor = () => wrapper.findComponent(SourceEditor); - - it('renders a Source Editor component', async () => { - createComponent(); - - await waitForPromises(); - - expect(findEditor().exists()).toBe(true); - expect(findEditor().props('value')).toBe(propsData.content); - expect(findEditor().props('fileName')).toBe(propsData.fileName); - expect(findEditor().props('editorOptions')).toEqual({ readOnly: propsData.readOnly }); - }); -}); diff --git a/spec/frontend/repository/components/delete_blob_modal_spec.js b/spec/frontend/repository/components/delete_blob_modal_spec.js index 2c62868f391..785783b2e75 100644 --- a/spec/frontend/repository/components/delete_blob_modal_spec.js +++ b/spec/frontend/repository/components/delete_blob_modal_spec.js @@ -13,6 +13,7 @@ const initialProps = { targetBranch: 'some-target-branch', originalBranch: 'main', canPushCode: true, + canPushToBranch: true, emptyRepo: false, }; @@ -103,22 +104,25 @@ describe('DeleteBlobModal', () => { ); it.each` - input | value | emptyRepo | canPushCode | exist - ${'authenticity_token'} | ${'mock-csrf-token'} | ${false} | ${true} | ${true} - ${'authenticity_token'} | ${'mock-csrf-token'} | ${true} | ${false} | ${true} - ${'_method'} | ${'delete'} | ${false} | ${true} | ${true} - ${'_method'} | ${'delete'} | ${true} | ${false} | ${true} - ${'original_branch'} | ${initialProps.originalBranch} | ${false} | ${true} | ${true} - ${'original_branch'} | ${undefined} | ${true} | ${true} | ${false} - ${'create_merge_request'} | ${'1'} | ${false} | ${false} | ${true} - ${'create_merge_request'} | ${'1'} | ${false} | ${true} | ${true} - ${'create_merge_request'} | ${undefined} | ${true} | ${false} | ${false} + input | value | emptyRepo | canPushCode | canPushToBranch | exist + ${'authenticity_token'} | ${'mock-csrf-token'} | ${false} | ${true} | ${true} | ${true} + ${'authenticity_token'} | ${'mock-csrf-token'} | ${true} | ${false} | ${true} | ${true} + ${'_method'} | ${'delete'} | ${false} | ${true} | ${true} | ${true} + ${'_method'} | ${'delete'} | ${true} | ${false} | ${true} | ${true} + ${'original_branch'} | ${initialProps.originalBranch} | ${false} | ${true} | ${true} | ${true} + ${'original_branch'} | ${undefined} | ${true} | ${true} | ${true} | ${false} + ${'create_merge_request'} | ${'1'} | ${false} | ${false} | ${true} | ${true} + ${'create_merge_request'} | ${'1'} | ${false} | ${true} | ${true} | ${true} + ${'create_merge_request'} | ${'1'} | ${false} | ${false} | ${false} | ${true} + ${'create_merge_request'} | ${'1'} | ${false} | ${false} | ${true} | ${true} + ${'create_merge_request'} | ${undefined} | ${true} | ${false} | ${true} | ${false} `( 'passes $input as a hidden input with the correct value', - ({ input, value, emptyRepo, canPushCode, exist }) => { + ({ input, value, emptyRepo, canPushCode, canPushToBranch, exist }) => { createComponent({ emptyRepo, canPushCode, + canPushToBranch, }); const inputMethod = findForm().find(`input[name="${input}"]`); diff --git a/spec/frontend/repository/components/table/row_spec.js b/spec/frontend/repository/components/table/row_spec.js index 76e9f7da011..7f59dbfe0d1 100644 --- a/spec/frontend/repository/components/table/row_spec.js +++ b/spec/frontend/repository/components/table/row_spec.js @@ -4,6 +4,7 @@ import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; import TableRow from '~/repository/components/table/row.vue'; import FileIcon from '~/vue_shared/components/file_icon.vue'; import { FILE_SYMLINK_MODE } from '~/vue_shared/constants'; +import { ROW_APPEAR_DELAY } from '~/repository/constants'; const COMMIT_MOCK = { lockLabel: 'Locked by Root', committedDate: '2019-01-01' }; @@ -17,12 +18,12 @@ function factory(propsData = {}) { vm = shallowMount(TableRow, { propsData: { + commitInfo: COMMIT_MOCK, ...propsData, name: propsData.path, projectPath: 'gitlab-org/gitlab-ce', url: `https://test.com`, totalEntries: 10, - commitInfo: COMMIT_MOCK, rowNumber: 123, }, directives: { @@ -251,6 +252,8 @@ describe('Repository table row component', () => { }); describe('row visibility', () => { + beforeAll(() => jest.useFakeTimers()); + beforeEach(() => { factory({ id: '1', @@ -258,18 +261,20 @@ describe('Repository table row component', () => { path: 'test', type: 'tree', currentPath: '/', + commitInfo: null, }); }); - it('emits a `row-appear` event', () => { + + afterAll(() => jest.useRealTimers()); + + it('emits a `row-appear` event', async () => { findIntersectionObserver().vm.$emit('appear'); - expect(vm.emitted('row-appear')).toEqual([ - [ - { - hasCommit: true, - rowNumber: 123, - }, - ], - ]); + + jest.runAllTimers(); + + expect(setTimeout).toHaveBeenCalledTimes(1); + expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), ROW_APPEAR_DELAY); + expect(vm.emitted('row-appear')).toEqual([[123]]); }); }); }); diff --git a/spec/frontend/repository/components/tree_content_spec.js b/spec/frontend/repository/components/tree_content_spec.js index 49397c77215..9c5d07eede3 100644 --- a/spec/frontend/repository/components/tree_content_spec.js +++ b/spec/frontend/repository/components/tree_content_spec.js @@ -2,7 +2,7 @@ import { shallowMount } from '@vue/test-utils'; import paginatedTreeQuery from 'shared_queries/repository/paginated_tree.query.graphql'; import FilePreview from '~/repository/components/preview/index.vue'; import FileTable from '~/repository/components/table/index.vue'; -import TreeContent from '~/repository/components/tree_content.vue'; +import TreeContent from 'jh_else_ce/repository/components/tree_content.vue'; import { loadCommits, isRequested, resetRequestedCommits } from '~/repository/commits_service'; jest.mock('~/repository/commits_service', () => ({ @@ -190,14 +190,28 @@ describe('Repository table component', () => { }); }); - it('loads commit data when row-appear event is emitted', () => { + describe('commit data', () => { const path = 'some/path'; - const rowNumber = 1; - factory(path); - findFileTable().vm.$emit('row-appear', { hasCommit: false, rowNumber }); + it('loads commit data for both top and bottom batches when row-appear event is emitted', () => { + const rowNumber = 50; - expect(isRequested).toHaveBeenCalledWith(rowNumber); - expect(loadCommits).toHaveBeenCalledWith('', path, '', rowNumber); + factory(path); + findFileTable().vm.$emit('row-appear', rowNumber); + + expect(isRequested).toHaveBeenCalledWith(rowNumber); + + expect(loadCommits.mock.calls).toEqual([ + ['', path, '', rowNumber], + ['', path, '', rowNumber - 25], + ]); + }); + + it('loads commit data once if rowNumber is zero', () => { + factory(path); + findFileTable().vm.$emit('row-appear', 0); + + expect(loadCommits.mock.calls).toEqual([['', path, '', 0]]); + }); }); }); diff --git a/spec/frontend/repository/components/upload_blob_modal_spec.js b/spec/frontend/repository/components/upload_blob_modal_spec.js index 36847107558..e9dfa3cd495 100644 --- a/spec/frontend/repository/components/upload_blob_modal_spec.js +++ b/spec/frontend/repository/components/upload_blob_modal_spec.js @@ -212,8 +212,8 @@ describe('UploadBlobModal', () => { createComponent(); }); - it('displays the default "Upload New File" modal title ', () => { - expect(findModal().props('title')).toBe('Upload New File'); + it('displays the default "Upload new file" modal title ', () => { + expect(findModal().props('title')).toBe('Upload new file'); }); it('display the defaul primary button text', () => { diff --git a/spec/frontend/repository/mock_data.js b/spec/frontend/repository/mock_data.js index adf5991ac3c..74d35daf578 100644 --- a/spec/frontend/repository/mock_data.js +++ b/spec/frontend/repository/mock_data.js @@ -1,4 +1,5 @@ export const simpleViewerMock = { + id: '1', name: 'some_file.js', size: 123, rawSize: 123, @@ -11,6 +12,7 @@ export const simpleViewerMock = { forkAndEditPath: 'some_file.js/fork/edit', ideForkAndEditPath: 'some_file.js/fork/ide', canModifyBlob: true, + canCurrentUserPushToBranch: true, storedExternally: false, rawPath: 'some_file.js', replacePath: 'some_file.js/replace', @@ -45,7 +47,13 @@ export const projectMock = { id: '1234', userPermissions: userPermissionsMock, pathLocks: { - nodes: [], + nodes: [ + { + id: 'test', + path: simpleViewerMock.path, + user: { id: '123', username: 'root' }, + }, + ], }, repository: { empty: false, |