Compare commits
81 Commits
mct6339
...
fix-duplic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d3825fc554 | ||
|
|
d42b2dd023 | ||
|
|
59ae7cddc5 | ||
|
|
321c7a3af5 | ||
|
|
609cf72bd1 | ||
|
|
a447b0ada8 | ||
|
|
5788f4cc69 | ||
|
|
f94b4e53c7 | ||
|
|
faf71f1e67 | ||
|
|
23310f85ae | ||
|
|
d80819634b | ||
|
|
483b62c152 | ||
|
|
1254279635 | ||
|
|
c768a71656 | ||
|
|
678a92bd29 | ||
|
|
34b488944a | ||
|
|
4d1dd2f51d | ||
|
|
080f7b8f4b | ||
|
|
483f2feac8 | ||
|
|
7ec2c4475b | ||
|
|
8f59b16465 | ||
|
|
36cfb1d515 | ||
|
|
2ff7132e90 | ||
|
|
d0ca398e01 | ||
|
|
59278e8a06 | ||
|
|
c8377f392b | ||
|
|
29df748f2b | ||
|
|
665ba6dae1 | ||
|
|
f39f8df4e2 | ||
|
|
4aa572d489 | ||
|
|
0b24c4f2c5 | ||
|
|
e4657f79cd | ||
|
|
f2059406e0 | ||
|
|
3e3dc7dd83 | ||
|
|
50742c4f82 | ||
|
|
2f04add2a3 | ||
|
|
0ce5060246 | ||
|
|
00353cdccf | ||
|
|
a1ac209d74 | ||
|
|
bdd8477b54 | ||
|
|
f690f36bfb | ||
|
|
e174f075df | ||
|
|
8cf12db104 | ||
|
|
453b1f3009 | ||
|
|
201c669328 | ||
|
|
1b7fb9b952 | ||
|
|
a3c5450205 | ||
|
|
8831b75c5d | ||
|
|
8fe0472af2 | ||
|
|
6cb5c47f3a | ||
|
|
eff0cc96b9 | ||
|
|
6ac7f24c63 | ||
|
|
39463c515f | ||
|
|
25c0dab346 | ||
|
|
3714958627 | ||
|
|
270a3d4f49 | ||
|
|
1dc137f95e | ||
|
|
ff3a20e446 | ||
|
|
0b3e0e7efd | ||
|
|
22cc28d733 | ||
|
|
006fa0bcc7 | ||
|
|
817d8da3e4 | ||
|
|
8df81f0ea9 | ||
|
|
1f30706d27 | ||
|
|
600890c4a6 | ||
|
|
b5002e166a | ||
|
|
39cff51db0 | ||
|
|
73734d99ea | ||
|
|
1d4cf1ff06 | ||
|
|
f388d9a548 | ||
|
|
8040b275fc | ||
|
|
0dd12bce85 | ||
|
|
9c9e0442f1 | ||
|
|
d49f057698 | ||
|
|
c74ad1279c | ||
|
|
470a451956 | ||
|
|
fa6cbb6f4d | ||
|
|
52c00cfaef | ||
|
|
96d723a424 | ||
|
|
fb4b80862e | ||
|
|
bb2c8cfa63 |
@@ -23,5 +23,5 @@ module.exports = merge(common, {
|
|||||||
__OPENMCT_ROOT_RELATIVE__: '""'
|
__OPENMCT_ROOT_RELATIVE__: '""'
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
devtool: "source-map"
|
devtool: "eval-source-map"
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Open MCT License
|
# Open MCT License
|
||||||
|
|
||||||
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, Copyright (c) 2014-2023, 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.
|
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.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
#* Open MCT, Copyright (c) 2014-2022, United States Government
|
#* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
#* as represented by the Administrator of the National Aeronautics and Space
|
#* as represented by the Administrator of the National Aeronautics and Space
|
||||||
#* Administration. All rights reserved.
|
#* Administration. All rights reserved.
|
||||||
#*
|
#*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
Open MCT, Copyright (c) 2014-2022, United States Government
|
Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
as represented by the Administrator of the National Aeronautics and Space
|
as represented by the Administrator of the National Aeronautics and Space
|
||||||
Administration. All rights reserved.
|
Administration. All rights reserved.
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -159,24 +159,26 @@ async function expandTreePaneItemByName(page, name) {
|
|||||||
* @returns {Promise<CreatedObjectInfo>} An object containing information about the newly created domain object.
|
* @returns {Promise<CreatedObjectInfo>} An object containing information about the newly created domain object.
|
||||||
*/
|
*/
|
||||||
async function createPlanFromJSON(page, { name, json, parent = 'mine' }) {
|
async function createPlanFromJSON(page, { name, json, parent = 'mine' }) {
|
||||||
|
if (!name) {
|
||||||
|
name = `Plan:${genUuid()}`;
|
||||||
|
}
|
||||||
|
|
||||||
const parentUrl = await getHashUrlToDomainObject(page, parent);
|
const parentUrl = await getHashUrlToDomainObject(page, parent);
|
||||||
|
|
||||||
// Navigate to the parent object. This is necessary to create the object
|
// Navigate to the parent object. This is necessary to create the object
|
||||||
// in the correct location, such as a folder, layout, or plot.
|
// in the correct location, such as a folder, layout, or plot.
|
||||||
await page.goto(`${parentUrl}?hideTree=true`);
|
await page.goto(`${parentUrl}?hideTree=true`);
|
||||||
|
|
||||||
//Click the Create button
|
// Click the Create button
|
||||||
await page.click('button:has-text("Create")');
|
await page.click('button:has-text("Create")');
|
||||||
|
|
||||||
// Click 'Plan' menu option
|
// Click 'Plan' menu option
|
||||||
await page.click(`li:text("Plan")`);
|
await page.click(`li:text("Plan")`);
|
||||||
|
|
||||||
// Modify the name input field of the domain object to accept 'name'
|
// Modify the name input field of the domain object to accept 'name'
|
||||||
if (name) {
|
const nameInput = page.locator('form[name="mctForm"] .first input[type="text"]');
|
||||||
const nameInput = page.locator('form[name="mctForm"] .first input[type="text"]');
|
await nameInput.fill("");
|
||||||
await nameInput.fill("");
|
await nameInput.fill(name);
|
||||||
await nameInput.fill(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Upload buffer from memory
|
// Upload buffer from memory
|
||||||
await page.locator('input#fileElem').setInputFiles({
|
await page.locator('input#fileElem').setInputFiles({
|
||||||
@@ -194,7 +196,7 @@ async function createPlanFromJSON(page, { name, json, parent = 'mine' }) {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
// Wait until the URL is updated
|
// Wait until the URL is updated
|
||||||
await page.waitForURL(`**/mine/*`);
|
await page.waitForURL(`**/${parent}/*`);
|
||||||
const uuid = await getFocusedObjectUuid(page);
|
const uuid = await getFocusedObjectUuid(page);
|
||||||
const objectUrl = await getHashUrlToDomainObject(page, uuid);
|
const objectUrl = await getHashUrlToDomainObject(page, uuid);
|
||||||
|
|
||||||
@@ -383,6 +385,25 @@ async function setEndOffset(page, offset) {
|
|||||||
await setTimeConductorOffset(page, offset, endOffsetButton);
|
await setTimeConductorOffset(page, offset, endOffsetButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects an inspector tab based on the provided tab name
|
||||||
|
*
|
||||||
|
* @param {import('@playwright/test').Page} page
|
||||||
|
* @param {String} name the name of the tab
|
||||||
|
*/
|
||||||
|
async function selectInspectorTab(page, name) {
|
||||||
|
const inspectorTabs = page.getByRole('tablist');
|
||||||
|
const inspectorTab = inspectorTabs.getByTitle(name);
|
||||||
|
const inspectorTabClass = await inspectorTab.getAttribute('class');
|
||||||
|
const isSelectedInspectorTab = inspectorTabClass.includes('is-current');
|
||||||
|
|
||||||
|
// do not click a tab that is already selected or it will timeout your test
|
||||||
|
// do to a { pointer-events: none; } on selected tabs
|
||||||
|
if (!isSelectedInspectorTab) {
|
||||||
|
await inspectorTab.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line no-undef
|
// eslint-disable-next-line no-undef
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createDomainObjectWithDefaults,
|
createDomainObjectWithDefaults,
|
||||||
@@ -396,5 +417,6 @@ module.exports = {
|
|||||||
setFixedTimeMode,
|
setFixedTimeMode,
|
||||||
setRealTimeMode,
|
setRealTimeMode,
|
||||||
setStartOffset,
|
setStartOffset,
|
||||||
setEndOffset
|
setEndOffset,
|
||||||
|
selectInspectorTab
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -32,9 +32,8 @@ async function enterTextEntry(page, text) {
|
|||||||
await page.locator(NOTEBOOK_DROP_AREA).click();
|
await page.locator(NOTEBOOK_DROP_AREA).click();
|
||||||
|
|
||||||
// enter text
|
// enter text
|
||||||
await page.locator('div.c-ne__text').click();
|
await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').fill(text);
|
||||||
await page.locator('div.c-ne__text').fill(text);
|
await commitEntry(page);
|
||||||
await page.locator('div.c-ne__text').press('Enter');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,6 +50,15 @@ async function dragAndDropEmbed(page, notebookObject) {
|
|||||||
await page.click('button[title="Show selected item in tree"]');
|
await page.click('button[title="Show selected item in tree"]');
|
||||||
// Drag and drop the SWG into the notebook
|
// Drag and drop the SWG into the notebook
|
||||||
await page.dragAndDrop(`text=${swg.name}`, NOTEBOOK_DROP_AREA);
|
await page.dragAndDrop(`text=${swg.name}`, NOTEBOOK_DROP_AREA);
|
||||||
|
await commitEntry(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @param {import('@playwright/test').Page} page
|
||||||
|
*/
|
||||||
|
async function commitEntry(page) {
|
||||||
|
await page.locator('.c-ne__save-button > button').click();
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line no-undef
|
// eslint-disable-next-line no-undef
|
||||||
|
|||||||
92
e2e/helper/planningUtils.js
Normal file
92
e2e/helper/planningUtils.js
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2023, 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.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
import { expect } from '../pluginFixtures';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that the number of activities in the plan view matches the number of
|
||||||
|
* activities in the plan data within the specified time bounds. Performs an assertion
|
||||||
|
* for each activity in the plan data per group, using the earliest activity's
|
||||||
|
* start time as the start bound and the current activity's end time as the end bound.
|
||||||
|
* @param {import('@playwright/test').Page} page the page
|
||||||
|
* @param {object} plan The raw plan json to assert against
|
||||||
|
* @param {string} objectUrl The URL of the object to assert against (plan or gantt chart)
|
||||||
|
*/
|
||||||
|
export async function assertPlanActivities(page, plan, objectUrl) {
|
||||||
|
const groups = Object.keys(plan);
|
||||||
|
for (const group of groups) {
|
||||||
|
for (let i = 0; i < plan[group].length; i++) {
|
||||||
|
// Set the startBound to the start time of the first activity in the group
|
||||||
|
const startBound = plan[group][0].start;
|
||||||
|
// Set the endBound to the end time of the current activity
|
||||||
|
let endBound = plan[group][i].end;
|
||||||
|
if (endBound === startBound) {
|
||||||
|
// Prevent oddities with setting start and end bound equal
|
||||||
|
// via URL params
|
||||||
|
endBound += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch to fixed time mode with all plan events within the bounds
|
||||||
|
await page.goto(`${objectUrl}?tc.mode=fixed&tc.startBound=${startBound}&tc.endBound=${endBound}&tc.timeSystem=utc&view=plan.view`);
|
||||||
|
|
||||||
|
// Assert that the number of activities in the plan view matches the number of
|
||||||
|
// activities in the plan data within the specified time bounds
|
||||||
|
const eventCount = await page.locator('.activity-bounds').count();
|
||||||
|
expect(eventCount).toEqual(Object.values(plan)
|
||||||
|
.flat()
|
||||||
|
.filter(event =>
|
||||||
|
activitiesWithinTimeBounds(event.start, event.end, startBound, endBound)).length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the activities time bounds overlap, false otherwise.
|
||||||
|
* @param {number} start1 the start time of the first activity
|
||||||
|
* @param {number} end1 the end time of the first activity
|
||||||
|
* @param {number} start2 the start time of the second activity
|
||||||
|
* @param {number} end2 the end time of the second activity
|
||||||
|
* @returns {boolean} true if the activities overlap, false otherwise
|
||||||
|
*/
|
||||||
|
function activitiesWithinTimeBounds(start1, end1, start2, end2) {
|
||||||
|
return (start1 >= start2 && start1 <= end2)
|
||||||
|
|| (end1 >= start2 && end1 <= end2)
|
||||||
|
|| (start2 >= start1 && start2 <= end1)
|
||||||
|
|| (end2 >= start1 && end2 <= end1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Navigate to the plan view, switch to fixed time mode,
|
||||||
|
* and set the bounds to span all activities.
|
||||||
|
* @param {import('@playwright/test').Page} page
|
||||||
|
* @param {object} planJson
|
||||||
|
* @param {string} planObjectUrl
|
||||||
|
*/
|
||||||
|
export async function setBoundsToSpanAllActivities(page, planJson, planObjectUrl) {
|
||||||
|
const activities = Object.values(planJson).flat();
|
||||||
|
// Get the earliest start value
|
||||||
|
const start = Math.min(...activities.map(activity => activity.start));
|
||||||
|
// Get the latest end value
|
||||||
|
const end = Math.max(...activities.map(activity => activity.end));
|
||||||
|
// Set the start and end bounds to the earliest start and latest end
|
||||||
|
await page.goto(`${planObjectUrl}?tc.mode=fixed&tc.startBound=${start}&tc.endBound=${end}&tc.timeSystem=utc&view=plan.view`);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
1080
e2e/test-data/examplePlans/ExamplePlan_Large.json
Normal file
1080
e2e/test-data/examplePlans/ExamplePlan_Large.json
Normal file
File diff suppressed because it is too large
Load Diff
44
e2e/test-data/examplePlans/ExamplePlan_Small1.json
Normal file
44
e2e/test-data/examplePlans/ExamplePlan_Small1.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"Group 1": [
|
||||||
|
{
|
||||||
|
"name": "Past event 1",
|
||||||
|
"start": 1660320408000,
|
||||||
|
"end": 1660343797000,
|
||||||
|
"type": "Group 1",
|
||||||
|
"color": "orange",
|
||||||
|
"textColor": "white"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Past event 2",
|
||||||
|
"start": 1660406808000,
|
||||||
|
"end": 1660429160000,
|
||||||
|
"type": "Group 1",
|
||||||
|
"color": "orange",
|
||||||
|
"textColor": "white"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Past event 3",
|
||||||
|
"start": 1660493208000,
|
||||||
|
"end": 1660503981000,
|
||||||
|
"type": "Group 1",
|
||||||
|
"color": "orange",
|
||||||
|
"textColor": "white"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Past event 4",
|
||||||
|
"start": 1660579608000,
|
||||||
|
"end": 1660624108000,
|
||||||
|
"type": "Group 1",
|
||||||
|
"color": "orange",
|
||||||
|
"textColor": "white"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Past event 5",
|
||||||
|
"start": 1660666008000,
|
||||||
|
"end": 1660681529000,
|
||||||
|
"type": "Group 1",
|
||||||
|
"color": "orange",
|
||||||
|
"textColor": "white"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
38
e2e/test-data/examplePlans/ExamplePlan_Small2.json
Normal file
38
e2e/test-data/examplePlans/ExamplePlan_Small2.json
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"Group 1": [
|
||||||
|
{
|
||||||
|
"name": "Group 1 event 1",
|
||||||
|
"start": 1650320408000,
|
||||||
|
"end": 1660343797000,
|
||||||
|
"type": "Group 1",
|
||||||
|
"color": "orange",
|
||||||
|
"textColor": "white"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Group 1 event 2",
|
||||||
|
"start": 1660005808000,
|
||||||
|
"end": 1660429160000,
|
||||||
|
"type": "Group 1",
|
||||||
|
"color": "yellow",
|
||||||
|
"textColor": "white"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Group 2": [
|
||||||
|
{
|
||||||
|
"name": "Group 2 event 1",
|
||||||
|
"start": 1660320408000,
|
||||||
|
"end": 1660420408000,
|
||||||
|
"type": "Group 2",
|
||||||
|
"color": "green",
|
||||||
|
"textColor": "white"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Group 2 event 2",
|
||||||
|
"start": 1660406808000,
|
||||||
|
"end": 1690429160000,
|
||||||
|
"type": "Group 2",
|
||||||
|
"color": "blue",
|
||||||
|
"textColor": "white"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
85
e2e/tests/functional/planning/ganttChart.e2e.spec.js
Normal file
85
e2e/tests/functional/planning/ganttChart.e2e.spec.js
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2023, 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');
|
||||||
|
const { createPlanFromJSON, createDomainObjectWithDefaults, selectInspectorTab } = require('../../../appActions');
|
||||||
|
const testPlan1 = require('../../../test-data/examplePlans/ExamplePlan_Small1.json');
|
||||||
|
const testPlan2 = require('../../../test-data/examplePlans/ExamplePlan_Small2.json');
|
||||||
|
const { assertPlanActivities, setBoundsToSpanAllActivities } = require('../../../helper/planningUtils');
|
||||||
|
const { getPreciseDuration } = require('../../../../src/utils/duration');
|
||||||
|
|
||||||
|
test.describe("Gantt Chart", () => {
|
||||||
|
let ganttChart;
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
ganttChart = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Gantt Chart'
|
||||||
|
});
|
||||||
|
await createPlanFromJSON(page, {
|
||||||
|
json: testPlan1,
|
||||||
|
parent: ganttChart.uuid
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Displays all plan events", async ({ page }) => {
|
||||||
|
await page.goto(ganttChart.url);
|
||||||
|
|
||||||
|
await assertPlanActivities(page, testPlan1, ganttChart.url);
|
||||||
|
});
|
||||||
|
test("Replaces a plan with a new plan", async ({ page }) => {
|
||||||
|
await assertPlanActivities(page, testPlan1, ganttChart.url);
|
||||||
|
await createPlanFromJSON(page, {
|
||||||
|
json: testPlan2,
|
||||||
|
parent: ganttChart.uuid
|
||||||
|
});
|
||||||
|
const replaceModal = page.getByRole('dialog').filter({ hasText: "This action will replace the current Plan. Do you want to continue?" });
|
||||||
|
await expect(replaceModal).toBeVisible();
|
||||||
|
await page.getByRole('button', { name: 'OK' }).click();
|
||||||
|
|
||||||
|
await assertPlanActivities(page, testPlan2, ganttChart.url);
|
||||||
|
});
|
||||||
|
test("Can select a single activity and display its details in the inspector", async ({ page }) => {
|
||||||
|
test.slow();
|
||||||
|
await page.goto(ganttChart.url);
|
||||||
|
|
||||||
|
await setBoundsToSpanAllActivities(page, testPlan1, ganttChart.url);
|
||||||
|
|
||||||
|
const activities = Object.values(testPlan1).flat();
|
||||||
|
const activity = activities[0];
|
||||||
|
await page.locator('g').filter({ hasText: new RegExp(activity.name) }).click();
|
||||||
|
await selectInspectorTab(page, 'Activity');
|
||||||
|
|
||||||
|
const startDateTime = await page.locator('.c-inspect-properties__label:has-text("Start DateTime")+.c-inspect-properties__value').innerText();
|
||||||
|
const endDateTime = await page.locator('.c-inspect-properties__label:has-text("End DateTime")+.c-inspect-properties__value').innerText();
|
||||||
|
const duration = await page.locator('.c-inspect-properties__label:has-text("duration")+.c-inspect-properties__value').innerText();
|
||||||
|
|
||||||
|
const expectedStartDate = new Date(activity.start).toISOString();
|
||||||
|
const actualStartDate = new Date(startDateTime).toISOString();
|
||||||
|
const expectedEndDate = new Date(activity.end).toISOString();
|
||||||
|
const actualEndDate = new Date(endDateTime).toISOString();
|
||||||
|
const expectedDuration = getPreciseDuration(activity.end - activity.start);
|
||||||
|
const actualDuration = duration;
|
||||||
|
|
||||||
|
expect(expectedStartDate).toEqual(actualStartDate);
|
||||||
|
expect(expectedEndDate).toEqual(actualEndDate);
|
||||||
|
expect(expectedDuration).toEqual(actualDuration);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -19,69 +19,21 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
const { test, expect } = require('../../../pluginFixtures');
|
const { test } = require('../../../pluginFixtures');
|
||||||
const { createPlanFromJSON } = require('../../../appActions');
|
const { createPlanFromJSON } = require('../../../appActions');
|
||||||
|
const testPlan1 = require('../../../test-data/examplePlans/ExamplePlan_Small1.json');
|
||||||
const testPlan = {
|
const { assertPlanActivities } = require('../../../helper/planningUtils');
|
||||||
"TEST_GROUP": [
|
|
||||||
{
|
|
||||||
"name": "Past event 1",
|
|
||||||
"start": 1660320408000,
|
|
||||||
"end": 1660343797000,
|
|
||||||
"type": "TEST-GROUP",
|
|
||||||
"color": "orange",
|
|
||||||
"textColor": "white"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Past event 2",
|
|
||||||
"start": 1660406808000,
|
|
||||||
"end": 1660429160000,
|
|
||||||
"type": "TEST-GROUP",
|
|
||||||
"color": "orange",
|
|
||||||
"textColor": "white"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Past event 3",
|
|
||||||
"start": 1660493208000,
|
|
||||||
"end": 1660503981000,
|
|
||||||
"type": "TEST-GROUP",
|
|
||||||
"color": "orange",
|
|
||||||
"textColor": "white"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Past event 4",
|
|
||||||
"start": 1660579608000,
|
|
||||||
"end": 1660624108000,
|
|
||||||
"type": "TEST-GROUP",
|
|
||||||
"color": "orange",
|
|
||||||
"textColor": "white"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Past event 5",
|
|
||||||
"start": 1660666008000,
|
|
||||||
"end": 1660681529000,
|
|
||||||
"type": "TEST-GROUP",
|
|
||||||
"color": "orange",
|
|
||||||
"textColor": "white"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
test.describe("Plan", () => {
|
test.describe("Plan", () => {
|
||||||
test("Create a Plan and display all plan events @unstable", async ({ page }) => {
|
let plan;
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
await page.goto('./', { waitUntil: 'networkidle' });
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
plan = await createPlanFromJSON(page, {
|
||||||
const plan = await createPlanFromJSON(page, {
|
json: testPlan1
|
||||||
name: 'Test Plan',
|
|
||||||
json: testPlan
|
|
||||||
});
|
});
|
||||||
const startBound = testPlan.TEST_GROUP[0].start;
|
});
|
||||||
const endBound = testPlan.TEST_GROUP[testPlan.TEST_GROUP.length - 1].end;
|
|
||||||
|
|
||||||
// Switch to fixed time mode with all plan events within the bounds
|
test("Displays all plan events", async ({ page }) => {
|
||||||
await page.goto(`${plan.url}?tc.mode=fixed&tc.startBound=${startBound}&tc.endBound=${endBound}&tc.timeSystem=utc&view=plan.view`);
|
await assertPlanActivities(page, testPlan1, plan.url);
|
||||||
const eventCount = await page.locator('.activity-bounds').count();
|
|
||||||
expect(eventCount).toEqual(testPlan.TEST_GROUP.length);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -52,10 +52,9 @@ test.describe.serial('Condition Set CRUD Operations on @localStorage', () => {
|
|||||||
|
|
||||||
//Set object identifier from url
|
//Set object identifier from url
|
||||||
conditionSetUrl = page.url();
|
conditionSetUrl = page.url();
|
||||||
console.log('conditionSetUrl ' + conditionSetUrl);
|
|
||||||
|
|
||||||
getConditionSetIdentifierFromUrl = conditionSetUrl.split('/').pop().split('?')[0];
|
getConditionSetIdentifierFromUrl = conditionSetUrl.split('/').pop().split('?')[0];
|
||||||
console.debug('getConditionSetIdentifierFromUrl ' + getConditionSetIdentifierFromUrl);
|
console.debug(`getConditionSetIdentifierFromUrl: ${getConditionSetIdentifierFromUrl}`);
|
||||||
await page.close();
|
await page.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -181,10 +180,11 @@ test.describe.serial('Condition Set CRUD Operations on @localStorage', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test.describe('Basic Condition Set Use', () => {
|
test.describe('Basic Condition Set Use', () => {
|
||||||
test('Can add a condition', async ({ page }) => {
|
test.beforeEach(async ({ page }) => {
|
||||||
//Navigate to baseURL
|
// Open a browser, navigate to the main page, and wait until all network events to resolve
|
||||||
await page.goto('./', { waitUntil: 'networkidle' });
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
});
|
||||||
|
test('Can add a condition', async ({ page }) => {
|
||||||
// Create a new condition set
|
// Create a new condition set
|
||||||
await createDomainObjectWithDefaults(page, {
|
await createDomainObjectWithDefaults(page, {
|
||||||
type: 'Condition Set',
|
type: 'Condition Set',
|
||||||
@@ -199,4 +199,127 @@ test.describe('Basic Condition Set Use', () => {
|
|||||||
const numOfUnnamedConditions = await page.locator('text=Unnamed Condition').count();
|
const numOfUnnamedConditions = await page.locator('text=Unnamed Condition').count();
|
||||||
expect(numOfUnnamedConditions).toEqual(1);
|
expect(numOfUnnamedConditions).toEqual(1);
|
||||||
});
|
});
|
||||||
|
test('ConditionSet should display appropriate view options', async ({ page }) => {
|
||||||
|
test.info().annotations.push({
|
||||||
|
type: 'issue',
|
||||||
|
description: 'https://github.com/nasa/openmct/issues/5924'
|
||||||
|
});
|
||||||
|
|
||||||
|
await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Sine Wave Generator',
|
||||||
|
name: "Alpha Sine Wave Generator"
|
||||||
|
});
|
||||||
|
await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Sine Wave Generator',
|
||||||
|
name: "Beta Sine Wave Generator"
|
||||||
|
});
|
||||||
|
const conditionSet1 = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Condition Set',
|
||||||
|
name: "Test Condition Set"
|
||||||
|
});
|
||||||
|
|
||||||
|
// Change the object to edit mode
|
||||||
|
await page.locator('[title="Edit"]').click();
|
||||||
|
|
||||||
|
// Expand the 'My Items' folder in the left tree
|
||||||
|
await page.goto(conditionSet1.url);
|
||||||
|
page.click('button[title="Show selected item in tree"]');
|
||||||
|
// Add the Alpha & Beta Sine Wave Generator to the Condition Set and save changes
|
||||||
|
const treePane = page.getByRole('tree', {
|
||||||
|
name: 'Main Tree'
|
||||||
|
});
|
||||||
|
const alphaGeneratorTreeItem = treePane.getByRole('treeitem', { name: "Alpha Sine Wave Generator"});
|
||||||
|
const betaGeneratorTreeItem = treePane.getByRole('treeitem', { name: "Beta Sine Wave Generator"});
|
||||||
|
const conditionCollection = page.locator('#conditionCollection');
|
||||||
|
|
||||||
|
await alphaGeneratorTreeItem.dragTo(conditionCollection);
|
||||||
|
await betaGeneratorTreeItem.dragTo(conditionCollection);
|
||||||
|
|
||||||
|
const saveButtonLocator = page.locator('button[title="Save"]');
|
||||||
|
await saveButtonLocator.click();
|
||||||
|
await page.getByRole('listitem', { name: 'Save and Finish Editing' }).click();
|
||||||
|
await page.click('button[title="Change the current view"]');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: /Lad Table/ })).toBeHidden();
|
||||||
|
await expect(page.getByRole('menuitem', { name: /Conditions View/ })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: /Plot/ })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: /Telemetry Table/ })).toBeVisible();
|
||||||
|
});
|
||||||
|
test('ConditionSet should output blank instead of the default value', async ({ page }) => {
|
||||||
|
//Navigate to baseURL
|
||||||
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
//Click the Create button
|
||||||
|
await page.click('button:has-text("Create")');
|
||||||
|
|
||||||
|
// Click the object specified by 'type'
|
||||||
|
await page.click(`li[role='menuitem']:text("Sine Wave Generator")`);
|
||||||
|
await page.getByRole('spinbutton', { name: 'Loading Delay (ms)' }).fill('8000');
|
||||||
|
const nameInput = page.locator('form[name="mctForm"] .first input[type="text"]');
|
||||||
|
await nameInput.fill("Delayed Sine Wave Generator");
|
||||||
|
|
||||||
|
// Click OK button and wait for Navigate event
|
||||||
|
await Promise.all([
|
||||||
|
page.waitForLoadState(),
|
||||||
|
page.click('[aria-label="Save"]'),
|
||||||
|
// Wait for Save Banner to appear
|
||||||
|
page.waitForSelector('.c-message-banner__message')
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Create a new condition set
|
||||||
|
await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Condition Set',
|
||||||
|
name: "Test Blank Output of Condition Set"
|
||||||
|
});
|
||||||
|
// Change the object to edit mode
|
||||||
|
await page.locator('[title="Edit"]').click();
|
||||||
|
|
||||||
|
// Click Add Condition button twice
|
||||||
|
await page.locator('#addCondition').click();
|
||||||
|
await page.locator('#addCondition').click();
|
||||||
|
await page.locator('#conditionCollection').getByRole('textbox').nth(0).fill('First Condition');
|
||||||
|
await page.locator('#conditionCollection').getByRole('textbox').nth(1).fill('Second Condition');
|
||||||
|
|
||||||
|
// Expand the 'My Items' folder in the left tree
|
||||||
|
await page.locator('.c-tree__item__view-control.c-disclosure-triangle').first().click();
|
||||||
|
// Add the Sine Wave Generator to the Condition Set and save changes
|
||||||
|
const treePane = page.getByRole('tree', {
|
||||||
|
name: 'Main Tree'
|
||||||
|
});
|
||||||
|
const sineWaveGeneratorTreeItem = treePane.getByRole('treeitem', { name: "Delayed Sine Wave Generator"});
|
||||||
|
const conditionCollection = await page.locator('#conditionCollection');
|
||||||
|
|
||||||
|
await sineWaveGeneratorTreeItem.dragTo(conditionCollection);
|
||||||
|
|
||||||
|
const firstCriterionTelemetry = await page.locator('[aria-label="Criterion Telemetry Selection"] >> nth=0');
|
||||||
|
firstCriterionTelemetry.selectOption({ label: 'Delayed Sine Wave Generator' });
|
||||||
|
|
||||||
|
const secondCriterionTelemetry = await page.locator('[aria-label="Criterion Telemetry Selection"] >> nth=1');
|
||||||
|
secondCriterionTelemetry.selectOption({ label: 'Delayed Sine Wave Generator' });
|
||||||
|
|
||||||
|
const firstCriterionMetadata = await page.locator('[aria-label="Criterion Metadata Selection"] >> nth=0');
|
||||||
|
firstCriterionMetadata.selectOption({ label: 'Sine' });
|
||||||
|
|
||||||
|
const secondCriterionMetadata = await page.locator('[aria-label="Criterion Metadata Selection"] >> nth=1');
|
||||||
|
secondCriterionMetadata.selectOption({ label: 'Sine' });
|
||||||
|
|
||||||
|
const firstCriterionComparison = await page.locator('[aria-label="Criterion Comparison Selection"] >> nth=0');
|
||||||
|
firstCriterionComparison.selectOption({ label: 'is greater than or equal to' });
|
||||||
|
|
||||||
|
const secondCriterionComparison = await page.locator('[aria-label="Criterion Comparison Selection"] >> nth=1');
|
||||||
|
secondCriterionComparison.selectOption({ label: 'is less than' });
|
||||||
|
|
||||||
|
const firstCriterionInput = await page.locator('[aria-label="Criterion Input"] >> nth=0');
|
||||||
|
await firstCriterionInput.fill("0");
|
||||||
|
|
||||||
|
const secondCriterionInput = await page.locator('[aria-label="Criterion Input"] >> nth=1');
|
||||||
|
await secondCriterionInput.fill("0");
|
||||||
|
|
||||||
|
const saveButtonLocator = page.locator('button[title="Save"]');
|
||||||
|
await saveButtonLocator.click();
|
||||||
|
await page.getByRole('listitem', { name: 'Save and Finish Editing' }).click();
|
||||||
|
|
||||||
|
const outputValue = await page.locator('[aria-label="Current Output Value"]');
|
||||||
|
await expect(outputValue).toHaveText('---');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -29,8 +29,8 @@ const { waitForAnimations } = require('../../../../baseFixtures');
|
|||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
|
const { createDomainObjectWithDefaults } = require('../../../../appActions');
|
||||||
const backgroundImageSelector = '.c-imagery__main-image__background-image';
|
const backgroundImageSelector = '.c-imagery__main-image__background-image';
|
||||||
const panHotkey = process.platform === 'linux' ? ['Control', 'Alt'] : ['Alt'];
|
const panHotkey = process.platform === 'linux' ? ['Shift', 'Alt'] : ['Alt'];
|
||||||
const expectedAltText = process.platform === 'linux' ? 'Ctrl+Alt drag to pan' : 'Alt drag to pan';
|
const expectedAltText = process.platform === 'linux' ? 'Shift+Alt drag to pan' : 'Alt drag to pan';
|
||||||
const thumbnailUrlParamsRegexp = /\?w=100&h=100/;
|
const thumbnailUrlParamsRegexp = /\?w=100&h=100/;
|
||||||
|
|
||||||
//The following block of tests verifies the basic functionality of example imagery and serves as a template for Imagery objects embedded in other objects.
|
//The following block of tests verifies the basic functionality of example imagery and serves as a template for Imagery objects embedded in other objects.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -21,7 +21,120 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
const { createDomainObjectWithDefaults, setStartOffset, setFixedTimeMode, setRealTimeMode } = require('../../../../appActions');
|
const { createDomainObjectWithDefaults, setStartOffset, setFixedTimeMode, setRealTimeMode, selectInspectorTab } = require('../../../../appActions');
|
||||||
|
|
||||||
|
test.describe('Testing LAD table configuration', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
// Create LAD table
|
||||||
|
const ladTable = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'LAD Table',
|
||||||
|
name: "Test LAD Table"
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create Sine Wave Generator
|
||||||
|
await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Sine Wave Generator',
|
||||||
|
name: "Test Sine Wave Generator",
|
||||||
|
parent: ladTable.uuid
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.goto(ladTable.url);
|
||||||
|
});
|
||||||
|
test('in edit mode, LAD Tables provide ability to hide columns', async ({ page }) => {
|
||||||
|
// Edit LAD table
|
||||||
|
await page.locator('[title="Edit"]').click();
|
||||||
|
|
||||||
|
// // Expand the 'My Items' folder in the left tree
|
||||||
|
// await page.locator('.c-tree__item__view-control.c-disclosure-triangle').click();
|
||||||
|
// // Add the Sine Wave Generator to the LAD table and save changes
|
||||||
|
// await page.dragAndDrop('role=treeitem[name=/Test Sine Wave Generator/]', '.c-lad-table-wrapper');
|
||||||
|
// select configuration tab in inspector
|
||||||
|
await selectInspectorTab(page, 'LAD Table Configuration');
|
||||||
|
|
||||||
|
// make sure headers are visible initially
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
|
||||||
|
|
||||||
|
// hide timestamp column
|
||||||
|
await page.getByLabel('Timestamp').uncheck();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
|
||||||
|
|
||||||
|
// hide units & type column
|
||||||
|
await page.getByLabel('Units').uncheck();
|
||||||
|
await page.getByLabel('Type').uncheck();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
|
||||||
|
|
||||||
|
// save and reload and verify they columns are still hidden
|
||||||
|
await page.locator('button[title="Save"]').click();
|
||||||
|
await page.locator('text=Save and Finish Editing').click();
|
||||||
|
await page.reload();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
|
||||||
|
|
||||||
|
// Edit LAD table
|
||||||
|
await page.locator('[title="Edit"]').click();
|
||||||
|
await selectInspectorTab(page, 'LAD Table Configuration');
|
||||||
|
|
||||||
|
// show timestamp column
|
||||||
|
await page.getByLabel('Timestamp').check();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
|
||||||
|
|
||||||
|
// save and reload and make sure only timestamp is still visible
|
||||||
|
await page.locator('button[title="Save"]').click();
|
||||||
|
await page.locator('text=Save and Finish Editing').click();
|
||||||
|
await page.reload();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeHidden();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
|
||||||
|
|
||||||
|
// Edit LAD table
|
||||||
|
await page.locator('[title="Edit"]').click();
|
||||||
|
await selectInspectorTab(page, 'LAD Table Configuration');
|
||||||
|
|
||||||
|
// show units and type columns
|
||||||
|
await page.getByLabel('Units').check();
|
||||||
|
await page.getByLabel('Type').check();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
|
||||||
|
|
||||||
|
// save and reload and make sure all columns are still visible
|
||||||
|
await page.locator('button[title="Save"]').click();
|
||||||
|
await page.locator('text=Save and Finish Editing').click();
|
||||||
|
await page.reload();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Timestamp' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Units' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'Type' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('LAD Tables don\'t allow selection of rows but does show context click menus', async ({ page }) => {
|
||||||
|
const cell = await page.locator('.js-first-data');
|
||||||
|
const userSelectable = await cell.evaluate((el) => {
|
||||||
|
return window.getComputedStyle(el).getPropertyValue('user-select');
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(userSelectable).toBe('none');
|
||||||
|
// Right-click on the LAD table row
|
||||||
|
await cell.click({
|
||||||
|
button: 'right'
|
||||||
|
});
|
||||||
|
const menuOptions = page.locator('.c-menu ul');
|
||||||
|
await expect.soft(menuOptions).toContainText('View Full Datum');
|
||||||
|
await expect.soft(menuOptions).toContainText('View Historical Data');
|
||||||
|
await expect.soft(menuOptions).toContainText('Remove');
|
||||||
|
// await page.locator('li[title="Remove this object from its containing object."]').click();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test.describe('Testing LAD table @unstable', () => {
|
test.describe('Testing LAD table @unstable', () => {
|
||||||
let sineWaveObject;
|
let sineWaveObject;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -131,13 +131,13 @@ test.describe('Notebook Tests with CouchDB @couchdb', () => {
|
|||||||
// This happens for 3 tags so 12 requests
|
// This happens for 3 tags so 12 requests
|
||||||
addingNotebookElementsRequests = [];
|
addingNotebookElementsRequests = [];
|
||||||
await page.hover('[aria-label="Tag"]:has-text("Driving")');
|
await page.hover('[aria-label="Tag"]:has-text("Driving")');
|
||||||
await page.locator('[aria-label="Tag"]:has-text("Driving") ~ .c-completed-tag-deletion').click();
|
await page.locator('[aria-label="Remove tag Driving"]').click();
|
||||||
await page.waitForSelector('[aria-label="Tag"]:has-text("Driving")', {state: 'hidden'});
|
await page.waitForSelector('[aria-label="Tag"]:has-text("Driving")', {state: 'hidden'});
|
||||||
await page.hover('[aria-label="Tag"]:has-text("Drilling")');
|
await page.hover('[aria-label="Tag"]:has-text("Drilling")');
|
||||||
await page.locator('[aria-label="Tag"]:has-text("Drilling") ~ .c-completed-tag-deletion').click();
|
await page.locator('[aria-label="Remove tag Drilling"]').click();
|
||||||
await page.waitForSelector('[aria-label="Tag"]:has-text("Drilling")', {state: 'hidden'});
|
await page.waitForSelector('[aria-label="Tag"]:has-text("Drilling")', {state: 'hidden'});
|
||||||
page.hover('[aria-label="Tag"]:has-text("Science")');
|
page.hover('[aria-label="Tag"]:has-text("Science")');
|
||||||
await page.locator('[aria-label="Tag"]:has-text("Science") ~ .c-completed-tag-deletion').click();
|
await page.locator('[aria-label="Remove tag Science"]').click();
|
||||||
await page.waitForSelector('[aria-label="Tag"]:has-text("Science")', {state: 'hidden'});
|
await page.waitForSelector('[aria-label="Tag"]:has-text("Science")', {state: 'hidden'});
|
||||||
page.waitForLoadState('networkidle');
|
page.waitForLoadState('networkidle');
|
||||||
expect(filterNonFetchRequests(addingNotebookElementsRequests).length).toBeLessThanOrEqual(12);
|
expect(filterNonFetchRequests(addingNotebookElementsRequests).length).toBeLessThanOrEqual(12);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -25,7 +25,8 @@ This test suite is dedicated to tests which verify form functionality.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
|
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
|
||||||
|
const nbUtils = require('../../../../helper/notebookUtils');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a notebook object and adds an entry.
|
* Creates a notebook object and adds an entry.
|
||||||
@@ -39,12 +40,7 @@ async function createNotebookAndEntry(page, iterations = 1) {
|
|||||||
const notebook = createDomainObjectWithDefaults(page, { type: 'Notebook' });
|
const notebook = createDomainObjectWithDefaults(page, { type: 'Notebook' });
|
||||||
|
|
||||||
for (let iteration = 0; iteration < iterations; iteration++) {
|
for (let iteration = 0; iteration < iterations; iteration++) {
|
||||||
// Create an entry
|
await nbUtils.enterTextEntry(page, `Entry ${iteration}`);
|
||||||
await page.locator('text=To start a new entry, click here or drag and drop any object').click();
|
|
||||||
const entryLocator = `[aria-label="Notebook Entry Input"] >> nth = ${iteration}`;
|
|
||||||
await page.locator(entryLocator).click();
|
|
||||||
await page.locator(entryLocator).fill(`Entry ${iteration}`);
|
|
||||||
await page.locator(entryLocator).press('Enter');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return notebook;
|
return notebook;
|
||||||
@@ -57,7 +53,7 @@ async function createNotebookAndEntry(page, iterations = 1) {
|
|||||||
*/
|
*/
|
||||||
async function createNotebookEntryAndTags(page, iterations = 1) {
|
async function createNotebookEntryAndTags(page, iterations = 1) {
|
||||||
const notebook = await createNotebookAndEntry(page, iterations);
|
const notebook = await createNotebookAndEntry(page, iterations);
|
||||||
await page.locator('text=Annotations').click();
|
await selectInspectorTab(page, 'Annotations');
|
||||||
|
|
||||||
for (let iteration = 0; iteration < iterations; iteration++) {
|
for (let iteration = 0; iteration < iterations; iteration++) {
|
||||||
// Hover and click "Add Tag" button
|
// Hover and click "Add Tag" button
|
||||||
@@ -88,7 +84,10 @@ test.describe('Tagging in Notebooks @addInit', () => {
|
|||||||
test('Can load tags', async ({ page }) => {
|
test('Can load tags', async ({ page }) => {
|
||||||
await createNotebookAndEntry(page);
|
await createNotebookAndEntry(page);
|
||||||
|
|
||||||
await page.locator('text=Annotations').click();
|
// TODO can be removed with fix for https://github.com/nasa/openmct/issues/6411
|
||||||
|
await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').click();
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Annotations');
|
||||||
|
|
||||||
await page.locator('button:has-text("Add Tag")').click();
|
await page.locator('button:has-text("Add Tag")').click();
|
||||||
|
|
||||||
@@ -111,6 +110,30 @@ test.describe('Tagging in Notebooks @addInit', () => {
|
|||||||
await expect(page.locator('[aria-label="Autocomplete Options"]')).not.toContainText("Driving");
|
await expect(page.locator('[aria-label="Autocomplete Options"]')).not.toContainText("Driving");
|
||||||
await expect(page.locator('[aria-label="Autocomplete Options"]')).toContainText("Drilling");
|
await expect(page.locator('[aria-label="Autocomplete Options"]')).toContainText("Drilling");
|
||||||
});
|
});
|
||||||
|
test('Can cancel adding tags', async ({ page }) => {
|
||||||
|
await createNotebookAndEntry(page);
|
||||||
|
|
||||||
|
// TODO can be removed with fix for https://github.com/nasa/openmct/issues/6411
|
||||||
|
await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').click();
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Annotations');
|
||||||
|
|
||||||
|
// Test canceling adding a tag after we click "Type to select tag"
|
||||||
|
await page.locator('button:has-text("Add Tag")').click();
|
||||||
|
|
||||||
|
await page.locator('[placeholder="Type to select tag"]').click();
|
||||||
|
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
||||||
|
|
||||||
|
await expect(page.locator('button:has-text("Add Tag")')).toBeVisible();
|
||||||
|
|
||||||
|
// Test canceling adding a tag after we just click "Add Tag"
|
||||||
|
await page.locator('button:has-text("Add Tag")').click();
|
||||||
|
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
||||||
|
|
||||||
|
await expect(page.locator('button:has-text("Add Tag")')).toBeVisible();
|
||||||
|
});
|
||||||
test('Can search for tags and preview works properly', async ({ page }) => {
|
test('Can search for tags and preview works properly', async ({ page }) => {
|
||||||
await createNotebookEntryAndTags(page);
|
await createNotebookEntryAndTags(page);
|
||||||
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
||||||
@@ -145,7 +168,7 @@ test.describe('Tagging in Notebooks @addInit', () => {
|
|||||||
await createNotebookEntryAndTags(page);
|
await createNotebookEntryAndTags(page);
|
||||||
// Delete Driving
|
// Delete Driving
|
||||||
await page.hover('[aria-label="Tag"]:has-text("Driving")');
|
await page.hover('[aria-label="Tag"]:has-text("Driving")');
|
||||||
await page.locator('[aria-label="Tag"]:has-text("Driving") ~ .c-completed-tag-deletion').click();
|
await page.locator('[aria-label="Remove tag Driving"]').click();
|
||||||
|
|
||||||
await expect(page.locator('[aria-label="Tags Inspector"]')).toContainText("Science");
|
await expect(page.locator('[aria-label="Tags Inspector"]')).toContainText("Science");
|
||||||
await expect(page.locator('[aria-label="Tags Inspector"]')).not.toContainText("Driving");
|
await expect(page.locator('[aria-label="Tags Inspector"]')).not.toContainText("Driving");
|
||||||
@@ -247,8 +270,10 @@ test.describe('Tagging in Notebooks @addInit', () => {
|
|||||||
test('Can cancel adding a tag', async ({ page }) => {
|
test('Can cancel adding a tag', async ({ page }) => {
|
||||||
await createNotebookAndEntry(page);
|
await createNotebookAndEntry(page);
|
||||||
|
|
||||||
// Click on Annotations tab
|
// TODO can be removed with fix for https://github.com/nasa/openmct/issues/6411
|
||||||
await page.locator('.c-inspector__tab', { hasText: "Annotations" }).click();
|
await page.locator('[aria-label="Notebook Entry"].is-selected div.c-ne__text').click();
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Annotations');
|
||||||
|
|
||||||
// Click on the "Add Tag" button
|
// Click on the "Add Tag" button
|
||||||
await page.locator('button:has-text("Add Tag")').click();
|
await page.locator('button:has-text("Add Tag")').click();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
Testsuite for plot autoscale.
|
Testsuite for plot autoscale.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const { selectInspectorTab } = require('../../../../appActions');
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
test.use({
|
test.use({
|
||||||
viewport: {
|
viewport: {
|
||||||
@@ -50,6 +51,7 @@ test.describe('Autoscale', () => {
|
|||||||
// enter edit mode
|
// enter edit mode
|
||||||
await page.click('button[title="Edit"]');
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
await turnOffAutoscale(page);
|
await turnOffAutoscale(page);
|
||||||
|
|
||||||
await setUserDefinedMinAndMax(page, '-2', '2');
|
await setUserDefinedMinAndMax(page, '-2', '2');
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 17 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 19 KiB |
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -26,6 +26,8 @@ necessarily be used for reference when writing new tests in this area.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
|
const { selectInspectorTab } = require('../../../../appActions');
|
||||||
|
|
||||||
test.describe('Log plot tests', () => {
|
test.describe('Log plot tests', () => {
|
||||||
test('Log Plot ticks are functionally correct in regular and log mode and after refresh', async ({ page, openmctConfig }) => {
|
test('Log Plot ticks are functionally correct in regular and log mode and after refresh', async ({ page, openmctConfig }) => {
|
||||||
const { myItemsFolderName } = openmctConfig;
|
const { myItemsFolderName } = openmctConfig;
|
||||||
@@ -36,6 +38,7 @@ test.describe('Log plot tests', () => {
|
|||||||
await makeOverlayPlot(page, myItemsFolderName);
|
await makeOverlayPlot(page, myItemsFolderName);
|
||||||
await testRegularTicks(page);
|
await testRegularTicks(page);
|
||||||
await enableEditMode(page);
|
await enableEditMode(page);
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
await enableLogMode(page);
|
await enableLogMode(page);
|
||||||
await testLogTicks(page);
|
await testLogTicks(page);
|
||||||
await disableLogMode(page);
|
await disableLogMode(page);
|
||||||
@@ -186,6 +189,7 @@ async function enableEditMode(page) {
|
|||||||
*/
|
*/
|
||||||
async function enableLogMode(page) {
|
async function enableLogMode(page) {
|
||||||
// turn on log mode
|
// turn on log mode
|
||||||
|
await expect(page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox')).not.toBeChecked();
|
||||||
await page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox').check();
|
await page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox').check();
|
||||||
// await page.locator('text=Y Axis Label Log mode Auto scale Padding >> input[type="checkbox"]').first().check();
|
// await page.locator('text=Y Axis Label Log mode Auto scale Padding >> input[type="checkbox"]').first().check();
|
||||||
}
|
}
|
||||||
@@ -195,6 +199,7 @@ async function enableLogMode(page) {
|
|||||||
*/
|
*/
|
||||||
async function disableLogMode(page) {
|
async function disableLogMode(page) {
|
||||||
// turn off log mode
|
// turn off log mode
|
||||||
|
await expect(page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox')).toBeChecked();
|
||||||
await page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox').uncheck();
|
await page.getByRole('listitem').filter({ hasText: 'Log mode' }).getByRole('checkbox').uncheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -26,7 +26,7 @@ necessarily be used for reference when writing new tests in this area.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
|
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
|
||||||
|
|
||||||
test.describe('Overlay Plot', () => {
|
test.describe('Overlay Plot', () => {
|
||||||
test.beforeEach(async ({ page }) => {
|
test.beforeEach(async ({ page }) => {
|
||||||
@@ -45,6 +45,8 @@ test.describe('Overlay Plot', () => {
|
|||||||
|
|
||||||
await page.goto(overlayPlot.url);
|
await page.goto(overlayPlot.url);
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
|
|
||||||
// navigate to plot series color palette
|
// navigate to plot series color palette
|
||||||
await page.click('.l-browse-bar__actions__edit');
|
await page.click('.l-browse-bar__actions__edit');
|
||||||
await page.locator('li.c-tree__item.menus-to-left .c-disclosure-triangle').click();
|
await page.locator('li.c-tree__item.menus-to-left .c-disclosure-triangle').click();
|
||||||
@@ -60,6 +62,69 @@ test.describe('Overlay Plot', () => {
|
|||||||
expect(color).toBe('rgb(255, 166, 61)');
|
expect(color).toBe('rgb(255, 166, 61)');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Limit lines persist when series is moved to another Y Axis and on refresh', async ({ page }) => {
|
||||||
|
test.info().annotations.push({
|
||||||
|
type: 'issue',
|
||||||
|
description: 'https://github.com/nasa/openmct/issues/6338'
|
||||||
|
});
|
||||||
|
// Create an Overlay Plot with a default SWG
|
||||||
|
const overlayPlot = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Overlay Plot"
|
||||||
|
});
|
||||||
|
|
||||||
|
const swgA = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Sine Wave Generator",
|
||||||
|
parent: overlayPlot.uuid
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.goto(overlayPlot.url);
|
||||||
|
|
||||||
|
// Assert that no limit lines are shown by default
|
||||||
|
await page.waitForSelector('.js-limit-area', { state: 'attached' });
|
||||||
|
expect(await page.locator('.c-plot-limit-line').count()).toBe(0);
|
||||||
|
|
||||||
|
// Enter edit mode
|
||||||
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
|
// Expand the "Sine Wave Generator" plot series options and enable limit lines
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
|
await page.getByRole('list', { name: 'Plot Series Properties' }).locator('span').first().click();
|
||||||
|
await page.getByRole('list', { name: 'Plot Series Properties' }).locator('[title="Display limit lines"]~div input').check();
|
||||||
|
|
||||||
|
await assertLimitLinesExistAndAreVisible(page);
|
||||||
|
|
||||||
|
// Save (exit edit mode)
|
||||||
|
await page.locator('button[title="Save"]').click();
|
||||||
|
await page.locator('li[title="Save and Finish Editing"]').click();
|
||||||
|
|
||||||
|
await assertLimitLinesExistAndAreVisible(page);
|
||||||
|
|
||||||
|
await page.reload();
|
||||||
|
|
||||||
|
await assertLimitLinesExistAndAreVisible(page);
|
||||||
|
|
||||||
|
// Enter edit mode
|
||||||
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Elements');
|
||||||
|
|
||||||
|
// Drag Sine Wave Generator series from Y Axis 1 into Y Axis 2
|
||||||
|
await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
|
||||||
|
|
||||||
|
await assertLimitLinesExistAndAreVisible(page);
|
||||||
|
|
||||||
|
// Save (exit edit mode)
|
||||||
|
await page.locator('button[title="Save"]').click();
|
||||||
|
await page.locator('li[title="Save and Finish Editing"]').click();
|
||||||
|
|
||||||
|
await assertLimitLinesExistAndAreVisible(page);
|
||||||
|
|
||||||
|
await page.reload();
|
||||||
|
|
||||||
|
await assertLimitLinesExistAndAreVisible(page);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
test('The elements pool supports dragging series into multiple y-axis buckets', async ({ page }) => {
|
test('The elements pool supports dragging series into multiple y-axis buckets', async ({ page }) => {
|
||||||
const overlayPlot = await createDomainObjectWithDefaults(page, {
|
const overlayPlot = await createDomainObjectWithDefaults(page, {
|
||||||
type: "Overlay Plot"
|
type: "Overlay Plot"
|
||||||
@@ -89,22 +154,7 @@ test.describe('Overlay Plot', () => {
|
|||||||
await page.goto(overlayPlot.url);
|
await page.goto(overlayPlot.url);
|
||||||
await page.click('button[title="Edit"]');
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
// Expand the elements pool vertically
|
await selectInspectorTab(page, 'Elements');
|
||||||
await page.locator('.l-pane.l-pane--vertical-handle-before', {
|
|
||||||
hasText: 'Elements'
|
|
||||||
}).locator('.l-pane__handle').hover();
|
|
||||||
await page.mouse.down();
|
|
||||||
await page.mouse.move(0, 100);
|
|
||||||
await page.mouse.up();
|
|
||||||
|
|
||||||
const yAxis1PropertyGroup = page.locator('[aria-label="Y Axis Properties"]');
|
|
||||||
const yAxis2PropertyGroup = page.locator('[aria-label="Y Axis 2 Properties"]');
|
|
||||||
const yAxis3PropertyGroup = page.locator('[aria-label="Y Axis 3 Properties"]');
|
|
||||||
|
|
||||||
// Assert that Y Axis 1 property group is visible only
|
|
||||||
await expect(yAxis1PropertyGroup).toBeVisible();
|
|
||||||
await expect(yAxis2PropertyGroup).toBeHidden();
|
|
||||||
await expect(yAxis3PropertyGroup).toBeHidden();
|
|
||||||
|
|
||||||
// Drag swg a, c, e into Y Axis 2
|
// Drag swg a, c, e into Y Axis 2
|
||||||
await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
|
await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
|
||||||
@@ -112,6 +162,12 @@ test.describe('Overlay Plot', () => {
|
|||||||
await page.locator(`#inspector-elements-tree >> text=${swgE.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
|
await page.locator(`#inspector-elements-tree >> text=${swgE.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 2"]'));
|
||||||
|
|
||||||
// Assert that Y Axis 1 and Y Axis 2 property groups are visible only
|
// Assert that Y Axis 1 and Y Axis 2 property groups are visible only
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
|
|
||||||
|
const yAxis1PropertyGroup = page.locator('[aria-label="Y Axis Properties"]');
|
||||||
|
const yAxis2PropertyGroup = page.locator('[aria-label="Y Axis 2 Properties"]');
|
||||||
|
const yAxis3PropertyGroup = page.locator('[aria-label="Y Axis 3 Properties"]');
|
||||||
|
|
||||||
await expect(yAxis1PropertyGroup).toBeVisible();
|
await expect(yAxis1PropertyGroup).toBeVisible();
|
||||||
await expect(yAxis2PropertyGroup).toBeVisible();
|
await expect(yAxis2PropertyGroup).toBeVisible();
|
||||||
await expect(yAxis3PropertyGroup).toBeHidden();
|
await expect(yAxis3PropertyGroup).toBeHidden();
|
||||||
@@ -120,15 +176,21 @@ test.describe('Overlay Plot', () => {
|
|||||||
const yAxis2Group = page.getByLabel("Y Axis 2");
|
const yAxis2Group = page.getByLabel("Y Axis 2");
|
||||||
const yAxis3Group = page.getByLabel("Y Axis 3");
|
const yAxis3Group = page.getByLabel("Y Axis 3");
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Elements');
|
||||||
|
|
||||||
// Drag swg b into Y Axis 3
|
// Drag swg b into Y Axis 3
|
||||||
await page.locator(`#inspector-elements-tree >> text=${swgB.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 3"]'));
|
await page.locator(`#inspector-elements-tree >> text=${swgB.name}`).dragTo(page.locator('[aria-label="Element Item Group Y Axis 3"]'));
|
||||||
|
|
||||||
// Assert that all Y Axis property groups are visible
|
// Assert that all Y Axis property groups are visible
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
|
|
||||||
await expect(yAxis1PropertyGroup).toBeVisible();
|
await expect(yAxis1PropertyGroup).toBeVisible();
|
||||||
await expect(yAxis2PropertyGroup).toBeVisible();
|
await expect(yAxis2PropertyGroup).toBeVisible();
|
||||||
await expect(yAxis3PropertyGroup).toBeVisible();
|
await expect(yAxis3PropertyGroup).toBeVisible();
|
||||||
|
|
||||||
// Verify that the elements are in the correct buckets and in the correct order
|
// Verify that the elements are in the correct buckets and in the correct order
|
||||||
|
await selectInspectorTab(page, 'Elements');
|
||||||
|
|
||||||
expect(yAxis1Group.getByRole('listitem', { name: swgD.name })).toBeTruthy();
|
expect(yAxis1Group.getByRole('listitem', { name: swgD.name })).toBeTruthy();
|
||||||
expect(yAxis1Group.getByRole('listitem').nth(0).getByText(swgD.name)).toBeTruthy();
|
expect(yAxis1Group.getByRole('listitem').nth(0).getByText(swgD.name)).toBeTruthy();
|
||||||
expect(yAxis2Group.getByRole('listitem', { name: swgE.name })).toBeTruthy();
|
expect(yAxis2Group.getByRole('listitem', { name: swgE.name })).toBeTruthy();
|
||||||
@@ -154,8 +216,10 @@ test.describe('Overlay Plot', () => {
|
|||||||
await page.goto(overlayPlot.url);
|
await page.goto(overlayPlot.url);
|
||||||
await page.click('button[title="Edit"]');
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Elements');
|
||||||
|
|
||||||
await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).click();
|
await page.locator(`#inspector-elements-tree >> text=${swgA.name}`).click();
|
||||||
await page.locator('.js-overlay canvas').nth(1);
|
|
||||||
const plotPixelSize = await getCanvasPixelsWithData(page);
|
const plotPixelSize = await getCanvasPixelsWithData(page);
|
||||||
expect(plotPixelSize).toBeGreaterThan(0);
|
expect(plotPixelSize).toBeGreaterThan(0);
|
||||||
});
|
});
|
||||||
@@ -198,3 +262,20 @@ async function getCanvasPixelsWithData(page) {
|
|||||||
|
|
||||||
return getTelemValuePromise;
|
return getTelemValuePromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import('@playwright/test').Page} page
|
||||||
|
*/
|
||||||
|
async function assertLimitLinesExistAndAreVisible(page) {
|
||||||
|
// Wait for plot series data to load
|
||||||
|
await expect(page.locator('.js-series-data-loaded')).toBeVisible();
|
||||||
|
// Wait for limit lines to be created
|
||||||
|
await page.waitForSelector('.js-limit-area', { state: 'attached' });
|
||||||
|
const limitLineCount = await page.locator('.c-plot-limit-line').count();
|
||||||
|
// There should be 10 limit lines created by default
|
||||||
|
expect(await page.locator('.c-plot-limit-line').count()).toBe(10);
|
||||||
|
for (let i = 0; i < limitLineCount; i++) {
|
||||||
|
await expect(page.locator('.c-plot-limit-line').nth(i)).toBeVisible();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -25,6 +25,7 @@ Tests to verify log plot functionality. Note this test suite if very much under
|
|||||||
necessarily be used for reference when writing new tests in this area.
|
necessarily be used for reference when writing new tests in this area.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const { selectInspectorTab } = require('../../../../appActions');
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
|
|
||||||
test.describe('Legend color in sync with plot color', () => {
|
test.describe('Legend color in sync with plot color', () => {
|
||||||
@@ -33,6 +34,8 @@ test.describe('Legend color in sync with plot color', () => {
|
|||||||
|
|
||||||
// navigate to plot series color palette
|
// navigate to plot series color palette
|
||||||
await page.click('.l-browse-bar__actions__edit');
|
await page.click('.l-browse-bar__actions__edit');
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
|
|
||||||
await page.locator('li.c-tree__item.menus-to-left .c-disclosure-triangle').click();
|
await page.locator('li.c-tree__item.menus-to-left .c-disclosure-triangle').click();
|
||||||
await page.locator('.c-click-swatch--menu').click();
|
await page.locator('.c-click-swatch--menu').click();
|
||||||
await page.locator('.c-palette__item[style="background: rgb(255, 166, 61);"]').click();
|
await page.locator('.c-palette__item[style="background: rgb(255, 166, 61);"]').click();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
|
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
|
||||||
const uuid = require('uuid').v4;
|
const uuid = require('uuid').v4;
|
||||||
|
|
||||||
test.describe('Scatter Plot', () => {
|
test.describe('Scatter Plot', () => {
|
||||||
@@ -40,8 +40,8 @@ test.describe('Scatter Plot', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('Can add and remove telemetry sources', async ({ page }) => {
|
test('Can add and remove telemetry sources', async ({ page }) => {
|
||||||
const editButtonLocator = page.locator('button[title="Edit"]');
|
const editButton = page.locator('button[title="Edit"]');
|
||||||
const saveButtonLocator = page.locator('button[title="Save"]');
|
const saveButton = page.locator('button[title="Save"]');
|
||||||
|
|
||||||
// Create a sine wave generator within the scatter plot
|
// Create a sine wave generator within the scatter plot
|
||||||
const swg1 = await createDomainObjectWithDefaults(page, {
|
const swg1 = await createDomainObjectWithDefaults(page, {
|
||||||
@@ -53,9 +53,10 @@ test.describe('Scatter Plot', () => {
|
|||||||
// Navigate to the scatter plot and verify that
|
// Navigate to the scatter plot and verify that
|
||||||
// the SWG appears in the elements pool
|
// the SWG appears in the elements pool
|
||||||
await page.goto(scatterPlot.url);
|
await page.goto(scatterPlot.url);
|
||||||
await editButtonLocator.click();
|
await editButton.click();
|
||||||
|
await selectInspectorTab(page, 'Elements');
|
||||||
await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg1.name}`)).toBeVisible();
|
await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg1.name}`)).toBeVisible();
|
||||||
await saveButtonLocator.click();
|
await saveButton.click();
|
||||||
await page.locator('li[title="Save and Finish Editing"]').click();
|
await page.locator('li[title="Save and Finish Editing"]').click();
|
||||||
|
|
||||||
// Create another sine wave generator within the scatter plot
|
// Create another sine wave generator within the scatter plot
|
||||||
@@ -72,10 +73,13 @@ test.describe('Scatter Plot', () => {
|
|||||||
// Navigate to the scatter plot and verify that the new SWG
|
// Navigate to the scatter plot and verify that the new SWG
|
||||||
// appears in the elements pool and the old one is gone
|
// appears in the elements pool and the old one is gone
|
||||||
await page.goto(scatterPlot.url);
|
await page.goto(scatterPlot.url);
|
||||||
await editButtonLocator.click();
|
await editButton.click();
|
||||||
|
|
||||||
|
// Click the "Elements" tab
|
||||||
|
await selectInspectorTab(page, 'Elements');
|
||||||
await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg1.name}`)).toBeHidden();
|
await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg1.name}`)).toBeHidden();
|
||||||
await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg2.name}`)).toBeVisible();
|
await expect.soft(page.locator(`#inspector-elements-tree >> text=${swg2.name}`)).toBeVisible();
|
||||||
await saveButtonLocator.click();
|
await saveButton.click();
|
||||||
|
|
||||||
// Right click on the new SWG in the elements pool and delete it
|
// Right click on the new SWG in the elements pool and delete it
|
||||||
await page.locator(`#inspector-elements-tree >> text=${swg2.name}`).click({
|
await page.locator(`#inspector-elements-tree >> text=${swg2.name}`).click({
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -26,7 +26,7 @@ necessarily be used for reference when writing new tests in this area.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const { test, expect } = require('../../../../pluginFixtures');
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
const { createDomainObjectWithDefaults } = require('../../../../appActions');
|
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../../../appActions');
|
||||||
|
|
||||||
test.describe('Stacked Plot', () => {
|
test.describe('Stacked Plot', () => {
|
||||||
let stackedPlot;
|
let stackedPlot;
|
||||||
@@ -35,8 +35,9 @@ test.describe('Stacked Plot', () => {
|
|||||||
let swgC;
|
let swgC;
|
||||||
|
|
||||||
test.beforeEach(async ({ page }) => {
|
test.beforeEach(async ({ page }) => {
|
||||||
//Open a browser, navigate to the main page, and wait until all networkevents to resolve
|
// Open a browser, navigate to the main page, and wait until all networkevents to resolve
|
||||||
await page.goto('/', { waitUntil: 'networkidle' });
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
stackedPlot = await createDomainObjectWithDefaults(page, {
|
stackedPlot = await createDomainObjectWithDefaults(page, {
|
||||||
type: "Stacked Plot"
|
type: "Stacked Plot"
|
||||||
});
|
});
|
||||||
@@ -64,11 +65,7 @@ test.describe('Stacked Plot', () => {
|
|||||||
|
|
||||||
await page.click('button[title="Edit"]');
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
// Expand the elements pool vertically
|
await selectInspectorTab(page, 'Elements');
|
||||||
await page.locator('.l-pane__handle').nth(2).hover({ trial: true });
|
|
||||||
await page.mouse.down();
|
|
||||||
await page.mouse.move(0, 100);
|
|
||||||
await page.mouse.up();
|
|
||||||
|
|
||||||
await swgBElementsPoolItem.click({ button: 'right' });
|
await swgBElementsPoolItem.click({ button: 'right' });
|
||||||
await page.getByRole('menuitem').filter({ hasText: /Remove/ }).click();
|
await page.getByRole('menuitem').filter({ hasText: /Remove/ }).click();
|
||||||
@@ -82,9 +79,60 @@ test.describe('Stacked Plot', () => {
|
|||||||
await expect(swgCElementsPoolItem).toHaveCount(1);
|
await expect(swgCElementsPoolItem).toHaveCount(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Can reorder Stacked Plot items', async ({ page }) => {
|
||||||
|
const swgAElementsPoolItem = page.locator('#inspector-elements-tree').locator('.c-object-label', { hasText: swgA.name });
|
||||||
|
const swgBElementsPoolItem = page.locator('#inspector-elements-tree').locator('.c-object-label', { hasText: swgB.name });
|
||||||
|
const swgCElementsPoolItem = page.locator('#inspector-elements-tree').locator('.c-object-label', { hasText: swgC.name });
|
||||||
|
|
||||||
|
await page.goto(stackedPlot.url);
|
||||||
|
|
||||||
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Elements');
|
||||||
|
|
||||||
|
const stackedPlotItem1 = page.locator('.c-plot--stacked-container').nth(0);
|
||||||
|
const stackedPlotItem2 = page.locator('.c-plot--stacked-container').nth(1);
|
||||||
|
const stackedPlotItem3 = page.locator('.c-plot--stacked-container').nth(2);
|
||||||
|
|
||||||
|
// assert initial plot order - [swgA, swgB, swgC]
|
||||||
|
await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
|
||||||
|
await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
|
||||||
|
await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
|
||||||
|
|
||||||
|
// Drag and drop to reorder - [swgB, swgA, swgC]
|
||||||
|
await swgBElementsPoolItem.dragTo(swgAElementsPoolItem);
|
||||||
|
|
||||||
|
// assert plot order after reorder - [swgB, swgA, swgC]
|
||||||
|
await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
|
||||||
|
await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
|
||||||
|
await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
|
||||||
|
|
||||||
|
// Drag and drop to reorder - [swgB, swgC, swgA]
|
||||||
|
await swgCElementsPoolItem.dragTo(swgAElementsPoolItem);
|
||||||
|
|
||||||
|
// assert plot order after second reorder - [swgB, swgC, swgA]
|
||||||
|
await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
|
||||||
|
await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
|
||||||
|
await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
|
||||||
|
|
||||||
|
// collapse inspector
|
||||||
|
await page.locator('.l-shell__pane-inspector .l-pane__collapse-button').click();
|
||||||
|
|
||||||
|
// Save (exit edit mode)
|
||||||
|
await page.locator('button[title="Save"]').click();
|
||||||
|
await page.locator('li[title="Save and Finish Editing"]').click();
|
||||||
|
|
||||||
|
// assert plot order persists after save - [swgB, swgC, swgA]
|
||||||
|
await expect(stackedPlotItem1).toHaveAttribute('aria-label', `Stacked Plot Item ${swgB.name}`);
|
||||||
|
await expect(stackedPlotItem2).toHaveAttribute('aria-label', `Stacked Plot Item ${swgC.name}`);
|
||||||
|
await expect(stackedPlotItem3).toHaveAttribute('aria-label', `Stacked Plot Item ${swgA.name}`);
|
||||||
|
});
|
||||||
|
|
||||||
test('Selecting a child plot while in browse and edit modes shows its properties in the inspector', async ({ page }) => {
|
test('Selecting a child plot while in browse and edit modes shows its properties in the inspector', async ({ page }) => {
|
||||||
await page.goto(stackedPlot.url);
|
await page.goto(stackedPlot.url);
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
|
|
||||||
// Click on the 1st plot
|
// Click on the 1st plot
|
||||||
await page.locator(`[aria-label="Stacked Plot Item ${swgA.name}"] canvas`).nth(1).click();
|
await page.locator(`[aria-label="Stacked Plot Item ${swgA.name}"] canvas`).nth(1).click();
|
||||||
|
|
||||||
@@ -112,6 +160,8 @@ test.describe('Stacked Plot', () => {
|
|||||||
// Go into edit mode
|
// Go into edit mode
|
||||||
await page.click('button[title="Edit"]');
|
await page.click('button[title="Edit"]');
|
||||||
|
|
||||||
|
await selectInspectorTab(page, 'Config');
|
||||||
|
|
||||||
// Click on canvas for the 1st plot
|
// Click on canvas for the 1st plot
|
||||||
await page.locator(`[aria-label="Stacked Plot Item ${swgA.name}"]`).click();
|
await page.locator(`[aria-label="Stacked Plot Item ${swgA.name}"]`).click();
|
||||||
|
|
||||||
|
|||||||
267
e2e/tests/functional/plugins/plot/tagging.e2e.spec.js
Normal file
267
e2e/tests/functional/plugins/plot/tagging.e2e.spec.js
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2023, 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.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tests to verify plot tagging functionality.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { test, expect } = require('../../../../pluginFixtures');
|
||||||
|
const { createDomainObjectWithDefaults, setRealTimeMode, setFixedTimeMode } = require('../../../../appActions');
|
||||||
|
|
||||||
|
test.describe('Plot Tagging', () => {
|
||||||
|
/**
|
||||||
|
* Given a canvas and a set of points, tags the points on the canvas.
|
||||||
|
* @param {import('@playwright/test').Page} page
|
||||||
|
* @param {HTMLCanvasElement} canvas a telemetry item with a plot
|
||||||
|
* @param {Number} xEnd a telemetry item with a plot
|
||||||
|
* @param {Number} yEnd a telemetry item with a plot
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
async function createTags({page, canvas, xEnd, yEnd}) {
|
||||||
|
await canvas.hover({trial: true});
|
||||||
|
|
||||||
|
//Alt+Shift Drag Start to select some points to tag
|
||||||
|
await page.keyboard.down('Alt');
|
||||||
|
await page.keyboard.down('Shift');
|
||||||
|
|
||||||
|
await canvas.dragTo(canvas, {
|
||||||
|
sourcePosition: {
|
||||||
|
x: 1,
|
||||||
|
y: 1
|
||||||
|
},
|
||||||
|
targetPosition: {
|
||||||
|
x: xEnd,
|
||||||
|
y: yEnd
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//Alt Drag End
|
||||||
|
await page.keyboard.up('Alt');
|
||||||
|
await page.keyboard.up('Shift');
|
||||||
|
|
||||||
|
//Wait for canvas to stablize.
|
||||||
|
await canvas.hover({trial: true});
|
||||||
|
|
||||||
|
// add some tags
|
||||||
|
await page.getByText('Annotations').click();
|
||||||
|
await page.getByRole('button', { name: /Add Tag/ }).click();
|
||||||
|
await page.getByPlaceholder('Type to select tag').click();
|
||||||
|
await page.getByText('Driving').click();
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: /Add Tag/ }).click();
|
||||||
|
await page.getByPlaceholder('Type to select tag').click();
|
||||||
|
await page.getByText('Science').click();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a telemetry item (e.g., a Sine Wave Generator) with a plot, tests that the plot can be tagged.
|
||||||
|
* @param {import('@playwright/test').Page} page
|
||||||
|
* @param {import('../../../../appActions').CreatedObjectInfo} telemetryItem a telemetry item with a plot
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
async function testTelemetryItem(page, telemetryItem) {
|
||||||
|
// Check that telemetry item also received the tag
|
||||||
|
await page.goto(telemetryItem.url);
|
||||||
|
|
||||||
|
await expect(page.getByText('No tags to display for this item')).toBeVisible();
|
||||||
|
|
||||||
|
const canvas = page.locator('canvas').nth(1);
|
||||||
|
|
||||||
|
//Wait for canvas to stablize.
|
||||||
|
await canvas.hover({trial: true});
|
||||||
|
|
||||||
|
// click on the tagged plot point
|
||||||
|
await canvas.click({
|
||||||
|
position: {
|
||||||
|
x: 325,
|
||||||
|
y: 377
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect(page.getByText('Science')).toBeVisible();
|
||||||
|
await expect(page.getByText('Driving')).toBeHidden();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a page, tests that tags are searchable, deletable, and persist across reloads.
|
||||||
|
* @param {import('@playwright/test').Page} page
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
async function basicTagsTests(page) {
|
||||||
|
// Search for Driving
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
||||||
|
|
||||||
|
// Clicking elsewhere should cause annotation selection to be cleared
|
||||||
|
await expect(page.getByText('No tags to display for this item')).toBeVisible();
|
||||||
|
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('driv');
|
||||||
|
// click on the search result
|
||||||
|
await page.getByRole('searchbox', { name: 'OpenMCT Search' }).getByText(/Sine Wave/).first().click();
|
||||||
|
|
||||||
|
// Delete Driving
|
||||||
|
await page.hover('[aria-label="Tag"]:has-text("Driving")');
|
||||||
|
await page.locator('[aria-label="Remove tag Driving"]').click();
|
||||||
|
|
||||||
|
// Search for Science
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('sc');
|
||||||
|
await expect(page.locator('[aria-label="Search Result"]').nth(0)).toContainText("Science");
|
||||||
|
await expect(page.locator('[aria-label="Search Result"]').nth(0)).not.toContainText("Drilling");
|
||||||
|
|
||||||
|
// Search for Driving
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('driv');
|
||||||
|
await expect(page.getByText('No results found')).toBeVisible();
|
||||||
|
|
||||||
|
//Reload Page
|
||||||
|
await Promise.all([
|
||||||
|
page.reload(),
|
||||||
|
page.waitForLoadState('networkidle')
|
||||||
|
]);
|
||||||
|
// wait for plots to load
|
||||||
|
await expect(page.locator('.js-series-data-loaded')).toBeVisible();
|
||||||
|
|
||||||
|
await page.getByText('Annotations').click();
|
||||||
|
await expect(page.getByText('No tags to display for this item')).toBeVisible();
|
||||||
|
|
||||||
|
const canvas = page.locator('canvas').nth(1);
|
||||||
|
// click on the tagged plot point
|
||||||
|
await canvas.click({
|
||||||
|
position: {
|
||||||
|
x: 100,
|
||||||
|
y: 100
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect(page.getByText('Science')).toBeVisible();
|
||||||
|
await expect(page.getByText('Driving')).toBeHidden();
|
||||||
|
}
|
||||||
|
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Tags work with Overlay Plots', async ({ page }) => {
|
||||||
|
//Test.slow decorator is currently broken. Needs to be fixed in https://github.com/nasa/openmct/issues/5374
|
||||||
|
test.slow();
|
||||||
|
|
||||||
|
const overlayPlot = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Overlay Plot"
|
||||||
|
});
|
||||||
|
|
||||||
|
const alphaSineWave = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Sine Wave Generator",
|
||||||
|
name: "Alpha Sine Wave",
|
||||||
|
parent: overlayPlot.uuid
|
||||||
|
});
|
||||||
|
|
||||||
|
await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Sine Wave Generator",
|
||||||
|
name: "Beta Sine Wave",
|
||||||
|
parent: overlayPlot.uuid
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.goto(overlayPlot.url);
|
||||||
|
|
||||||
|
let canvas = page.locator('canvas').nth(1);
|
||||||
|
|
||||||
|
// Switch to real-time mode
|
||||||
|
// Adding tags should pause the plot
|
||||||
|
await setRealTimeMode(page);
|
||||||
|
|
||||||
|
await createTags({
|
||||||
|
page,
|
||||||
|
canvas,
|
||||||
|
xEnd: 700,
|
||||||
|
yEnd: 480
|
||||||
|
});
|
||||||
|
|
||||||
|
await setFixedTimeMode(page);
|
||||||
|
|
||||||
|
// changing to fixed time mode rebuilds canvas?
|
||||||
|
canvas = page.locator('canvas').nth(1);
|
||||||
|
|
||||||
|
await basicTagsTests(page);
|
||||||
|
await testTelemetryItem(page, alphaSineWave);
|
||||||
|
|
||||||
|
// set to real time mode
|
||||||
|
await setRealTimeMode(page);
|
||||||
|
|
||||||
|
// Search for Science
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click();
|
||||||
|
await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('sc');
|
||||||
|
// click on the search result
|
||||||
|
await page.getByRole('searchbox', { name: 'OpenMCT Search' }).getByText('Alpha Sine Wave').first().click();
|
||||||
|
// wait for plots to load
|
||||||
|
await expect(page.locator('.js-series-data-loaded')).toBeVisible();
|
||||||
|
// expect plot to be paused
|
||||||
|
await expect(page.locator('[title="Resume displaying real-time data"]')).toBeVisible();
|
||||||
|
|
||||||
|
await setFixedTimeMode(page);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Tags work with Plot View of telemetry items', async ({ page }) => {
|
||||||
|
await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Sine Wave Generator"
|
||||||
|
});
|
||||||
|
|
||||||
|
const canvas = page.locator('canvas').nth(1);
|
||||||
|
await createTags({
|
||||||
|
page,
|
||||||
|
canvas,
|
||||||
|
xEnd: 700,
|
||||||
|
yEnd: 480
|
||||||
|
});
|
||||||
|
await basicTagsTests(page);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Tags work with Stacked Plots', async ({ page }) => {
|
||||||
|
const stackedPlot = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Stacked Plot"
|
||||||
|
});
|
||||||
|
|
||||||
|
const alphaSineWave = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Sine Wave Generator",
|
||||||
|
name: "Alpha Sine Wave",
|
||||||
|
parent: stackedPlot.uuid
|
||||||
|
});
|
||||||
|
|
||||||
|
await createDomainObjectWithDefaults(page, {
|
||||||
|
type: "Sine Wave Generator",
|
||||||
|
name: "Beta Sine Wave",
|
||||||
|
parent: stackedPlot.uuid
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.goto(stackedPlot.url);
|
||||||
|
|
||||||
|
const canvas = page.locator('canvas').nth(1);
|
||||||
|
|
||||||
|
await createTags({
|
||||||
|
page,
|
||||||
|
canvas,
|
||||||
|
xEnd: 700,
|
||||||
|
yEnd: 215
|
||||||
|
});
|
||||||
|
await basicTagsTests(page);
|
||||||
|
await testTelemetryItem(page, alphaSineWave);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ test.describe('Recent Objects', () => {
|
|||||||
expect(await clockBreadcrumbs.count()).toBe(2);
|
expect(await clockBreadcrumbs.count()).toBe(2);
|
||||||
expect(await clockBreadcrumbs.nth(0).innerText()).not.toEqual(await clockBreadcrumbs.nth(1).innerText());
|
expect(await clockBreadcrumbs.nth(0).innerText()).not.toEqual(await clockBreadcrumbs.nth(1).innerText());
|
||||||
});
|
});
|
||||||
test("Enforces a limit of 20 recent objects", async ({ page }) => {
|
test("Enforces a limit of 20 recent objects and clears the recent objects", async ({ page }) => {
|
||||||
// Creating 21 objects takes a while, so increase the timeout
|
// Creating 21 objects takes a while, so increase the timeout
|
||||||
test.slow();
|
test.slow();
|
||||||
|
|
||||||
@@ -242,6 +242,15 @@ test.describe('Recent Objects', () => {
|
|||||||
|
|
||||||
// Assert that the Clock treeitem is no longer highlighted
|
// Assert that the Clock treeitem is no longer highlighted
|
||||||
await expect(lastClockTreeItem.locator('.c-tree__item')).not.toHaveClass(/is-targeted-item/);
|
await expect(lastClockTreeItem.locator('.c-tree__item')).not.toHaveClass(/is-targeted-item/);
|
||||||
|
|
||||||
|
// Click the aria-label="Clear Recently Viewed" button
|
||||||
|
await page.getByRole('button', { name: 'Clear Recently Viewed' }).click();
|
||||||
|
|
||||||
|
// Click on the "OK" button in the confirmation dialog
|
||||||
|
await page.getByRole('button', { name: 'OK' }).click();
|
||||||
|
|
||||||
|
// Assert that the list is empty
|
||||||
|
expect(await recentObjectsList.locator('.c-recentobjects-listitem').count()).toBe(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
function assertInitialRecentObjectsListState() {
|
function assertInitialRecentObjectsListState() {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const { test, expect } = require('../../pluginFixtures');
|
const { test, expect } = require('../../pluginFixtures');
|
||||||
const { createDomainObjectWithDefaults } = require('../../appActions');
|
const { createDomainObjectWithDefaults, selectInspectorTab } = require('../../appActions');
|
||||||
const { v4: uuid } = require('uuid');
|
const { v4: uuid } = require('uuid');
|
||||||
|
|
||||||
test.describe('Grand Search', () => {
|
test.describe('Grand Search', () => {
|
||||||
@@ -50,7 +50,7 @@ test.describe('Grand Search', () => {
|
|||||||
await expect(page.locator('[aria-label="Search Result"] >> nth=2')).toContainText(`Clock C ${myItemsFolderName} Red Folder Blue Folder`);
|
await expect(page.locator('[aria-label="Search Result"] >> nth=2')).toContainText(`Clock C ${myItemsFolderName} Red Folder Blue Folder`);
|
||||||
await expect(page.locator('[aria-label="Search Result"] >> nth=3')).toContainText(`Clock D ${myItemsFolderName} Red Folder Blue Folder`);
|
await expect(page.locator('[aria-label="Search Result"] >> nth=3')).toContainText(`Clock D ${myItemsFolderName} Red Folder Blue Folder`);
|
||||||
// Click the Elements pool to dismiss the search menu
|
// Click the Elements pool to dismiss the search menu
|
||||||
await page.locator('.l-pane__label:has-text("Elements")').click();
|
await selectInspectorTab(page, 'Elements');
|
||||||
await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toBeHidden();
|
await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toBeHidden();
|
||||||
|
|
||||||
await page.locator('[aria-label="OpenMCT Search"] [aria-label="Search Input"]').click();
|
await page.locator('[aria-label="OpenMCT Search"] [aria-label="Search Input"]').click();
|
||||||
@@ -63,7 +63,7 @@ test.describe('Grand Search', () => {
|
|||||||
await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toContainText(`Clock A ${myItemsFolderName} Red Folder Blue Folder`);
|
await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toContainText(`Clock A ${myItemsFolderName} Red Folder Blue Folder`);
|
||||||
|
|
||||||
// Click [aria-label="OpenMCT Search"] a >> nth=0
|
// Click [aria-label="OpenMCT Search"] a >> nth=0
|
||||||
await page.locator('[aria-label="OpenMCT Search"] a').first().click();
|
await page.locator('[aria-label="Search Result"] >> nth=0').click();
|
||||||
await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toBeHidden();
|
await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toBeHidden();
|
||||||
|
|
||||||
// Fill [aria-label="OpenMCT Search"] input[type="search"]
|
// Fill [aria-label="OpenMCT Search"] input[type="search"]
|
||||||
@@ -133,6 +133,7 @@ test.describe('Grand Search', () => {
|
|||||||
const searchResults = page.locator(searchResultSelector);
|
const searchResults = page.locator(searchResultSelector);
|
||||||
|
|
||||||
// Verify that one result is found
|
// Verify that one result is found
|
||||||
|
await expect(searchResults).toBeVisible();
|
||||||
expect(await searchResults.count()).toBe(1);
|
expect(await searchResults.count()).toBe(1);
|
||||||
await expect(searchResults).toHaveText(folderName);
|
await expect(searchResults).toHaveText(folderName);
|
||||||
});
|
});
|
||||||
@@ -194,7 +195,7 @@ test.describe('Grand Search', () => {
|
|||||||
// Wait for search to finish
|
// Wait for search to finish
|
||||||
await waitForSearchCompletion(page);
|
await waitForSearchCompletion(page);
|
||||||
|
|
||||||
const searchResultDropDown = await page.locator(searchResultDropDownSelector);
|
const searchResultDropDown = page.locator(searchResultDropDownSelector);
|
||||||
|
|
||||||
// Verify that the search result/s correctly match the search query
|
// Verify that the search result/s correctly match the search query
|
||||||
await expect(searchResultDropDown).toContainText(folderName1);
|
await expect(searchResultDropDown).toContainText(folderName1);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -26,10 +26,80 @@ const {
|
|||||||
openObjectTreeContextMenu
|
openObjectTreeContextMenu
|
||||||
} = require('../../appActions.js');
|
} = require('../../appActions.js');
|
||||||
|
|
||||||
test.describe('Tree operations', () => {
|
test.describe('Main Tree', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Creating a child object within a folder and immediately opening it shows the created object in the tree @couchdb', async ({ page }) => {
|
||||||
|
test.info().annotations.push({
|
||||||
|
type: 'issue',
|
||||||
|
description: 'https://github.com/nasa/openmct/issues/5975'
|
||||||
|
});
|
||||||
|
|
||||||
|
const folder = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Folder'
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.getByTitle('Show selected item in tree').click();
|
||||||
|
|
||||||
|
const clock = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Clock',
|
||||||
|
parent: folder.uuid
|
||||||
|
});
|
||||||
|
|
||||||
|
await expandTreePaneItemByName(page, folder.name);
|
||||||
|
await assertTreeItemIsVisible(page, clock.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Creating a child object on one tab and expanding its parent on the other shows the correct composition @2p', async ({ page, openmctConfig }) => {
|
||||||
|
test.info().annotations.push({
|
||||||
|
type: 'issue',
|
||||||
|
description: 'https://github.com/nasa/openmct/issues/6391'
|
||||||
|
});
|
||||||
|
|
||||||
|
const { myItemsFolderName } = openmctConfig;
|
||||||
|
const page2 = await page.context().newPage();
|
||||||
|
|
||||||
|
// Both pages: Go to baseURL
|
||||||
|
await Promise.all([
|
||||||
|
page.goto('./', { waitUntil: 'networkidle' }),
|
||||||
|
page2.goto('./', { waitUntil: 'networkidle' })
|
||||||
|
]);
|
||||||
|
|
||||||
|
const page1Folder = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Folder'
|
||||||
|
});
|
||||||
|
|
||||||
|
await expandTreePaneItemByName(page2, myItemsFolderName);
|
||||||
|
await assertTreeItemIsVisible(page2, page1Folder.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Creating a child object on one tab and expanding its parent on the other shows the correct composition @couchdb @2p', async ({ page, openmctConfig }) => {
|
||||||
|
test.info().annotations.push({
|
||||||
|
type: 'issue',
|
||||||
|
description: 'https://github.com/nasa/openmct/issues/6391'
|
||||||
|
});
|
||||||
|
|
||||||
|
const { myItemsFolderName } = openmctConfig;
|
||||||
|
const page2 = await page.context().newPage();
|
||||||
|
|
||||||
|
// Both pages: Go to baseURL
|
||||||
|
await Promise.all([
|
||||||
|
page.goto('./', { waitUntil: 'networkidle' }),
|
||||||
|
page2.goto('./', { waitUntil: 'networkidle' })
|
||||||
|
]);
|
||||||
|
|
||||||
|
const page1Folder = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Folder'
|
||||||
|
});
|
||||||
|
|
||||||
|
await expandTreePaneItemByName(page2, myItemsFolderName);
|
||||||
|
await assertTreeItemIsVisible(page2, page1Folder.name);
|
||||||
|
});
|
||||||
|
|
||||||
test('Renaming an object reorders the tree @unstable', async ({ page, openmctConfig }) => {
|
test('Renaming an object reorders the tree @unstable', async ({ page, openmctConfig }) => {
|
||||||
const { myItemsFolderName } = openmctConfig;
|
const { myItemsFolderName } = openmctConfig;
|
||||||
await page.goto('./', { waitUntil: 'networkidle' });
|
|
||||||
|
|
||||||
await createDomainObjectWithDefaults(page, {
|
await createDomainObjectWithDefaults(page, {
|
||||||
type: 'Folder',
|
type: 'Folder',
|
||||||
@@ -111,17 +181,30 @@ async function getAndAssertTreeItems(page, expected) {
|
|||||||
expect(allTexts).toEqual(expected);
|
expect(allTexts).toEqual(expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function assertTreeItemIsVisible(page, name) {
|
||||||
|
const mainTree = page.getByRole('tree', {
|
||||||
|
name: 'Main Tree'
|
||||||
|
});
|
||||||
|
const treeItem = mainTree.getByRole('treeitem', {
|
||||||
|
name
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect(treeItem).toBeVisible();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {import('@playwright/test').Page} page
|
* @param {import('@playwright/test').Page} page
|
||||||
* @param {string} name
|
* @param {string} name
|
||||||
*/
|
*/
|
||||||
async function expandTreePaneItemByName(page, name) {
|
async function expandTreePaneItemByName(page, name) {
|
||||||
const treePane = page.getByRole('tree', {
|
const mainTree = page.getByRole('tree', {
|
||||||
name: 'Main Tree'
|
name: 'Main Tree'
|
||||||
});
|
});
|
||||||
const treeItem = treePane.locator(`role=treeitem[expanded=false][name=/${name}/]`);
|
const treeItem = mainTree.getByRole('treeitem', {
|
||||||
const expandTriangle = treeItem.locator('.c-disclosure-triangle');
|
name,
|
||||||
await expandTriangle.click();
|
expanded: false
|
||||||
|
});
|
||||||
|
await treeItem.locator('.c-disclosure-triangle').click();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -138,6 +138,7 @@ test.describe('Performance tests', () => {
|
|||||||
await page.evaluate(() => window.performance.mark("notebook-search-processed"));
|
await page.evaluate(() => window.performance.mark("notebook-search-processed"));
|
||||||
|
|
||||||
//Clear Search
|
//Clear Search
|
||||||
|
await page.locator('.c-search.c-notebook__search .c-search__input').hover();
|
||||||
await page.locator('.c-search.c-notebook__search .c-search__clear-input').click();
|
await page.locator('.c-search.c-notebook__search .c-search__clear-input').click();
|
||||||
await page.evaluate(() => window.performance.mark("notebook-search-processed"));
|
await page.evaluate(() => window.performance.mark("notebook-search-processed"));
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2023, 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.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This test is dedicated to test the blur behavior of the add tag button.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const { test } = require("../../pluginFixtures");
|
|
||||||
const percySnapshot = require('@percy/playwright');
|
|
||||||
const { createDomainObjectWithDefaults } = require('../../appActions');
|
|
||||||
|
|
||||||
test.describe("Visual - Check blur of Add Tag button", () => {
|
|
||||||
|
|
||||||
test.beforeEach(async ({ page }) => {
|
|
||||||
// Open a browser, navigate to the main page, and wait until all network events to resolve
|
|
||||||
await page.goto('./', { waitUntil: 'networkidle' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Blur 'Add tag'", async ({ page, theme }) => {
|
|
||||||
createDomainObjectWithDefaults(page, { type: 'Notebook' });
|
|
||||||
|
|
||||||
await page.locator('text=To start a new entry, click here or drag and drop any object').click();
|
|
||||||
const entryLocator = `[aria-label="Notebook Entry Input"] >> nth = 0`;
|
|
||||||
await page.locator(entryLocator).click();
|
|
||||||
await page.locator(entryLocator).fill(`Entry 0`);
|
|
||||||
await page.locator(entryLocator).press('Enter');
|
|
||||||
|
|
||||||
// Click on Annotations tab
|
|
||||||
await page.locator('.c-inspector__tab', { hasText: "Annotations" }).click();
|
|
||||||
|
|
||||||
// Take snapshot of the notebook with the Annotations tab opened
|
|
||||||
await percySnapshot(page, `Notebook Annotation (theme: '${theme}')`);
|
|
||||||
|
|
||||||
// Click on the "Add Tag" button
|
|
||||||
await page.locator('button:has-text("Add Tag")').click();
|
|
||||||
|
|
||||||
// Take snapshot of the notebook with the AutoComplete field visible
|
|
||||||
await percySnapshot(page, `Notebook Add Tag (theme: '${theme}')`);
|
|
||||||
|
|
||||||
// Click inside the AutoComplete field
|
|
||||||
await page.locator('[placeholder="Type to select tag"]').click();
|
|
||||||
|
|
||||||
// Click on the "Tags" header (simulating a click outside the autocomplete field)
|
|
||||||
await page.locator('div.c-inspect-properties__header:has-text("Tags")').click();
|
|
||||||
|
|
||||||
// Take snapshot of the notebook with the AutoComplete field hidden and with the "Add Tag" button visible
|
|
||||||
await percySnapshot(page, `Notebook Annotation de-select blur (theme: '${theme}')`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
52
e2e/tests/visual/plan.visual.spec.js
Normal file
52
e2e/tests/visual/plan.visual.spec.js
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2023, 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 } = require('../../pluginFixtures');
|
||||||
|
const { setBoundsToSpanAllActivities } = require('../../helper/planningUtils');
|
||||||
|
const { createDomainObjectWithDefaults, createPlanFromJSON } = require('../../appActions');
|
||||||
|
const percySnapshot = require('@percy/playwright');
|
||||||
|
const examplePlanLarge = require('../../test-data/examplePlans/ExamplePlan_Large.json');
|
||||||
|
|
||||||
|
test.describe('Visual - Planning', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('./', { waitUntil: 'networkidle' });
|
||||||
|
});
|
||||||
|
test('Plan View', async ({ page, theme }) => {
|
||||||
|
const plan = await createPlanFromJSON(page, {
|
||||||
|
json: examplePlanLarge
|
||||||
|
});
|
||||||
|
|
||||||
|
await setBoundsToSpanAllActivities(page, examplePlanLarge, plan.url);
|
||||||
|
await percySnapshot(page, `Plan View (theme: ${theme})`);
|
||||||
|
});
|
||||||
|
test('Gantt Chart View', async ({ page, theme }) => {
|
||||||
|
const ganttChart = await createDomainObjectWithDefaults(page, {
|
||||||
|
type: 'Gantt Chart'
|
||||||
|
});
|
||||||
|
await createPlanFromJSON(page, {
|
||||||
|
json: examplePlanLarge,
|
||||||
|
parent: ganttChart.uuid
|
||||||
|
});
|
||||||
|
await setBoundsToSpanAllActivities(page, examplePlanLarge, ganttChart.url);
|
||||||
|
await percySnapshot(page, `Gantt Chart View (theme: ${theme})`);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2022, United States Government
|
* Open MCT, Copyright (c) 2014-2023, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user