123 lines
3.2 KiB
JavaScript
123 lines
3.2 KiB
JavaScript
|
import { findAllByText, fireEvent, getByLabelText, screen } from '@testing-library/dom';
|
||
|
|
||
|
const isFolderRowOpen = row => row.matches('.folder.is-open');
|
||
|
|
||
|
const getLeftSidebar = () => screen.getByTestId('left-sidebar');
|
||
|
|
||
|
const clickOnLeftSidebarTab = name => {
|
||
|
const sidebar = getLeftSidebar();
|
||
|
|
||
|
const button = getByLabelText(sidebar, name);
|
||
|
|
||
|
button.click();
|
||
|
};
|
||
|
|
||
|
const findMonacoEditor = () =>
|
||
|
screen.findByLabelText(/Editor content;/).then(x => x.closest('.monaco-editor'));
|
||
|
|
||
|
const findAndSetEditorValue = async value => {
|
||
|
const editor = await findMonacoEditor();
|
||
|
const uri = editor.getAttribute('data-uri');
|
||
|
|
||
|
window.monaco.editor.getModel(uri).setValue(value);
|
||
|
};
|
||
|
|
||
|
const findTreeBody = () => screen.findByTestId('ide-tree-body', {}, { timeout: 5000 });
|
||
|
|
||
|
const findRootActions = () => screen.findByTestId('ide-root-actions', {}, { timeout: 7000 });
|
||
|
|
||
|
const findFileRowContainer = (row = null) =>
|
||
|
row ? Promise.resolve(row.parentElement) : findTreeBody();
|
||
|
|
||
|
const findFileChild = async (row, name, index = 0) => {
|
||
|
const container = await findFileRowContainer(row);
|
||
|
const children = await findAllByText(container, name, { selector: '.file-row-name' });
|
||
|
|
||
|
return children.map(x => x.closest('.file-row')).find(x => x.dataset.level === index.toString());
|
||
|
};
|
||
|
|
||
|
const openFileRow = row => {
|
||
|
if (!row || isFolderRowOpen(row)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
row.click();
|
||
|
};
|
||
|
|
||
|
const findAndTraverseToPath = async (path, index = 0, row = null) => {
|
||
|
if (!path) {
|
||
|
return row;
|
||
|
}
|
||
|
|
||
|
const [name, ...restOfPath] = path.split('/');
|
||
|
|
||
|
openFileRow(row);
|
||
|
|
||
|
const child = await findFileChild(row, name, index);
|
||
|
|
||
|
return findAndTraverseToPath(restOfPath.join('/'), index + 1, child);
|
||
|
};
|
||
|
|
||
|
const clickFileRowAction = (row, name) => {
|
||
|
fireEvent.mouseOver(row);
|
||
|
|
||
|
const dropdownButton = getByLabelText(row, 'Create new file or directory');
|
||
|
dropdownButton.click();
|
||
|
|
||
|
const dropdownAction = getByLabelText(dropdownButton.parentNode, name);
|
||
|
dropdownAction.click();
|
||
|
};
|
||
|
|
||
|
const findAndSetFileName = async value => {
|
||
|
const nameField = await screen.findByTestId('file-name-field');
|
||
|
fireEvent.input(nameField, { target: { value } });
|
||
|
|
||
|
const createButton = screen.getByText('Create file');
|
||
|
createButton.click();
|
||
|
};
|
||
|
|
||
|
const findAndClickRootAction = async name => {
|
||
|
const container = await findRootActions();
|
||
|
const button = getByLabelText(container, name);
|
||
|
|
||
|
button.click();
|
||
|
};
|
||
|
|
||
|
export const openFile = async path => {
|
||
|
const row = await findAndTraverseToPath(path);
|
||
|
|
||
|
openFileRow(row);
|
||
|
};
|
||
|
|
||
|
export const createFile = async (path, content) => {
|
||
|
const parentPath = path
|
||
|
.split('/')
|
||
|
.slice(0, -1)
|
||
|
.join('/');
|
||
|
|
||
|
const parentRow = await findAndTraverseToPath(parentPath);
|
||
|
|
||
|
if (parentRow) {
|
||
|
clickFileRowAction(parentRow, 'New file');
|
||
|
} else {
|
||
|
await findAndClickRootAction('New file');
|
||
|
}
|
||
|
|
||
|
await findAndSetFileName(path);
|
||
|
await findAndSetEditorValue(content);
|
||
|
};
|
||
|
|
||
|
export const deleteFile = async path => {
|
||
|
const row = await findAndTraverseToPath(path);
|
||
|
clickFileRowAction(row, 'Delete');
|
||
|
};
|
||
|
|
||
|
export const commit = async () => {
|
||
|
clickOnLeftSidebarTab('Commit');
|
||
|
screen.getByTestId('begin-commit-button').click();
|
||
|
|
||
|
await screen.findByLabelText(/Commit to .+ branch/).then(x => x.click());
|
||
|
|
||
|
screen.getByText('Commit').click();
|
||
|
};
|