diff --git a/app/assets/javascripts/repository/components/blob_content_viewer.vue b/app/assets/javascripts/repository/components/blob_content_viewer.vue index ba5024588a84e4169c2178620e4fd4786a8a3210..462cf77a2783de81c50b8cf62320e5f86c6e7e30 100644 --- a/app/assets/javascripts/repository/components/blob_content_viewer.vue +++ b/app/assets/javascripts/repository/components/blob_content_viewer.vue @@ -65,6 +65,9 @@ export default { isLoadingLegacyViewer: false, activeViewerType: SIMPLE_BLOB_VIEWER, project: { + userPermissions: { + pushCode: false, + }, repository: { blobs: { nodes: [ @@ -86,7 +89,6 @@ export default { canLock: false, isLocked: false, lockLink: '', - canModifyBlob: true, forkPath: '', simpleViewer: {}, richViewer: null, @@ -168,7 +170,7 @@ export default { :path="path" :name="blobInfo.name" :replace-path="blobInfo.replacePath" - :can-push-code="blobInfo.canModifyBlob" + :can-push-code="project.userPermissions.pushCode" /> </template> </blob-header> diff --git a/app/assets/javascripts/repository/queries/blob_info.query.graphql b/app/assets/javascripts/repository/queries/blob_info.query.graphql index bfd9447d2601e653420d2c1aeb2b7fbe0fca6833..1889f2269f593844f2abc6ea9fa0653c6b4582eb 100644 --- a/app/assets/javascripts/repository/queries/blob_info.query.graphql +++ b/app/assets/javascripts/repository/queries/blob_info.query.graphql @@ -1,5 +1,8 @@ query getBlobInfo($projectPath: ID!, $filePath: String!) { project(fullPath: $projectPath) { + userPermissions { + pushCode + } repository { blobs(paths: [$filePath]) { nodes { @@ -15,7 +18,6 @@ query getBlobInfo($projectPath: ID!, $filePath: String!) { storedExternally rawPath replacePath - canModifyBlob simpleViewer { fileType tooLarge diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js index 575a53ffd2b3c9561323a72f975f136fe3b981d3..1c224a1430ebbbdad2d7039aa65a3e1a5638624c 100644 --- a/spec/frontend/repository/components/blob_content_viewer_spec.js +++ b/spec/frontend/repository/components/blob_content_viewer_spec.js @@ -37,7 +37,6 @@ const simpleMockData = { canLock: true, isLocked: false, lockLink: 'some_file.js/lock', - canModifyBlob: true, forkPath: 'some_file.js/fork', simpleViewer: { fileType: 'text', @@ -56,16 +55,26 @@ const richMockData = { renderError: null, }, }; +const userPermissionsMockData = { + userPermissions: { + pushCode: true, + }, +}; const localVue = createLocalVue(); const mockAxios = new MockAdapter(axios); -const createComponentWithApollo = (mockData) => { +const createComponentWithApollo = (mockData, mockPermissionData = true) => { localVue.use(VueApollo); - const mockResolver = jest - .fn() - .mockResolvedValue({ data: { project: { repository: { blobs: { nodes: [mockData] } } } } }); + const mockResolver = jest.fn().mockResolvedValue({ + data: { + project: { + userPermissions: { pushCode: mockPermissionData }, + repository: { blobs: { nodes: [mockData] } }, + }, + }, + }); const fakeApollo = createMockApollo([[blobInfoQuery, mockResolver]]); @@ -276,13 +285,16 @@ describe('Blob content viewer component', () => { }); describe('BlobButtonGroup', () => { - const { name, path } = simpleMockData; + const { name, path, replacePath } = simpleMockData; + const { + userPermissions: { pushCode }, + } = userPermissionsMockData; it('renders component', async () => { window.gon.current_user_id = 1; fullFactory({ - mockData: { blobInfo: simpleMockData }, + mockData: { blobInfo: simpleMockData, project: userPermissionsMockData }, stubs: { BlobContent: true, BlobButtonGroup: true, @@ -294,6 +306,8 @@ describe('Blob content viewer component', () => { expect(findBlobButtonGroup().props()).toMatchObject({ name, path, + replacePath, + canPushCode: pushCode, }); });