Commit a5e3969d authored by Paul Slaughter's avatar Paul Slaughter

Migrate mr_widget_options_spec to Jest

- Also migrates mock_data
parent be120757
import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants';
export default {
id: 132,
iid: 22,
assignee_id: null,
author_id: 1,
description: '',
lock_version: null,
milestone_id: null,
position: 0,
state: 'merged',
title: 'Update README.md',
updated_by_id: null,
created_at: '2017-04-07T12:27:26.718Z',
updated_at: '2017-04-07T15:39:25.852Z',
time_estimate: 0,
total_time_spent: 0,
human_access: 'Maintainer',
human_time_estimate: null,
human_total_time_spent: null,
in_progress_merge_commit_sha: null,
merge_commit_sha: '53027d060246c8f47e4a9310fb332aa52f221775',
short_merge_commit_sha: '53027d06',
merge_error: null,
merge_params: {
force_remove_source_branch: null,
},
merge_status: 'can_be_merged',
merge_user_id: null,
pipelines_empty_svg_path: '/path/to/svg',
source_branch: 'daaaa',
source_branch_link: 'daaaa',
source_project_id: 19,
source_project_full_path: '/group1/project1',
target_branch: 'master',
target_project_id: 19,
target_project_full_path: '/group2/project2',
merge_request_add_ci_config_path: '/group2/project2/new/pipeline',
metrics: {
merged_by: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
merged_at: '2017-04-07T15:39:25.696Z',
closed_by: null,
closed_at: null,
},
author: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
merge_user: null,
diff_head_sha: '104096c51715e12e7ae41f9333e9fa35b73f385d',
diff_head_commit_short_id: '104096c5',
default_merge_commit_message:
"Merge branch 'daaaa' into 'master'\n\nUpdate README.md\n\nSee merge request !22",
pipeline: {
id: 172,
user: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
active: false,
coverage: '92.16',
path: '/root/acets-app/pipelines/172',
details: {
status: {
icon: 'status_success',
favicon: 'favicon_status_success',
text: 'passed',
label: 'passed',
group: 'success',
has_details: true,
details_path: '/root/acets-app/pipelines/172',
},
duration: null,
finished_at: '2017-04-07T14:00:14.256Z',
stages: [
{
name: 'build',
title: 'build: failed',
status: {
icon: 'status_failed',
favicon: 'favicon_status_failed',
text: 'failed',
label: 'failed',
group: 'failed',
has_details: true,
details_path: '/root/acets-app/pipelines/172#build',
},
path: '/root/acets-app/pipelines/172#build',
dropdown_path: '/root/acets-app/pipelines/172/stage.json?stage=build',
},
{
name: 'review',
title: 'review: skipped',
status: {
icon: 'status_skipped',
favicon: 'favicon_status_skipped',
text: 'skipped',
label: 'skipped',
group: 'skipped',
has_details: true,
details_path: '/root/acets-app/pipelines/172#review',
},
path: '/root/acets-app/pipelines/172#review',
dropdown_path: '/root/acets-app/pipelines/172/stage.json?stage=review',
},
],
artifacts: [],
manual_actions: [
{
name: 'stop_review',
path: '/root/acets-app/builds/1427/play',
playable: false,
},
],
},
flags: {
latest: false,
triggered: false,
stuck: false,
yaml_errors: false,
retryable: true,
cancelable: false,
merge_request_pipeline: false,
detached_merge_request_pipeline: true,
},
ref: {
name: 'daaaa',
path: '/root/acets-app/tree/daaaa',
tag: false,
branch: true,
},
merge_request: {
iid: 1,
path: '/root/detached-merge-request-pipelines/-/merge_requests/1',
title: 'Update README.md',
source_branch: 'feature-1',
source_branch_path: '/root/detached-merge-request-pipelines/branches/feature-1',
target_branch: 'master',
target_branch_path: '/root/detached-merge-request-pipelines/branches/master',
},
commit: {
id: '104096c51715e12e7ae41f9333e9fa35b73f385d',
short_id: '104096c5',
title: 'Update README.md',
created_at: '2017-04-07T15:27:18.000+03:00',
parent_ids: ['2396536178668d8930c29d904e53bd4d06228b32'],
message: 'Update README.md',
author_name: 'Administrator',
author_email: 'admin@example.com',
authored_date: '2017-04-07T15:27:18.000+03:00',
committer_name: 'Administrator',
committer_email: 'admin@example.com',
committed_date: '2017-04-07T15:27:18.000+03:00',
author: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
author_gravatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
commit_url:
'http://localhost:3000/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d',
commit_path: '/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d',
},
retry_path: '/root/acets-app/pipelines/172/retry',
created_at: '2017-04-07T12:27:19.520Z',
updated_at: '2017-04-07T15:28:44.800Z',
},
pipelineCoverageDelta: '15.25',
work_in_progress: false,
source_branch_exists: false,
mergeable_discussions_state: true,
conflicts_can_be_resolved_in_ui: false,
branch_missing: true,
commits_count: 1,
has_conflicts: false,
can_be_merged: true,
has_ci: true,
ci_status: 'success',
pipeline_status_path: '/root/acets-app/-/merge_requests/22/pipeline_status',
issues_links: {
closing: '',
mentioned_but_not_closing: '',
},
current_user: {
can_resolve_conflicts: true,
can_remove_source_branch: false,
can_revert_on_current_merge_request: true,
can_cherry_pick_on_current_merge_request: true,
},
target_branch_path: '/root/acets-app/branches/master',
source_branch_path: '/root/acets-app/branches/daaaa',
conflict_resolution_ui_path: '/root/acets-app/-/merge_requests/22/conflicts',
remove_wip_path: '/root/acets-app/-/merge_requests/22/remove_wip',
cancel_auto_merge_path: '/root/acets-app/-/merge_requests/22/cancel_auto_merge',
create_issue_to_resolve_discussions_path:
'/root/acets-app/-/issues/new?merge_request_to_resolve_discussions_of=22',
merge_path: '/root/acets-app/-/merge_requests/22/merge',
cherry_pick_in_fork_path:
'/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+revert+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1',
revert_in_fork_path:
'/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+cherry-pick+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1',
email_patches_path: '/root/acets-app/-/merge_requests/22.patch',
plain_diff_path: '/root/acets-app/-/merge_requests/22.diff',
merge_request_basic_path: '/root/acets-app/-/merge_requests/22.json?serializer=basic',
merge_request_widget_path: '/root/acets-app/-/merge_requests/22/widget.json',
merge_request_cached_widget_path: '/cached.json',
merge_check_path: '/root/acets-app/-/merge_requests/22/merge_check',
ci_environments_status_url: '/root/acets-app/-/merge_requests/22/ci_environments_status',
project_archived: false,
default_merge_commit_message_with_description:
"Merge branch 'daaaa' into 'master'\n\nUpdate README.md\n\nSee merge request !22",
default_squash_commit_message: 'Test squash commit message',
diverged_commits_count: 0,
only_allow_merge_if_pipeline_succeeds: false,
commit_change_content_path: '/root/acets-app/-/merge_requests/22/commit_change_content',
merge_commit_path:
'http://localhost:3000/root/acets-app/commit/53027d060246c8f47e4a9310fb332aa52f221775',
troubleshooting_docs_path: 'help',
merge_request_pipelines_docs_path: '/help/ci/merge_request_pipelines/index.md',
merge_train_when_pipeline_succeeds_docs_path:
'/help/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/#startadd-to-merge-train-when-pipeline-succeeds',
squash: true,
visual_review_app_available: true,
merge_trains_enabled: true,
merge_trains_count: 3,
merge_train_index: 1,
};
export const mockStore = {
pipeline: {
id: 0,
details: {
status: {
details_path: '/root/review-app-tester/pipelines/66',
favicon:
'/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png',
group: 'success-with-warnings',
has_details: true,
icon: 'status_warning',
illustration: null,
label: 'passed with warnings',
text: 'passed',
tooltip: 'passed',
},
},
flags: {},
ref: {},
},
mergePipeline: {
id: 1,
details: {
status: {
details_path: '/root/review-app-tester/pipelines/66',
favicon:
'/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png',
group: 'success-with-warnings',
has_details: true,
icon: 'status_warning',
illustration: null,
label: 'passed with warnings',
text: 'passed',
tooltip: 'passed',
},
},
flags: {},
ref: {},
},
targetBranch: 'target-branch',
sourceBranch: 'source-branch',
sourceBranchLink: 'source-branch-link',
deployments: [
{
id: 0,
name: 'bogus',
external_url: 'https://fake.com',
external_url_formatted: 'https://fake.com',
status: SUCCESS,
},
{
id: 1,
name: 'bogus-docs',
external_url: 'https://fake.com',
external_url_formatted: 'https://fake.com',
status: SUCCESS,
},
],
postMergeDeployments: [
{ id: 0, name: 'prod', status: SUCCESS },
{ id: 1, name: 'prod-docs', status: SUCCESS },
],
troubleshootingDocsPath: 'troubleshooting-docs-path',
ciStatus: 'ci-status',
hasCI: true,
exposedArtifactsPath: 'exposed_artifacts.json',
};
import Vue from 'vue'; import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter'; import MockAdapter from 'axios-mock-adapter';
import mountComponent from 'spec/helpers/vue_mount_component_helper'; import mountComponent from 'helpers/vue_mount_component_helper';
import waitForPromises from 'spec/helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import mrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue'; import mrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue';
import eventHub from '~/vue_merge_request_widget/event_hub'; import eventHub from '~/vue_merge_request_widget/event_hub';
import notify from '~/lib/utils/notify'; import notify from '~/lib/utils/notify';
import SmartInterval from '~/smart_interval';
import { stateKey } from '~/vue_merge_request_widget/stores/state_maps'; import { stateKey } from '~/vue_merge_request_widget/stores/state_maps';
import mockData from './mock_data'; import mockData from './mock_data';
import { faviconDataUrl, overlayDataUrl } from '../lib/utils/mock_data'; import { faviconDataUrl, overlayDataUrl } from '../lib/utils/mock_data';
import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants'; import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants';
jest.mock('~/smart_interval');
const returnPromise = data => const returnPromise = data =>
new Promise(resolve => { new Promise(resolve => {
resolve({ resolve({
...@@ -26,7 +28,6 @@ describe('mrWidgetOptions', () => { ...@@ -26,7 +28,6 @@ describe('mrWidgetOptions', () => {
const COLLABORATION_MESSAGE = 'Allows commits from members who can merge to the target branch'; const COLLABORATION_MESSAGE = 'Allows commits from members who can merge to the target branch';
beforeEach(() => { beforeEach(() => {
jasmine.clock().install();
// Prevent component mounting // Prevent component mounting
delete mrWidgetOptions.el; delete mrWidgetOptions.el;
...@@ -41,9 +42,7 @@ describe('mrWidgetOptions', () => { ...@@ -41,9 +42,7 @@ describe('mrWidgetOptions', () => {
}); });
afterEach(() => { afterEach(() => {
jasmine.clock().uninstall();
mock.restore(); mock.restore();
vm.$destroy(); vm.$destroy();
vm = null; vm = null;
...@@ -59,11 +58,13 @@ describe('mrWidgetOptions', () => { ...@@ -59,11 +58,13 @@ describe('mrWidgetOptions', () => {
vm = mountComponent(MrWidgetOptions, { vm = mountComponent(MrWidgetOptions, {
mrData: { ...mockData }, mrData: { ...mockData },
}); });
return axios.waitForAll();
}; };
describe('default', () => { describe('default', () => {
beforeEach(() => { beforeEach(() => {
createComponent(); return createComponent();
}); });
describe('data', () => { describe('data', () => {
...@@ -259,9 +260,9 @@ describe('mrWidgetOptions', () => { ...@@ -259,9 +260,9 @@ describe('mrWidgetOptions', () => {
describe('methods', () => { describe('methods', () => {
describe('checkStatus', () => { describe('checkStatus', () => {
it('should tell service to check status', () => { it('should tell service to check status', () => {
spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData)); jest.spyOn(vm.service, 'checkStatus').mockReturnValue(returnPromise(mockData));
spyOn(vm.mr, 'setData'); jest.spyOn(vm.mr, 'setData').mockImplementation(() => {});
spyOn(vm, 'handleNotification'); jest.spyOn(vm, 'handleNotification').mockImplementation(() => {});
let isCbExecuted = false; let isCbExecuted = false;
const cb = () => { const cb = () => {
...@@ -281,33 +282,33 @@ describe('mrWidgetOptions', () => { ...@@ -281,33 +282,33 @@ describe('mrWidgetOptions', () => {
describe('initPolling', () => { describe('initPolling', () => {
it('should call SmartInterval', () => { it('should call SmartInterval', () => {
spyOn(vm, 'checkStatus').and.returnValue(Promise.resolve());
vm.initPolling(); vm.initPolling();
expect(vm.checkStatus).not.toHaveBeenCalled(); expect(SmartInterval).toHaveBeenCalledWith(
expect.objectContaining({
jasmine.clock().tick(10000); callback: vm.checkStatus,
}),
expect(vm.pollingInterval).toBeDefined(); );
expect(vm.checkStatus).toHaveBeenCalled();
}); });
}); });
describe('initDeploymentsPolling', () => { describe('initDeploymentsPolling', () => {
it('should call SmartInterval', () => { it('should call SmartInterval', () => {
spyOn(vm, 'fetchDeployments').and.returnValue(Promise.resolve());
vm.initDeploymentsPolling(); vm.initDeploymentsPolling();
expect(vm.deploymentsInterval).toBeDefined(); expect(SmartInterval).toHaveBeenCalledWith(
expect(vm.fetchDeployments).toHaveBeenCalled(); expect.objectContaining({
callback: vm.fetchPreMergeDeployments,
}),
);
}); });
}); });
describe('fetchDeployments', () => { describe('fetchDeployments', () => {
it('should fetch deployments', () => { it('should fetch deployments', () => {
spyOn(vm.service, 'fetchDeployments').and.returnValue( jest
returnPromise([{ id: 1, status: SUCCESS }]), .spyOn(vm.service, 'fetchDeployments')
); .mockReturnValue(returnPromise([{ id: 1, status: SUCCESS }]));
vm.fetchPreMergeDeployments(); vm.fetchPreMergeDeployments();
...@@ -321,9 +322,9 @@ describe('mrWidgetOptions', () => { ...@@ -321,9 +322,9 @@ describe('mrWidgetOptions', () => {
describe('fetchActionsContent', () => { describe('fetchActionsContent', () => {
it('should fetch content of Cherry Pick and Revert modals', () => { it('should fetch content of Cherry Pick and Revert modals', () => {
spyOn(vm.service, 'fetchMergeActionsContent').and.returnValue( jest
returnPromise('hello world'), .spyOn(vm.service, 'fetchMergeActionsContent')
); .mockReturnValue(returnPromise('hello world'));
vm.fetchActionsContent(); vm.fetchActionsContent();
...@@ -335,59 +336,48 @@ describe('mrWidgetOptions', () => { ...@@ -335,59 +336,48 @@ describe('mrWidgetOptions', () => {
}); });
describe('bindEventHubListeners', () => { describe('bindEventHubListeners', () => {
it('should bind eventHub listeners', () => { it.each`
spyOn(vm, 'checkStatus').and.returnValue(() => {}); event | method | methodArgs
spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData)); ${'MRWidgetUpdateRequested'} | ${'checkStatus'} | ${x => [x]}
spyOn(vm, 'fetchActionsContent'); ${'MRWidgetRebaseSuccess'} | ${'checkStatus'} | ${x => [x, true]}
spyOn(vm.mr, 'setData'); ${'FetchActionsContent'} | ${'fetchActionsContent'} | ${() => []}
spyOn(vm, 'resumePolling'); ${'EnablePolling'} | ${'resumePolling'} | ${() => []}
spyOn(vm, 'stopPolling'); ${'DisablePolling'} | ${'stopPolling'} | ${() => []}
spyOn(eventHub, '$on').and.callThrough(); `('should bind to $event', ({ event, method, methodArgs }) => {
jest.spyOn(vm, method).mockImplementation();
return waitForPromises().then(() => {
eventHub.$emit('SetBranchRemoveFlag', ['flag']);
expect(vm.mr.isRemovingSourceBranch).toEqual('flag');
eventHub.$emit('FailedToMerge');
expect(vm.mr.state).toEqual('failedToMerge'); const eventArg = {};
eventHub.$emit(event, eventArg);
eventHub.$emit('UpdateWidgetData', mockData); expect(vm[method]).toHaveBeenCalledWith(...methodArgs(eventArg));
});
expect(vm.mr.setData).toHaveBeenCalledWith(mockData);
eventHub.$emit('EnablePolling');
expect(vm.resumePolling).toHaveBeenCalled(); it('should bind to SetBranchRemoveFlag', () => {
expect(vm.mr.isRemovingSourceBranch).toBe(false);
eventHub.$emit('DisablePolling'); eventHub.$emit('SetBranchRemoveFlag', [true]);
expect(vm.stopPolling).toHaveBeenCalled(); expect(vm.mr.isRemovingSourceBranch).toBe(true);
});
const listenersWithServiceRequest = { it('should bind to FailedToMerge', () => {
MRWidgetUpdateRequested: true, vm.mr.state = '';
FetchActionsContent: true, vm.mr.mergeError = '';
};
const allArgs = eventHub.$on.calls.allArgs(); const mergeError = 'Something bad happened!';
allArgs.forEach(params => { eventHub.$emit('FailedToMerge', mergeError);
const eventName = params[0];
const callback = params[1];
if (listenersWithServiceRequest[eventName]) { expect(vm.mr.state).toBe('failedToMerge');
listenersWithServiceRequest[eventName] = callback; expect(vm.mr.mergeError).toBe(mergeError);
}
}); });
listenersWithServiceRequest.MRWidgetUpdateRequested(); it('should bind to UpdateWidgetData', () => {
jest.spyOn(vm.mr, 'setData').mockImplementation();
expect(vm.checkStatus).toHaveBeenCalled(); const data = { ...mockData };
eventHub.$emit('UpdateWidgetData', data);
listenersWithServiceRequest.FetchActionsContent(); expect(vm.mr.setData).toHaveBeenCalledWith(data);
expect(vm.fetchActionsContent).toHaveBeenCalled();
});
}); });
}); });
...@@ -419,8 +409,8 @@ describe('mrWidgetOptions', () => { ...@@ -419,8 +409,8 @@ describe('mrWidgetOptions', () => {
expect(faviconElement.getAttribute('href')).not.toEqual(null); expect(faviconElement.getAttribute('href')).not.toEqual(null);
expect(faviconElement.getAttribute('href')).not.toEqual(overlayDataUrl); expect(faviconElement.getAttribute('href')).not.toEqual(overlayDataUrl);
expect(faviconElement.getAttribute('href')).not.toEqual(faviconDataUrl); expect(faviconElement.getAttribute('href')).not.toEqual(faviconDataUrl);
done();
}) })
.then(done)
.catch(done.fail); .catch(done.fail);
}); });
...@@ -443,7 +433,7 @@ describe('mrWidgetOptions', () => { ...@@ -443,7 +433,7 @@ describe('mrWidgetOptions', () => {
}; };
beforeEach(() => { beforeEach(() => {
spyOn(notify, 'notifyMe'); jest.spyOn(notify, 'notifyMe').mockImplementation(() => {});
vm.mr.ciStatus = 'failed'; vm.mr.ciStatus = 'failed';
vm.mr.gitlabLogo = 'logo.png'; vm.mr.gitlabLogo = 'logo.png';
...@@ -478,25 +468,23 @@ describe('mrWidgetOptions', () => { ...@@ -478,25 +468,23 @@ describe('mrWidgetOptions', () => {
}); });
describe('resumePolling', () => { describe('resumePolling', () => {
it('should call stopTimer on pollingInterval', () => it('should call stopTimer on pollingInterval', () => {
waitForPromises().then(() => { jest.spyOn(vm.pollingInterval, 'resume').mockImplementation(() => {});
spyOn(vm.pollingInterval, 'resume');
vm.resumePolling(); vm.resumePolling();
expect(vm.pollingInterval.resume).toHaveBeenCalled(); expect(vm.pollingInterval.resume).toHaveBeenCalled();
})); });
}); });
describe('stopPolling', () => { describe('stopPolling', () => {
it('should call stopTimer on pollingInterval', () => it('should call stopTimer on pollingInterval', () => {
waitForPromises().then(() => { jest.spyOn(vm.pollingInterval, 'stopTimer').mockImplementation(() => {});
spyOn(vm.pollingInterval, 'stopTimer');
vm.stopPolling(); vm.stopPolling();
expect(vm.pollingInterval.stopTimer).toHaveBeenCalled(); expect(vm.pollingInterval.stopTimer).toHaveBeenCalled();
})); });
}); });
}); });
...@@ -814,8 +802,12 @@ describe('mrWidgetOptions', () => { ...@@ -814,8 +802,12 @@ describe('mrWidgetOptions', () => {
describe('given suggestPipeline feature flag is enabled', () => { describe('given suggestPipeline feature flag is enabled', () => {
beforeEach(() => { beforeEach(() => {
// This is needed because some grandchildren Bootstrap components throw warnings
// https://gitlab.com/gitlab-org/gitlab/issues/208458
jest.spyOn(console, 'warn').mockImplementation();
gon.features = { suggestPipeline: true }; gon.features = { suggestPipeline: true };
createComponent(); return createComponent();
}); });
it('should suggest pipelines when none exist', () => { it('should suggest pipelines when none exist', () => {
......
import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants'; export { default } from '../../frontend/vue_mr_widget/mock_data';
export * from '../../frontend/vue_mr_widget/mock_data';
export default {
id: 132,
iid: 22,
assignee_id: null,
author_id: 1,
description: '',
lock_version: null,
milestone_id: null,
position: 0,
state: 'merged',
title: 'Update README.md',
updated_by_id: null,
created_at: '2017-04-07T12:27:26.718Z',
updated_at: '2017-04-07T15:39:25.852Z',
time_estimate: 0,
total_time_spent: 0,
human_access: 'Maintainer',
human_time_estimate: null,
human_total_time_spent: null,
in_progress_merge_commit_sha: null,
merge_commit_sha: '53027d060246c8f47e4a9310fb332aa52f221775',
short_merge_commit_sha: '53027d06',
merge_error: null,
merge_params: {
force_remove_source_branch: null,
},
merge_status: 'can_be_merged',
merge_user_id: null,
pipelines_empty_svg_path: '/path/to/svg',
source_branch: 'daaaa',
source_branch_link: 'daaaa',
source_project_id: 19,
source_project_full_path: '/group1/project1',
target_branch: 'master',
target_project_id: 19,
target_project_full_path: '/group2/project2',
merge_request_add_ci_config_path: '/group2/project2/new/pipeline',
metrics: {
merged_by: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
merged_at: '2017-04-07T15:39:25.696Z',
closed_by: null,
closed_at: null,
},
author: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
merge_user: null,
diff_head_sha: '104096c51715e12e7ae41f9333e9fa35b73f385d',
diff_head_commit_short_id: '104096c5',
default_merge_commit_message:
"Merge branch 'daaaa' into 'master'\n\nUpdate README.md\n\nSee merge request !22",
pipeline: {
id: 172,
user: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
active: false,
coverage: '92.16',
path: '/root/acets-app/pipelines/172',
details: {
status: {
icon: 'status_success',
favicon: 'favicon_status_success',
text: 'passed',
label: 'passed',
group: 'success',
has_details: true,
details_path: '/root/acets-app/pipelines/172',
},
duration: null,
finished_at: '2017-04-07T14:00:14.256Z',
stages: [
{
name: 'build',
title: 'build: failed',
status: {
icon: 'status_failed',
favicon: 'favicon_status_failed',
text: 'failed',
label: 'failed',
group: 'failed',
has_details: true,
details_path: '/root/acets-app/pipelines/172#build',
},
path: '/root/acets-app/pipelines/172#build',
dropdown_path: '/root/acets-app/pipelines/172/stage.json?stage=build',
},
{
name: 'review',
title: 'review: skipped',
status: {
icon: 'status_skipped',
favicon: 'favicon_status_skipped',
text: 'skipped',
label: 'skipped',
group: 'skipped',
has_details: true,
details_path: '/root/acets-app/pipelines/172#review',
},
path: '/root/acets-app/pipelines/172#review',
dropdown_path: '/root/acets-app/pipelines/172/stage.json?stage=review',
},
],
artifacts: [],
manual_actions: [
{
name: 'stop_review',
path: '/root/acets-app/builds/1427/play',
playable: false,
},
],
},
flags: {
latest: false,
triggered: false,
stuck: false,
yaml_errors: false,
retryable: true,
cancelable: false,
merge_request_pipeline: false,
detached_merge_request_pipeline: true,
},
ref: {
name: 'daaaa',
path: '/root/acets-app/tree/daaaa',
tag: false,
branch: true,
},
merge_request: {
iid: 1,
path: '/root/detached-merge-request-pipelines/-/merge_requests/1',
title: 'Update README.md',
source_branch: 'feature-1',
source_branch_path: '/root/detached-merge-request-pipelines/branches/feature-1',
target_branch: 'master',
target_branch_path: '/root/detached-merge-request-pipelines/branches/master',
},
commit: {
id: '104096c51715e12e7ae41f9333e9fa35b73f385d',
short_id: '104096c5',
title: 'Update README.md',
created_at: '2017-04-07T15:27:18.000+03:00',
parent_ids: ['2396536178668d8930c29d904e53bd4d06228b32'],
message: 'Update README.md',
author_name: 'Administrator',
author_email: 'admin@example.com',
authored_date: '2017-04-07T15:27:18.000+03:00',
committer_name: 'Administrator',
committer_email: 'admin@example.com',
committed_date: '2017-04-07T15:27:18.000+03:00',
author: {
name: 'Administrator',
username: 'root',
id: 1,
state: 'active',
avatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
web_url: 'http://localhost:3000/root',
},
author_gravatar_url:
'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
commit_url:
'http://localhost:3000/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d',
commit_path: '/root/acets-app/commit/104096c51715e12e7ae41f9333e9fa35b73f385d',
},
retry_path: '/root/acets-app/pipelines/172/retry',
created_at: '2017-04-07T12:27:19.520Z',
updated_at: '2017-04-07T15:28:44.800Z',
},
pipelineCoverageDelta: '15.25',
work_in_progress: false,
source_branch_exists: false,
mergeable_discussions_state: true,
conflicts_can_be_resolved_in_ui: false,
branch_missing: true,
commits_count: 1,
has_conflicts: false,
can_be_merged: true,
has_ci: true,
ci_status: 'success',
pipeline_status_path: '/root/acets-app/-/merge_requests/22/pipeline_status',
issues_links: {
closing: '',
mentioned_but_not_closing: '',
},
current_user: {
can_resolve_conflicts: true,
can_remove_source_branch: false,
can_revert_on_current_merge_request: true,
can_cherry_pick_on_current_merge_request: true,
},
target_branch_path: '/root/acets-app/branches/master',
source_branch_path: '/root/acets-app/branches/daaaa',
conflict_resolution_ui_path: '/root/acets-app/-/merge_requests/22/conflicts',
remove_wip_path: '/root/acets-app/-/merge_requests/22/remove_wip',
cancel_auto_merge_path: '/root/acets-app/-/merge_requests/22/cancel_auto_merge',
create_issue_to_resolve_discussions_path:
'/root/acets-app/-/issues/new?merge_request_to_resolve_discussions_of=22',
merge_path: '/root/acets-app/-/merge_requests/22/merge',
cherry_pick_in_fork_path:
'/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+revert+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1',
revert_in_fork_path:
'/root/acets-app/forks?continue%5Bnotice%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+has+been+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.+Try+to+cherry-pick+this+commit+again.&continue%5Bnotice_now%5D=You%27re+not+allowed+to+make+changes+to+this+project+directly.+A+fork+of+this+project+is+being+created+that+you+can+make+changes+in%2C+so+you+can+submit+a+merge+request.&continue%5Bto%5D=%2Froot%2Facets-app%2Fmerge_requests%2F22&namespace_key=1',
email_patches_path: '/root/acets-app/-/merge_requests/22.patch',
plain_diff_path: '/root/acets-app/-/merge_requests/22.diff',
merge_request_basic_path: '/root/acets-app/-/merge_requests/22.json?serializer=basic',
merge_request_widget_path: '/root/acets-app/-/merge_requests/22/widget.json',
merge_request_cached_widget_path: '/cached.json',
merge_check_path: '/root/acets-app/-/merge_requests/22/merge_check',
ci_environments_status_url: '/root/acets-app/-/merge_requests/22/ci_environments_status',
project_archived: false,
default_merge_commit_message_with_description:
"Merge branch 'daaaa' into 'master'\n\nUpdate README.md\n\nSee merge request !22",
default_squash_commit_message: 'Test squash commit message',
diverged_commits_count: 0,
only_allow_merge_if_pipeline_succeeds: false,
commit_change_content_path: '/root/acets-app/-/merge_requests/22/commit_change_content',
merge_commit_path:
'http://localhost:3000/root/acets-app/commit/53027d060246c8f47e4a9310fb332aa52f221775',
troubleshooting_docs_path: 'help',
merge_request_pipelines_docs_path: '/help/ci/merge_request_pipelines/index.md',
merge_train_when_pipeline_succeeds_docs_path:
'/help/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/#startadd-to-merge-train-when-pipeline-succeeds',
squash: true,
visual_review_app_available: true,
merge_trains_enabled: true,
merge_trains_count: 3,
merge_train_index: 1,
};
export const mockStore = {
pipeline: {
id: 0,
details: {
status: {
details_path: '/root/review-app-tester/pipelines/66',
favicon:
'/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png',
group: 'success-with-warnings',
has_details: true,
icon: 'status_warning',
illustration: null,
label: 'passed with warnings',
text: 'passed',
tooltip: 'passed',
},
},
flags: {},
ref: {},
},
mergePipeline: {
id: 1,
details: {
status: {
details_path: '/root/review-app-tester/pipelines/66',
favicon:
'/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2. png',
group: 'success-with-warnings',
has_details: true,
icon: 'status_warning',
illustration: null,
label: 'passed with warnings',
text: 'passed',
tooltip: 'passed',
},
},
flags: {},
ref: {},
},
targetBranch: 'target-branch',
sourceBranch: 'source-branch',
sourceBranchLink: 'source-branch-link',
deployments: [
{
id: 0,
name: 'bogus',
external_url: 'https://fake.com',
external_url_formatted: 'https://fake.com',
status: SUCCESS,
},
{
id: 1,
name: 'bogus-docs',
external_url: 'https://fake.com',
external_url_formatted: 'https://fake.com',
status: SUCCESS,
},
],
postMergeDeployments: [
{ id: 0, name: 'prod', status: SUCCESS },
{ id: 1, name: 'prod-docs', status: SUCCESS },
],
troubleshootingDocsPath: 'troubleshooting-docs-path',
ciStatus: 'ci-status',
hasCI: true,
exposedArtifactsPath: 'exposed_artifacts.json',
};
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