Commit 99df09ab authored by Natalia Tepluhina's avatar Natalia Tepluhina

Merge branch '229847-blobs-query' into 'master'

Make sure files in multi-file snippets show correct content

See merge request gitlab-org/gitlab!37824
parents 4598b27b caf35636
...@@ -50,9 +50,7 @@ export default { ...@@ -50,9 +50,7 @@ export default {
data-qa-selector="clone_button" data-qa-selector="clone_button"
/> />
</div> </div>
<div v-for="blob in blobs" :key="blob.path"> <snippet-blob v-for="blob in blobs" :key="blob.path" :snippet="snippet" :blob="blob" />
<snippet-blob :snippet="snippet" :blob="blob" />
</div>
</template> </template>
</div> </div>
</template> </template>
...@@ -25,8 +25,9 @@ export default { ...@@ -25,8 +25,9 @@ export default {
rich: this.activeViewerType === RICH_BLOB_VIEWER, rich: this.activeViewerType === RICH_BLOB_VIEWER,
}; };
}, },
update: data => update(data) {
data.snippets.edges[0].node.blob.richData || data.snippets.edges[0].node.blob.plainData, return this.onContentUpdate(data);
},
result() { result() {
if (this.activeViewerType === RICH_BLOB_VIEWER) { if (this.activeViewerType === RICH_BLOB_VIEWER) {
this.blob.richViewer.renderError = null; this.blob.richViewer.renderError = null;
...@@ -76,6 +77,12 @@ export default { ...@@ -76,6 +77,12 @@ export default {
this.$apollo.queries.blobContent.skip = false; this.$apollo.queries.blobContent.skip = false;
this.$apollo.queries.blobContent.refetch(); this.$apollo.queries.blobContent.refetch();
}, },
onContentUpdate(data) {
const { path: blobPath } = this.blob;
const { blobs } = data.snippets.edges[0].node;
const updatedBlobData = blobs.find(blob => blob.path === blobPath);
return updatedBlobData.richData || updatedBlobData.plainData;
},
}, },
BLOB_RENDER_EVENT_LOAD, BLOB_RENDER_EVENT_LOAD,
BLOB_RENDER_EVENT_SHOW_SOURCE, BLOB_RENDER_EVENT_SHOW_SOURCE,
......
...@@ -3,7 +3,8 @@ query SnippetBlobContent($ids: [ID!], $rich: Boolean!) { ...@@ -3,7 +3,8 @@ query SnippetBlobContent($ids: [ID!], $rich: Boolean!) {
edges { edges {
node { node {
id id
blob { blobs {
path
richData @include(if: $rich) richData @include(if: $rich)
plainData @skip(if: $rich) plainData @skip(if: $rich)
} }
......
...@@ -32,6 +32,10 @@ ...@@ -32,6 +32,10 @@
.snippet-file-content { .snippet-file-content {
border-radius: 3px; border-radius: 3px;
+ .snippet-file-content {
@include gl-mt-5;
}
} }
.snippet-header { .snippet-header {
......
...@@ -47,10 +47,12 @@ export const BinaryBlob = { ...@@ -47,10 +47,12 @@ export const BinaryBlob = {
}; };
export const RichBlobContentMock = { export const RichBlobContentMock = {
path: 'foo.md',
richData: '<h1>Rich</h1>', richData: '<h1>Rich</h1>',
}; };
export const SimpleBlobContentMock = { export const SimpleBlobContentMock = {
path: 'foo.js',
plainData: 'Plain', plainData: 'Plain',
}; };
......
import { nextTick } from 'vue';
import { mount } from '@vue/test-utils'; import { mount } from '@vue/test-utils';
import SnippetBlobView from '~/snippets/components/snippet_blob_view.vue'; import SnippetBlobView from '~/snippets/components/snippet_blob_view.vue';
import BlobHeader from '~/blob/components/blob_header.vue'; import BlobHeader from '~/blob/components/blob_header.vue';
...@@ -10,7 +11,13 @@ import { ...@@ -10,7 +11,13 @@ import {
import { RichViewer, SimpleViewer } from '~/vue_shared/components/blob_viewers'; import { RichViewer, SimpleViewer } from '~/vue_shared/components/blob_viewers';
import { SNIPPET_VISIBILITY_PUBLIC } from '~/snippets/constants'; import { SNIPPET_VISIBILITY_PUBLIC } from '~/snippets/constants';
import { Blob as BlobMock, SimpleViewerMock, RichViewerMock } from 'jest/blob/components/mock_data'; import {
Blob as BlobMock,
SimpleViewerMock,
RichViewerMock,
RichBlobContentMock,
SimpleBlobContentMock,
} from 'jest/blob/components/mock_data';
describe('Blob Embeddable', () => { describe('Blob Embeddable', () => {
let wrapper; let wrapper;
...@@ -111,6 +118,59 @@ describe('Blob Embeddable', () => { ...@@ -111,6 +118,59 @@ describe('Blob Embeddable', () => {
expect(wrapper.find(BlobHeader).props('hasRenderError')).toBe(true); expect(wrapper.find(BlobHeader).props('hasRenderError')).toBe(true);
}); });
describe('bob content in multi-file scenario', () => {
const SimpleBlobContentMock2 = {
...SimpleBlobContentMock,
plainData: 'Another Plain Foo',
};
const RichBlobContentMock2 = {
...SimpleBlobContentMock,
richData: 'Another Rich Foo',
};
it.each`
snippetBlobs | description | currentBlob | expectedContent
${[SimpleBlobContentMock]} | ${'one existing textual blob'} | ${SimpleBlobContentMock} | ${SimpleBlobContentMock.plainData}
${[RichBlobContentMock]} | ${'one existing rich blob'} | ${RichBlobContentMock} | ${RichBlobContentMock.richData}
${[SimpleBlobContentMock, RichBlobContentMock]} | ${'mixed blobs with current textual blob'} | ${SimpleBlobContentMock} | ${SimpleBlobContentMock.plainData}
${[SimpleBlobContentMock, RichBlobContentMock]} | ${'mixed blobs with current rich blob'} | ${RichBlobContentMock} | ${RichBlobContentMock.richData}
${[SimpleBlobContentMock, SimpleBlobContentMock2]} | ${'textual blobs with current textual blob'} | ${SimpleBlobContentMock} | ${SimpleBlobContentMock.plainData}
${[RichBlobContentMock, RichBlobContentMock2]} | ${'rich blobs with current rich blob'} | ${RichBlobContentMock} | ${RichBlobContentMock.richData}
`(
'renders correct content for $description',
async ({ snippetBlobs, currentBlob, expectedContent }) => {
const apolloData = {
snippets: {
edges: [
{
node: {
blobs: snippetBlobs,
},
},
],
},
};
createComponent({
blob: {
...BlobMock,
path: currentBlob.path,
},
});
// mimic apollo's update
wrapper.setData({
blobContent: wrapper.vm.onContentUpdate(apolloData),
});
await nextTick();
const findContent = () => wrapper.find(BlobContent);
expect(findContent().props('content')).toBe(expectedContent);
},
);
});
describe('URLS with hash', () => { describe('URLS with hash', () => {
beforeEach(() => { beforeEach(() => {
window.location.hash = '#LC2'; window.location.hash = '#LC2';
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment