Skip to content
Snippets Groups Projects
Commit 5c9c86a3 authored by Frédéric Caplette's avatar Frédéric Caplette :speech_balloon: Committed by Natalia Tepluhina
Browse files

Restructure client queries in Pipeline editor

parent 074698af
No related branches found
No related tags found
No related merge requests found
Showing
with 161 additions and 121 deletions
Loading
Loading
@@ -60,6 +60,9 @@ export default {
apollo: {
currentBranch: {
query: getCurrentBranch,
update(data) {
return data.workBranches.current.name;
},
},
},
computed: {
Loading
Loading
Loading
Loading
@@ -20,8 +20,8 @@ import {
} from '~/pipeline_editor/constants';
import updateCurrentBranchMutation from '~/pipeline_editor/graphql/mutations/client/update_current_branch.mutation.graphql';
import getAvailableBranchesQuery from '~/pipeline_editor/graphql/queries/available_branches.query.graphql';
import getCurrentBranchQuery from '~/pipeline_editor/graphql/queries/client/current_branch.query.graphql';
import getLastCommitBranchQuery from '~/pipeline_editor/graphql/queries/client/last_commit_branch.query.graphql';
import getCurrentBranch from '~/pipeline_editor/graphql/queries/client/current_branch.query.graphql';
import getLastCommitBranch from '~/pipeline_editor/graphql/queries/client/last_commit_branch.query.graphql';
 
export default {
i18n: {
Loading
Loading
@@ -61,8 +61,8 @@ export default {
},
data() {
return {
branchSelected: null,
availableBranches: [],
branchSelected: null,
filteredBranches: [],
isSearchingBranches: false,
pageLimit: this.paginationLimit,
Loading
Loading
@@ -93,15 +93,25 @@ export default {
},
},
currentBranch: {
query: getCurrentBranchQuery,
query: getCurrentBranch,
update(data) {
return data.workBranches.current.name;
},
},
lastCommitBranch: {
query: getLastCommitBranchQuery,
result({ data: { lastCommitBranch } }) {
if (lastCommitBranch === '' || this.availableBranches.includes(lastCommitBranch)) {
return;
query: getLastCommitBranch,
update(data) {
return data.workBranches.lastCommit.name;
},
result({ data }) {
if (data) {
const { name: lastCommitBranch } = data.workBranches.lastCommit;
if (lastCommitBranch === '' || this.availableBranches.includes(lastCommitBranch)) {
return;
}
this.availableBranches.unshift(lastCommitBranch);
}
this.availableBranches.unshift(lastCommitBranch);
},
},
},
Loading
Loading
@@ -109,12 +119,12 @@ export default {
branches() {
return this.searchTerm.length > 0 ? this.filteredBranches : this.availableBranches;
},
isBranchesLoading() {
return this.$apollo.queries.availableBranches.loading || this.isSearchingBranches;
},
enableBranchSwitcher() {
return this.branches.length > 0 || this.searchTerm.length > 0;
},
isBranchesLoading() {
return this.$apollo.queries.availableBranches.loading || this.isSearchingBranches;
},
},
watch: {
shouldLoadNewBranch(flag) {
Loading
Loading
Loading
Loading
@@ -48,6 +48,9 @@ export default {
apollo: {
pipelineEtag: {
query: getPipelineEtag,
update(data) {
return data.etags.pipeline;
},
},
pipeline: {
context() {
Loading
Loading
Loading
Loading
@@ -43,6 +43,9 @@ export default {
apollo: {
appStatus: {
query: getAppStatus,
update(data) {
return data.app.status;
},
},
},
computed: {
Loading
Loading
Loading
Loading
@@ -91,6 +91,9 @@ export default {
apollo: {
appStatus: {
query: getAppStatus,
update(data) {
return data.app.status;
},
},
},
computed: {
Loading
Loading
query getAppStatus {
appStatus @client
app @client {
status
}
}
query getCurrentBranch {
currentBranch @client
workBranches @client {
current {
name
}
}
}
query getLastCommitBranchQuery {
lastCommitBranch @client
workBranches @client {
lastCommit {
name
}
}
}
query getPipelineEtag {
pipelineEtag @client
etags @client {
pipeline
}
}
import axios from '~/lib/utils/axios_utils';
import getAppStatus from './queries/client/app_status.query.graphql';
import getCurrentBranchQuery from './queries/client/current_branch.query.graphql';
import getLastCommitBranchQuery from './queries/client/last_commit_branch.query.graphql';
import getCurrentBranch from './queries/client/current_branch.query.graphql';
import getLastCommitBranch from './queries/client/last_commit_branch.query.graphql';
import getPipelineEtag from './queries/client/pipeline_etag.query.graphql';
 
export const resolvers = {
Loading
Loading
@@ -35,25 +35,51 @@ export const resolvers = {
updateAppStatus: (_, { appStatus }, { cache }) => {
cache.writeQuery({
query: getAppStatus,
data: { appStatus },
data: {
app: {
__typename: 'PipelineEditorApp',
status: appStatus,
},
},
});
},
updateCurrentBranch: (_, { currentBranch }, { cache }) => {
cache.writeQuery({
query: getCurrentBranchQuery,
data: { currentBranch },
query: getCurrentBranch,
data: {
workBranches: {
__typename: 'BranchList',
current: {
__typename: 'WorkBranch',
name: currentBranch,
},
},
},
});
},
updateLastCommitBranch: (_, { lastCommitBranch }, { cache }) => {
cache.writeQuery({
query: getLastCommitBranchQuery,
data: { lastCommitBranch },
query: getLastCommitBranch,
data: {
workBranches: {
__typename: 'BranchList',
lastCommit: {
__typename: 'WorkBranch',
name: lastCommitBranch,
},
},
},
});
},
updatePipelineEtag: (_, { pipelineEtag }, { cache }) => {
cache.writeQuery({
query: getPipelineEtag,
data: { pipelineEtag },
data: {
etags: {
__typename: 'EtagValues',
pipeline: pipelineEtag,
},
},
});
},
},
Loading
Loading
type BlobContent {
rawData: String!
type PipelineEditorApp {
status: String!
}
type BranchList {
current: WorkBranch!
lastCommit: WorkBranch!
}
type EtagValues {
pipeline: String!
}
type WorkBranch {
name: String!
commit: String
}
 
extend type Query {
blobContent: BlobContent
app: PipelineEditorApp
etags: EtagValues
workBranches: BranchList
}
Loading
Loading
@@ -7,7 +7,7 @@ import { EDITOR_APP_STATUS_LOADING } from './constants';
import { CODE_SNIPPET_SOURCE_SETTINGS } from './components/code_snippet_alert/constants';
import getCurrentBranch from './graphql/queries/client/current_branch.query.graphql';
import getAppStatus from './graphql/queries/client/app_status.query.graphql';
import getLastCommitBranchQuery from './graphql/queries/client/last_commit_branch.query.graphql';
import getLastCommitBranch from './graphql/queries/client/last_commit_branch.query.graphql';
import getPipelineEtag from './graphql/queries/client/pipeline_etag.query.graphql';
import { resolvers } from './graphql/resolvers';
import typeDefs from './graphql/typedefs.graphql';
Loading
Loading
@@ -68,28 +68,46 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
cache.writeQuery({
query: getAppStatus,
data: {
appStatus: EDITOR_APP_STATUS_LOADING,
app: {
__typename: 'PipelineEditorApp',
status: EDITOR_APP_STATUS_LOADING,
},
},
});
 
cache.writeQuery({
query: getCurrentBranch,
data: {
currentBranch: initialBranchName || defaultBranch,
workBranches: {
__typename: 'BranchList',
current: {
__typename: 'WorkBranch',
name: initialBranchName || defaultBranch,
},
},
},
});
 
cache.writeQuery({
query: getPipelineEtag,
query: getLastCommitBranch,
data: {
pipelineEtag,
workBranches: {
__typename: 'BranchList',
lastCommit: {
__typename: 'WorkBranch',
name: '',
},
},
},
});
 
cache.writeQuery({
query: getLastCommitBranchQuery,
query: getPipelineEtag,
data: {
lastCommitBranch: '',
etags: {
__typename: 'EtagValues',
pipeline: pipelineEtag,
},
},
});
 
Loading
Loading
Loading
Loading
@@ -160,6 +160,9 @@ export default {
},
appStatus: {
query: getAppStatus,
update(data) {
return data.app.status;
},
},
commitSha: {
query: getLatestCommitShaQuery,
Loading
Loading
@@ -184,6 +187,9 @@ export default {
},
currentBranch: {
query: getCurrentBranch,
update(data) {
return data.workBranches.current.name;
},
},
starterTemplate: {
query: getTemplate,
Loading
Loading
Loading
Loading
@@ -51,6 +51,17 @@ def switch_to_branch(branch)
expect(page).not_to have_content(default_branch)
end
end
it 'displays new branch as selected after commiting on a new branch' do
find('#target-branch-field').set('new_branch', clear: :backspace)
click_button 'Commit changes'
page.within('[data-testid="branch-selector"]') do
expect(page).to have_content('new_branch')
expect(page).not_to have_content(default_branch)
end
end
end
 
context 'Editor content' do
Loading
Loading
Loading
Loading
@@ -22,7 +22,6 @@ import {
mockTotalBranches,
mockTotalBranchResults,
mockTotalSearchResults,
mockNewBranch,
} from '../../mock_data';
 
const localVue = createLocalVue();
Loading
Loading
@@ -32,18 +31,14 @@ describe('Pipeline editor branch switcher', () => {
let wrapper;
let mockApollo;
let mockAvailableBranchQuery;
let mockCurrentBranchQuery;
let mockLastCommitBranchQuery;
const createComponent = (
{ currentBranch, isQueryLoading, mountFn, options, props } = {
currentBranch: mockDefaultBranch,
hasUnsavedChanges: false,
isQueryLoading: false,
mountFn: shallowMount,
options: {},
},
) => {
const createComponent = ({
currentBranch = mockDefaultBranch,
isQueryLoading = false,
mountFn = shallowMount,
options = {},
props = {},
} = {}) => {
wrapper = mountFn(BranchSwitcher, {
propsData: {
...props,
Loading
Loading
@@ -74,17 +69,7 @@ describe('Pipeline editor branch switcher', () => {
 
const createComponentWithApollo = ({ mountFn = shallowMount, props = {} } = {}) => {
const handlers = [[getAvailableBranchesQuery, mockAvailableBranchQuery]];
const resolvers = {
Query: {
currentBranch() {
return mockCurrentBranchQuery();
},
lastCommitBranch() {
return mockLastCommitBranchQuery();
},
},
};
mockApollo = createMockApollo(handlers, resolvers);
mockApollo = createMockApollo(handlers);
 
createComponent({
mountFn,
Loading
Loading
@@ -104,22 +89,12 @@ describe('Pipeline editor branch switcher', () => {
const findInfiniteScroll = () => wrapper.findComponent(GlInfiniteScroll);
const defaultBranchInDropdown = () => findDropdownItems().at(0);
 
const setMockResolvedValues = ({ availableBranches, currentBranch, lastCommitBranch }) => {
if (availableBranches) {
mockAvailableBranchQuery.mockResolvedValue(availableBranches);
}
if (currentBranch) {
mockCurrentBranchQuery.mockResolvedValue(currentBranch);
}
mockLastCommitBranchQuery.mockResolvedValue(lastCommitBranch || '');
const setAvailableBranchesMock = (availableBranches) => {
mockAvailableBranchQuery.mockResolvedValue(availableBranches);
};
 
beforeEach(() => {
mockAvailableBranchQuery = jest.fn();
mockCurrentBranchQuery = jest.fn();
mockLastCommitBranchQuery = jest.fn();
});
 
afterEach(() => {
Loading
Loading
@@ -148,10 +123,7 @@ describe('Pipeline editor branch switcher', () => {
 
describe('after querying', () => {
beforeEach(async () => {
setMockResolvedValues({
availableBranches: mockProjectBranches,
currentBranch: mockDefaultBranch,
});
setAvailableBranchesMock(mockProjectBranches);
createComponentWithApollo({ mountFn: mount });
await waitForPromises();
});
Loading
Loading
@@ -180,10 +152,7 @@ describe('Pipeline editor branch switcher', () => {
 
describe('on fetch error', () => {
beforeEach(async () => {
setMockResolvedValues({
availableBranches: new Error(),
currentBranch: mockDefaultBranch,
});
setAvailableBranchesMock(new Error());
createComponentWithApollo();
await waitForPromises();
});
Loading
Loading
@@ -200,10 +169,7 @@ describe('Pipeline editor branch switcher', () => {
describe('when switching branches', () => {
beforeEach(async () => {
jest.spyOn(window.history, 'pushState').mockImplementation(() => {});
setMockResolvedValues({
availableBranches: mockProjectBranches,
currentBranch: mockDefaultBranch,
});
setAvailableBranchesMock(mockProjectBranches);
createComponentWithApollo({ mountFn: mount });
await waitForPromises();
});
Loading
Loading
@@ -271,10 +237,7 @@ describe('Pipeline editor branch switcher', () => {
 
describe('when searching', () => {
beforeEach(async () => {
setMockResolvedValues({
availableBranches: mockProjectBranches,
currentBranch: mockDefaultBranch,
});
setAvailableBranchesMock(mockProjectBranches);
createComponentWithApollo({ mountFn: mount });
await waitForPromises();
});
Loading
Loading
@@ -374,10 +337,7 @@ describe('Pipeline editor branch switcher', () => {
 
describe('when scrolling to the bottom of the list', () => {
beforeEach(async () => {
setMockResolvedValues({
availableBranches: mockProjectBranches,
currentBranch: mockDefaultBranch,
});
setAvailableBranchesMock(mockProjectBranches);
createComponentWithApollo();
await waitForPromises();
});
Loading
Loading
@@ -433,35 +393,4 @@ describe('Pipeline editor branch switcher', () => {
});
});
});
describe('when committing a new branch', () => {
const createNewBranch = async () => {
setMockResolvedValues({
currentBranch: mockNewBranch,
lastCommitBranch: mockNewBranch,
});
await wrapper.vm.$apollo.queries.currentBranch.refetch();
await wrapper.vm.$apollo.queries.lastCommitBranch.refetch();
};
beforeEach(async () => {
setMockResolvedValues({
availableBranches: mockProjectBranches,
currentBranch: mockDefaultBranch,
});
createComponentWithApollo({ mountFn: mount });
await waitForPromises();
await createNewBranch();
});
it('sets new branch as current branch', () => {
expect(defaultBranchInDropdown().text()).toBe(mockNewBranch);
expect(defaultBranchInDropdown().props('isChecked')).toBe(true);
});
it('adds new branch to branch switcher', () => {
expect(defaultBranchInDropdown().text()).toBe(mockNewBranch);
expect(findDropdownItems()).toHaveLength(mockTotalBranchResults + 1);
});
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment