debian-mirror-gitlab/spec/frontend_integration/ide/ide_integration_spec.js

184 lines
5.6 KiB
JavaScript
Raw Normal View History

2021-03-08 18:12:59 +05:30
import { setTestTimeout } from 'helpers/timeout';
2021-03-11 19:13:27 +05:30
import waitForPromises from 'helpers/wait_for_promises';
import { waitForText } from 'helpers/wait_for_text';
2021-01-03 14:25:43 +05:30
import { createCommitId } from 'test_helpers/factories/commit_id';
2021-03-11 19:13:27 +05:30
import { useOverclockTimers } from 'test_helpers/utils/overclock_timers';
2021-02-22 17:27:13 +05:30
import * as ideHelper from './helpers/ide_helper';
import startWebIDE from './helpers/start';
2020-05-24 23:13:21 +05:30
describe('WebIDE', () => {
2020-10-24 23:57:45 +05:30
useOverclockTimers();
2020-05-24 23:13:21 +05:30
let vm;
2021-02-22 17:27:13 +05:30
let container;
2020-05-24 23:13:21 +05:30
beforeEach(() => {
2021-03-08 18:12:59 +05:30
// For some reason these tests were timing out in CI.
// We will investigate in https://gitlab.com/gitlab-org/gitlab/-/issues/298714
setTestTimeout(20000);
2021-02-22 17:27:13 +05:30
setFixtures('<div class="webide-container"></div>');
container = document.querySelector('.webide-container');
2020-05-24 23:13:21 +05:30
});
afterEach(() => {
vm.$destroy();
vm = null;
});
2021-01-03 14:25:43 +05:30
it('user commits changes', async () => {
2021-02-22 17:27:13 +05:30
vm = startWebIDE(container);
2021-01-03 14:25:43 +05:30
await ideHelper.createFile('foo/bar/test.txt', 'Lorem ipsum dolar sit');
await ideHelper.deleteFile('foo/bar/.gitkeep');
await ideHelper.commit();
const commitId = createCommitId(1);
const commitShortId = commitId.slice(0, 8);
await waitForText('All changes are committed');
await waitForText(commitShortId);
expect(mockServer.db.branches.findBy({ name: 'master' }).commit).toMatchObject({
short_id: commitShortId,
id: commitId,
message: 'Update foo/bar/test.txt\nDeleted foo/bar/.gitkeep',
__actions: [
{
action: 'create',
content: 'Lorem ipsum dolar sit\n',
encoding: 'text',
file_path: 'foo/bar/test.txt',
last_commit_id: '',
},
{
action: 'delete',
encoding: 'text',
file_path: 'foo/bar/.gitkeep',
},
],
});
});
2021-03-08 18:12:59 +05:30
it('user commits changes to new branch', async () => {
vm = startWebIDE(container);
expect(window.location.pathname).toBe('/-/ide/project/gitlab-test/lorem-ipsum/tree/master/-/');
await ideHelper.updateFile('README.md', 'Lorem dolar si amit\n');
await ideHelper.commit({ newBranch: true, newMR: false, newBranchName: 'test-hello-world' });
await waitForText('All changes are committed');
// Wait for IDE to load new commit
await waitForText('10000000', document.querySelector('.ide-status-bar'));
// It's important that the new branch is now in the route
expect(window.location.pathname).toBe(
'/-/ide/project/gitlab-test/lorem-ipsum/blob/test-hello-world/-/README.md',
);
});
2021-01-03 14:25:43 +05:30
it('user adds file that starts with +', async () => {
2021-02-22 17:27:13 +05:30
vm = startWebIDE(container);
2021-01-03 14:25:43 +05:30
await ideHelper.createFile('+test', 'Hello world!');
await ideHelper.openFile('+test');
// Wait for monaco things
await waitForPromises();
// Assert that +test is the only open tab
const tabs = Array.from(document.querySelectorAll('.multi-file-tab'));
2021-03-08 18:12:59 +05:30
expect(tabs.map((x) => x.textContent.trim())).toEqual(['+test']);
2021-01-03 14:25:43 +05:30
});
2021-02-22 17:27:13 +05:30
describe('editor info', () => {
let statusBar;
let editor;
const waitForEditor = async () => {
editor = await ideHelper.waitForMonacoEditor();
};
const changeEditorPosition = async (lineNumber, column) => {
editor.setPosition({ lineNumber, column });
await vm.$nextTick();
};
beforeEach(async () => {
vm = startWebIDE(container);
await ideHelper.openFile('README.md');
editor = await ideHelper.waitForMonacoEditor();
statusBar = ideHelper.getStatusBar();
});
it('shows line position and type', () => {
expect(statusBar).toHaveText('1:1');
expect(statusBar).toHaveText('markdown');
});
it('persists viewer', async () => {
const markdownPreview = 'test preview_markdown result';
mockServer.post('/:namespace/:project/preview_markdown', () => ({
body: markdownPreview,
}));
await ideHelper.openFile('README.md');
ideHelper.clickPreviewMarkdown();
const el = await waitForText(markdownPreview);
expect(el).toHaveText(markdownPreview);
// Need to wait for monaco editor to load so it doesn't through errors on dispose
await ideHelper.openFile('.gitignore');
await ideHelper.waitForMonacoEditor();
await ideHelper.openFile('README.md');
await ideHelper.waitForMonacoEditor();
expect(el).toHaveText(markdownPreview);
});
describe('when editor position changes', () => {
beforeEach(async () => {
await changeEditorPosition(4, 10);
});
it('shows new line position', () => {
expect(statusBar).not.toHaveText('1:1');
expect(statusBar).toHaveText('4:10');
});
it('updates after rename', async () => {
await ideHelper.renameFile('README.md', 'READMEZ.txt');
await waitForEditor();
expect(statusBar).toHaveText('1:1');
expect(statusBar).toHaveText('plaintext');
});
it('persists position after opening then rename', async () => {
await ideHelper.openFile('files/js/application.js');
await waitForEditor();
await ideHelper.renameFile('README.md', 'READING_RAINBOW.md');
await ideHelper.openFile('READING_RAINBOW.md');
await waitForEditor();
expect(statusBar).toHaveText('4:10');
expect(statusBar).toHaveText('markdown');
});
it('persists position after closing', async () => {
await ideHelper.closeFile('README.md');
await ideHelper.openFile('README.md');
await waitForEditor();
expect(statusBar).toHaveText('4:10');
expect(statusBar).toHaveText('markdown');
});
});
});
2020-05-24 23:13:21 +05:30
});