debian-mirror-gitlab/spec/frontend/static_site_editor/services/submit_content_changes_spec.js

261 lines
7.6 KiB
JavaScript
Raw Normal View History

2020-10-24 23:57:45 +05:30
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
2020-04-22 19:07:51 +05:30
import Api from '~/api';
import { convertObjectPropsToSnakeCase } from '~/lib/utils/common_utils';
import {
DEFAULT_TARGET_BRANCH,
SUBMIT_CHANGES_BRANCH_ERROR,
SUBMIT_CHANGES_COMMIT_ERROR,
SUBMIT_CHANGES_MERGE_REQUEST_ERROR,
2020-05-24 23:13:21 +05:30
TRACKING_ACTION_CREATE_COMMIT,
2020-06-23 00:09:42 +05:30
TRACKING_ACTION_CREATE_MERGE_REQUEST,
2021-02-22 17:27:13 +05:30
USAGE_PING_TRACKING_ACTION_CREATE_COMMIT,
USAGE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
DEFAULT_FORMATTING_CHANGES_COMMIT_MESSAGE,
DEFAULT_FORMATTING_CHANGES_COMMIT_DESCRIPTION,
2020-04-22 19:07:51 +05:30
} from '~/static_site_editor/constants';
import generateBranchName from '~/static_site_editor/services/generate_branch_name';
import submitContentChanges from '~/static_site_editor/services/submit_content_changes';
import {
username,
projectId,
2020-05-24 23:13:21 +05:30
commitBranchResponse,
2020-04-22 19:07:51 +05:30
commitMultipleResponse,
createMergeRequestResponse,
2021-01-03 14:25:43 +05:30
mergeRequestMeta,
2020-04-22 19:07:51 +05:30
sourcePath,
2020-11-24 15:15:51 +05:30
sourceContentYAML as content,
2020-05-24 23:13:21 +05:30
trackingCategory,
2020-07-28 23:09:34 +05:30
images,
2020-04-22 19:07:51 +05:30
} from '../mock_data';
jest.mock('~/static_site_editor/services/generate_branch_name');
describe('submitContentChanges', () => {
const branch = 'branch-name';
2020-05-24 23:13:21 +05:30
let trackingSpy;
let origPage;
2020-04-22 19:07:51 +05:30
2021-01-03 14:25:43 +05:30
const buildPayload = (overrides = {}) => ({
username,
projectId,
sourcePath,
content,
images,
mergeRequestMeta,
...overrides,
});
2020-04-22 19:07:51 +05:30
beforeEach(() => {
2020-05-24 23:13:21 +05:30
jest.spyOn(Api, 'createBranch').mockResolvedValue({ data: commitBranchResponse });
2020-04-22 19:07:51 +05:30
jest.spyOn(Api, 'commitMultiple').mockResolvedValue({ data: commitMultipleResponse });
jest
.spyOn(Api, 'createProjectMergeRequest')
.mockResolvedValue({ data: createMergeRequestResponse });
generateBranchName.mockReturnValue(branch);
2020-05-24 23:13:21 +05:30
origPage = document.body.dataset.page;
document.body.dataset.page = trackingCategory;
trackingSpy = mockTracking(document.body.dataset.page, undefined, jest.spyOn);
});
afterEach(() => {
document.body.dataset.page = origPage;
unmockTracking();
2020-04-22 19:07:51 +05:30
});
it('creates a branch named after the username and target branch', () => {
2021-01-03 14:25:43 +05:30
return submitContentChanges(buildPayload()).then(() => {
2020-04-22 19:07:51 +05:30
expect(Api.createBranch).toHaveBeenCalledWith(projectId, {
ref: DEFAULT_TARGET_BRANCH,
branch,
});
});
});
it('notifies error when branch could not be created', () => {
Api.createBranch.mockRejectedValueOnce();
2021-01-03 14:25:43 +05:30
return expect(submitContentChanges(buildPayload())).rejects.toThrow(
2020-04-22 19:07:51 +05:30
SUBMIT_CHANGES_BRANCH_ERROR,
);
});
2021-02-22 17:27:13 +05:30
describe('committing markdown formatting changes', () => {
const formattedMarkdown = `formatted ${content}`;
const commitPayload = {
branch,
commit_message: `${DEFAULT_FORMATTING_CHANGES_COMMIT_MESSAGE}\n\n${DEFAULT_FORMATTING_CHANGES_COMMIT_DESCRIPTION}`,
actions: [
{
action: 'update',
file_path: sourcePath,
content: formattedMarkdown,
},
],
};
it('commits markdown formatting changes in a separate commit', () => {
return submitContentChanges(buildPayload({ formattedMarkdown })).then(() => {
expect(Api.commitMultiple).toHaveBeenCalledWith(projectId, commitPayload);
});
});
it('does not commit markdown formatting changes when there are none', () => {
return submitContentChanges(buildPayload()).then(() => {
expect(Api.commitMultiple.mock.calls).toHaveLength(1);
expect(Api.commitMultiple.mock.calls[0][1]).not.toMatchObject({
actions: commitPayload.actions,
});
});
});
});
2020-04-22 19:07:51 +05:30
it('commits the content changes to the branch when creating branch succeeds', () => {
2021-01-03 14:25:43 +05:30
return submitContentChanges(buildPayload()).then(() => {
2020-04-22 19:07:51 +05:30
expect(Api.commitMultiple).toHaveBeenCalledWith(projectId, {
branch,
2021-01-03 14:25:43 +05:30
commit_message: mergeRequestMeta.title,
2020-04-22 19:07:51 +05:30
actions: [
{
action: 'update',
file_path: sourcePath,
content,
},
2020-07-28 23:09:34 +05:30
{
action: 'create',
content: 'image1-content',
encoding: 'base64',
file_path: 'path/to/image1.png',
},
],
});
});
});
it('does not commit an image if it has been removed from the content', () => {
const contentWithoutImages = '## Content without images';
2021-01-03 14:25:43 +05:30
const payload = buildPayload({ content: contentWithoutImages });
return submitContentChanges(payload).then(() => {
2020-07-28 23:09:34 +05:30
expect(Api.commitMultiple).toHaveBeenCalledWith(projectId, {
branch,
2021-01-03 14:25:43 +05:30
commit_message: mergeRequestMeta.title,
2020-07-28 23:09:34 +05:30
actions: [
{
action: 'update',
file_path: sourcePath,
content: contentWithoutImages,
},
2020-04-22 19:07:51 +05:30
],
});
});
});
it('notifies error when content could not be committed', () => {
Api.commitMultiple.mockRejectedValueOnce();
2021-01-03 14:25:43 +05:30
return expect(submitContentChanges(buildPayload())).rejects.toThrow(
2020-04-22 19:07:51 +05:30
SUBMIT_CHANGES_COMMIT_ERROR,
);
});
2021-01-03 14:25:43 +05:30
it('creates a merge request when committing changes succeeds', () => {
return submitContentChanges(buildPayload()).then(() => {
const { title, description } = mergeRequestMeta;
2020-04-22 19:07:51 +05:30
expect(Api.createProjectMergeRequest).toHaveBeenCalledWith(
projectId,
convertObjectPropsToSnakeCase({
2021-01-03 14:25:43 +05:30
title,
description,
2020-04-22 19:07:51 +05:30
targetBranch: DEFAULT_TARGET_BRANCH,
sourceBranch: branch,
}),
);
});
});
it('notifies error when merge request could not be created', () => {
Api.createProjectMergeRequest.mockRejectedValueOnce();
2021-01-03 14:25:43 +05:30
return expect(submitContentChanges(buildPayload())).rejects.toThrow(
2020-04-22 19:07:51 +05:30
SUBMIT_CHANGES_MERGE_REQUEST_ERROR,
);
});
describe('when changes are submitted successfully', () => {
let result;
beforeEach(() => {
2021-03-08 18:12:59 +05:30
return submitContentChanges(buildPayload()).then((_result) => {
2021-01-03 14:25:43 +05:30
result = _result;
});
2020-04-22 19:07:51 +05:30
});
it('returns the branch name', () => {
expect(result).toMatchObject({ branch: { label: branch } });
});
it('returns commit short id and web url', () => {
expect(result).toMatchObject({
commit: {
label: commitMultipleResponse.short_id,
url: commitMultipleResponse.web_url,
},
});
});
it('returns merge request iid and web url', () => {
expect(result).toMatchObject({
mergeRequest: {
label: createMergeRequestResponse.iid,
url: createMergeRequestResponse.web_url,
},
});
});
});
2020-06-23 00:09:42 +05:30
describe('sends the correct tracking event', () => {
beforeEach(() => {
2021-01-03 14:25:43 +05:30
return submitContentChanges(buildPayload());
2020-06-23 00:09:42 +05:30
});
it('for committing changes', () => {
expect(trackingSpy).toHaveBeenCalledWith(
document.body.dataset.page,
TRACKING_ACTION_CREATE_COMMIT,
);
});
it('for creating a merge request', () => {
expect(trackingSpy).toHaveBeenCalledWith(
document.body.dataset.page,
TRACKING_ACTION_CREATE_MERGE_REQUEST,
);
});
});
2021-02-22 17:27:13 +05:30
describe('sends the correct Usage Ping tracking event', () => {
beforeEach(() => {
jest.spyOn(Api, 'trackRedisCounterEvent').mockResolvedValue({ data: '' });
});
it('for commiting changes', () => {
return submitContentChanges(buildPayload()).then(() => {
expect(Api.trackRedisCounterEvent).toHaveBeenCalledWith(
USAGE_PING_TRACKING_ACTION_CREATE_COMMIT,
);
});
});
it('for creating a merge request', () => {
return submitContentChanges(buildPayload()).then(() => {
expect(Api.trackRedisCounterEvent).toHaveBeenCalledWith(
USAGE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
);
});
});
});
2020-04-22 19:07:51 +05:30
});