summaryrefslogtreecommitdiff
path: root/spec/frontend/repository
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/repository')
-rw-r--r--spec/frontend/repository/commits_service_spec.js7
-rw-r--r--spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap6
-rw-r--r--spec/frontend/repository/components/blob_button_group_spec.js1
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js50
-rw-r--r--spec/frontend/repository/components/blob_viewers/pdf_viewer_spec.js59
-rw-r--r--spec/frontend/repository/components/blob_viewers/text_viewer_spec.js30
-rw-r--r--spec/frontend/repository/components/delete_blob_modal_spec.js26
-rw-r--r--spec/frontend/repository/components/table/row_spec.js25
-rw-r--r--spec/frontend/repository/components/tree_content_spec.js28
-rw-r--r--spec/frontend/repository/components/upload_blob_modal_spec.js4
-rw-r--r--spec/frontend/repository/mock_data.js10
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,