mirror of
https://github.com/nasa/openmct.git
synced 2024-12-21 14:07:50 +00:00
8d1a2e6716
* style: add `visibility` to tree expand triangles - The purpose of this is so that Playwright can perform actionability checks on the tree items. This will make operations involving expanding tree items much easier to perform in e2e. * feat(e2e): Add AppAction to expand the entire tree * fix: wait for loading indicator * test: add test for `expandEntireTree` * test: update `expandEntireTree` and tree selectors - Use dynamic aria-label for different tree implementations - Get rid of CSS ids which are only for testing - Update percy tree scope selector * chore(lint): remove unused variable * refactor(e2e): update tree locators Co-authored-by: John Hill <john.c.hill@nasa.gov>
141 lines
5.3 KiB
JavaScript
141 lines
5.3 KiB
JavaScript
/*****************************************************************************
|
|
* Open MCT, Copyright (c) 2014-2022, United States Government
|
|
* as represented by the Administrator of the National Aeronautics and Space
|
|
* Administration. All rights reserved.
|
|
*
|
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
* Open MCT includes source code licensed under additional open source
|
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
* this source code distribution or the Licensing information page available
|
|
* at runtime from the About dialog for additional information.
|
|
*****************************************************************************/
|
|
|
|
const { test, expect } = require('../../pluginFixtures.js');
|
|
const {
|
|
createDomainObjectWithDefaults,
|
|
openObjectTreeContextMenu
|
|
} = require('../../appActions.js');
|
|
|
|
test.describe('Tree operations', () => {
|
|
test('Renaming an object reorders the tree @unstable', async ({ page, openmctConfig }) => {
|
|
const { myItemsFolderName } = openmctConfig;
|
|
await page.goto('./', { waitUntil: 'networkidle' });
|
|
|
|
await createDomainObjectWithDefaults(page, {
|
|
type: 'Folder',
|
|
name: 'Foo'
|
|
});
|
|
|
|
await createDomainObjectWithDefaults(page, {
|
|
type: 'Folder',
|
|
name: 'Bar'
|
|
});
|
|
|
|
await createDomainObjectWithDefaults(page, {
|
|
type: 'Folder',
|
|
name: 'Baz'
|
|
});
|
|
|
|
const clock1 = await createDomainObjectWithDefaults(page, {
|
|
type: 'Clock',
|
|
name: 'aaa'
|
|
});
|
|
|
|
await createDomainObjectWithDefaults(page, {
|
|
type: 'Clock',
|
|
name: 'www'
|
|
});
|
|
|
|
// Expand the root folder
|
|
await expandTreePaneItemByName(page, myItemsFolderName);
|
|
|
|
await test.step("Reorders objects with the same tree depth", async () => {
|
|
await getAndAssertTreeItems(page, ['aaa', 'Bar', 'Baz', 'Foo', 'www']);
|
|
await renameObjectFromContextMenu(page, clock1.url, 'zzz');
|
|
await getAndAssertTreeItems(page, ['Bar', 'Baz', 'Foo', 'www', 'zzz']);
|
|
});
|
|
|
|
await test.step("Reorders links to objects as well as original objects", async () => {
|
|
await page.click('role=treeitem[name=/Bar/]');
|
|
await page.dragAndDrop('role=treeitem[name=/www/]', '.c-object-view');
|
|
await page.dragAndDrop('role=treeitem[name=/zzz/]', '.c-object-view');
|
|
await page.click('role=treeitem[name=/Baz/]');
|
|
await page.dragAndDrop('role=treeitem[name=/www/]', '.c-object-view');
|
|
await page.dragAndDrop('role=treeitem[name=/zzz/]', '.c-object-view');
|
|
await page.click('role=treeitem[name=/Foo/]');
|
|
await page.dragAndDrop('role=treeitem[name=/www/]', '.c-object-view');
|
|
await page.dragAndDrop('role=treeitem[name=/zzz/]', '.c-object-view');
|
|
// Expand the unopened folders
|
|
await expandTreePaneItemByName(page, 'Bar');
|
|
await expandTreePaneItemByName(page, 'Baz');
|
|
await expandTreePaneItemByName(page, 'Foo');
|
|
|
|
await renameObjectFromContextMenu(page, clock1.url, '___');
|
|
await getAndAssertTreeItems(page,
|
|
[
|
|
"___",
|
|
"Bar",
|
|
"___",
|
|
"www",
|
|
"Baz",
|
|
"___",
|
|
"www",
|
|
"Foo",
|
|
"___",
|
|
"www",
|
|
"www"
|
|
]);
|
|
});
|
|
});
|
|
});
|
|
|
|
/**
|
|
* @param {import('@playwright/test').Page} page
|
|
* @param {Array<string>} expected
|
|
*/
|
|
async function getAndAssertTreeItems(page, expected) {
|
|
const treeItems = page.locator('[role="treeitem"]');
|
|
const allTexts = await treeItems.allInnerTexts();
|
|
// Get rid of root folder ('My Items') as its position will not change
|
|
allTexts.shift();
|
|
expect(allTexts).toEqual(expected);
|
|
}
|
|
|
|
/**
|
|
* @param {import('@playwright/test').Page} page
|
|
* @param {string} name
|
|
*/
|
|
async function expandTreePaneItemByName(page, name) {
|
|
const treePane = page.getByRole('tree', {
|
|
name: 'Main Tree'
|
|
});
|
|
const treeItem = treePane.locator(`role=treeitem[expanded=false][name=/${name}/]`);
|
|
const expandTriangle = treeItem.locator('.c-disclosure-triangle');
|
|
await expandTriangle.click();
|
|
}
|
|
|
|
/**
|
|
* @param {import('@playwright/test').Page} page
|
|
* @param {string} myItemsFolderName
|
|
* @param {string} url
|
|
* @param {string} newName
|
|
*/
|
|
async function renameObjectFromContextMenu(page, url, newName) {
|
|
await openObjectTreeContextMenu(page, url);
|
|
await page.click('li:text("Edit Properties")');
|
|
const nameInput = page.locator('form[name="mctForm"] .first input[type="text"]');
|
|
await nameInput.fill("");
|
|
await nameInput.fill(newName);
|
|
await page.click('[aria-label="Save"]');
|
|
}
|