summaryrefslogtreecommitdiff
path: root/spec/frontend/repository/components/blob_content_viewer_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/repository/components/blob_content_viewer_spec.js')
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js124
1 files changed, 112 insertions, 12 deletions
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index a83d0a607f2..d462995328b 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -20,6 +20,8 @@ import blobInfoQuery from '~/repository/queries/blob_info.query.graphql';
jest.mock('~/repository/components/blob_viewers');
let wrapper;
+let mockResolver;
+
const simpleMockData = {
name: 'some_file.js',
size: 123,
@@ -37,9 +39,6 @@ const simpleMockData = {
externalStorageUrl: 'some_file.js',
replacePath: 'some_file.js/replace',
deletePath: 'some_file.js/delete',
- canLock: true,
- isLocked: false,
- lockLink: 'some_file.js/lock',
forkPath: 'some_file.js/fork',
simpleViewer: {
fileType: 'text',
@@ -62,6 +61,7 @@ const richMockData = {
const projectMockData = {
userPermissions: {
pushCode: true,
+ downloadCode: true,
},
repository: {
empty: false,
@@ -71,17 +71,28 @@ const projectMockData = {
const localVue = createLocalVue();
const mockAxios = new MockAdapter(axios);
-const createComponentWithApollo = (mockData = {}) => {
+const createComponentWithApollo = (mockData = {}, inject = {}) => {
localVue.use(VueApollo);
const defaultPushCode = projectMockData.userPermissions.pushCode;
+ const defaultDownloadCode = projectMockData.userPermissions.downloadCode;
const defaultEmptyRepo = projectMockData.repository.empty;
- const { blobs, emptyRepo = defaultEmptyRepo, canPushCode = defaultPushCode } = mockData;
-
- const mockResolver = jest.fn().mockResolvedValue({
+ const {
+ blobs,
+ emptyRepo = defaultEmptyRepo,
+ canPushCode = defaultPushCode,
+ canDownloadCode = defaultDownloadCode,
+ pathLocks = [],
+ } = mockData;
+
+ mockResolver = jest.fn().mockResolvedValue({
data: {
project: {
- userPermissions: { pushCode: canPushCode },
+ id: '1234',
+ userPermissions: { pushCode: canPushCode, downloadCode: canDownloadCode },
+ pathLocks: {
+ nodes: pathLocks,
+ },
repository: {
empty: emptyRepo,
blobs: {
@@ -101,6 +112,14 @@ const createComponentWithApollo = (mockData = {}) => {
path: 'some_file.js',
projectPath: 'some/path',
},
+ mixins: [
+ {
+ data: () => ({ ref: 'default-ref' }),
+ },
+ ],
+ provide: {
+ ...inject,
+ },
});
};
@@ -119,6 +138,7 @@ const createFactory = (mountFn) => (
queries: {
project: {
loading,
+ refetch: jest.fn(),
},
},
},
@@ -298,6 +318,7 @@ describe('Blob content viewer component', () => {
expect(findBlobEdit().props()).toMatchObject({
editPath: editBlobPath,
webIdePath: ideEditPath,
+ showEditButton: true,
});
});
@@ -315,10 +336,11 @@ describe('Blob content viewer component', () => {
expect(findBlobEdit().props()).toMatchObject({
editPath: editBlobPath,
webIdePath: ideEditPath,
+ showEditButton: true,
});
});
- it('does not render BlobHeaderEdit button when viewing a binary file', async () => {
+ it('renders BlobHeaderEdit button for binary files', async () => {
fullFactory({
mockData: { blobInfo: richMockData, isBinary: true },
stubs: {
@@ -329,13 +351,36 @@ describe('Blob content viewer component', () => {
await nextTick();
- expect(findBlobEdit().exists()).toBe(false);
+ expect(findBlobEdit().props()).toMatchObject({
+ editPath: editBlobPath,
+ webIdePath: ideEditPath,
+ showEditButton: false,
+ });
+ });
+
+ describe('blob header binary file', () => {
+ it.each([richMockData, { simpleViewer: { fileType: 'download' } }])(
+ 'passes the correct isBinary value when viewing a binary file',
+ async (blobInfo) => {
+ fullFactory({
+ mockData: {
+ blobInfo,
+ isBinary: true,
+ },
+ stubs: { BlobContent: true, BlobReplace: true },
+ });
+
+ await nextTick();
+
+ expect(findBlobHeader().props('isBinary')).toBe(true);
+ },
+ );
});
describe('BlobButtonGroup', () => {
const { name, path, replacePath, webPath } = simpleMockData;
const {
- userPermissions: { pushCode },
+ userPermissions: { pushCode, downloadCode },
repository: { empty },
} = projectMockData;
@@ -345,7 +390,7 @@ describe('Blob content viewer component', () => {
fullFactory({
mockData: {
blobInfo: simpleMockData,
- project: { userPermissions: { pushCode }, repository: { empty } },
+ project: { userPermissions: { pushCode, downloadCode }, repository: { empty } },
},
stubs: {
BlobContent: true,
@@ -361,10 +406,37 @@ describe('Blob content viewer component', () => {
replacePath,
deletePath: webPath,
canPushCode: pushCode,
+ canLock: true,
+ isLocked: false,
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 }) => {
+ fullFactory({
+ mockData: {
+ blobInfo: simpleMockData,
+ project: {
+ userPermissions: { pushCode: canPushCode, downloadCode: canDownloadCode },
+ repository: { empty },
+ },
+ },
+ stubs: {
+ BlobContent: true,
+ BlobButtonGroup: true,
+ },
+ });
+
+ await nextTick();
+
+ expect(findBlobButtonGroup().props('canLock')).toBe(canLock);
+ });
+
it('does not render if not logged in', async () => {
window.gon.current_user_id = null;
@@ -382,4 +454,32 @@ describe('Blob content viewer component', () => {
});
});
});
+
+ describe('blob info query', () => {
+ it('is called with originalBranch value if the prop has a value', async () => {
+ const inject = { originalBranch: 'some-branch' };
+ createComponentWithApollo({ blobs: simpleMockData }, inject);
+
+ await waitForPromises();
+
+ expect(mockResolver).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ref: 'some-branch',
+ }),
+ );
+ });
+
+ it('is called with ref value if the originalBranch prop has no value', async () => {
+ const inject = { originalBranch: null };
+ createComponentWithApollo({ blobs: simpleMockData }, inject);
+
+ await waitForPromises();
+
+ expect(mockResolver).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ref: 'default-ref',
+ }),
+ );
+ });
+ });
});