Compare commits
	
		
			1 Commits
		
	
	
		
			gds-tests-
			...
			release/2.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 064a865c9b | 
| @@ -1,212 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2022, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /* | ||||
| This test suite is dedicated to tests which verify the basic operations surrounding moving & linking objects. | ||||
| */ | ||||
|  | ||||
| const { test, expect } = require('../../pluginFixtures'); | ||||
| const { createDomainObjectWithDefaults } = require('../../appActions'); | ||||
|  | ||||
| test.describe('Move & link item tests', () => { | ||||
|     test('Create a basic object and verify that it can be moved to another folder', async ({ page, openmctConfig }) => { | ||||
|         const { myItemsFolderName } = openmctConfig; | ||||
|  | ||||
|         // Go to Open MCT | ||||
|         await page.goto('./'); | ||||
|  | ||||
|         const parentFolder = await createDomainObjectWithDefaults(page, { | ||||
|             type: 'Folder', | ||||
|             name: 'Parent Folder' | ||||
|         }); | ||||
|         const childFolder = await createDomainObjectWithDefaults(page, { | ||||
|             type: 'Folder', | ||||
|             name: 'Child Folder', | ||||
|             parent: parentFolder.uuid | ||||
|         }); | ||||
|         await createDomainObjectWithDefaults(page, { | ||||
|             type: 'Folder', | ||||
|             name: 'Grandchild Folder', | ||||
|             parent: childFolder.uuid | ||||
|         }); | ||||
|  | ||||
|         // Attempt to move parent to its own grandparent | ||||
|         await page.locator(`text=Open MCT ${myItemsFolderName} >> span`).nth(3).click(); | ||||
|         await page.locator('.c-disclosure-triangle >> nth=0').click(); | ||||
|  | ||||
|         await page.locator(`a:has-text("Parent Folder") >> nth=0`).click({ | ||||
|             button: 'right' | ||||
|         }); | ||||
|  | ||||
|         await page.locator('li.icon-move').click(); | ||||
|         await page.locator('form[name="mctForm"] >> .c-disclosure-triangle >> nth=0').click(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Parent Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('form[name="mctForm"] >> .c-disclosure-triangle >> nth=1').click(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Child Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('form[name="mctForm"] >> .c-disclosure-triangle >> nth=2').click(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Grandchild Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Parent Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('[aria-label="Cancel"]').click(); | ||||
|  | ||||
|         // Move Child Folder from Parent Folder to My Items | ||||
|         await page.locator('.c-disclosure-triangle >> nth=0').click(); | ||||
|         await page.locator('.c-disclosure-triangle >> nth=1').click(); | ||||
|  | ||||
|         await page.locator(`a:has-text("Child Folder") >> nth=0`).click({ | ||||
|             button: 'right' | ||||
|         }); | ||||
|         await page.locator('li.icon-move').click(); | ||||
|         await page.locator(`form[name="mctForm"] >> text=${myItemsFolderName}`).click(); | ||||
|  | ||||
|         await page.locator('text=OK').click(); | ||||
|  | ||||
|         // Expect that Child Folder is in My Items, the root folder | ||||
|         expect(page.locator(`text=${myItemsFolderName} >> nth=0:has(text=Child Folder)`)).toBeTruthy(); | ||||
|     }); | ||||
|     test('Create a basic object and verify that it cannot be moved to telemetry object without Composition Provider', async ({ page, openmctConfig }) => { | ||||
|         const { myItemsFolderName } = openmctConfig; | ||||
|  | ||||
|         // Go to Open MCT | ||||
|         await page.goto('./'); | ||||
|  | ||||
|         // Create Telemetry Table | ||||
|         let telemetryTable = 'Test Telemetry Table'; | ||||
|         await page.locator('button:has-text("Create")').click(); | ||||
|         await page.locator('li:has-text("Telemetry Table")').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').fill(telemetryTable); | ||||
|  | ||||
|         await page.locator('text=OK').click(); | ||||
|  | ||||
|         // Finish editing and save Telemetry Table | ||||
|         await page.locator('.c-button--menu.c-button--major.icon-save').click(); | ||||
|         await page.locator('text=Save and Finish Editing').click(); | ||||
|  | ||||
|         // Create New Folder Basic Domain Object | ||||
|         let folder = 'Test Folder'; | ||||
|         await page.locator('button:has-text("Create")').click(); | ||||
|         await page.locator('li:has-text("Folder")').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').fill(folder); | ||||
|  | ||||
|         // See if it's possible to put the folder in the Telemetry object during creation (Soft Assert) | ||||
|         await page.locator(`form[name="mctForm"] >> text=${telemetryTable}`).click(); | ||||
|         let okButton = await page.locator('button.c-button.c-button--major:has-text("OK")'); | ||||
|         let okButtonStateDisabled = await okButton.isDisabled(); | ||||
|         expect.soft(okButtonStateDisabled).toBeTruthy(); | ||||
|  | ||||
|         // Continue test regardless of assertion and create it in My Items | ||||
|         await page.locator(`form[name="mctForm"] >> text=${myItemsFolderName}`).click(); | ||||
|         await page.locator('text=OK').click(); | ||||
|  | ||||
|         // Open My Items | ||||
|         await page.locator(`text=Open MCT ${myItemsFolderName} >> span`).nth(3).click(); | ||||
|  | ||||
|         // Select Folder Object and select Move from context menu | ||||
|         await Promise.all([ | ||||
|             page.waitForNavigation(), | ||||
|             page.locator(`a:has-text("${folder}")`).click() | ||||
|         ]); | ||||
|         await page.locator('.c-tree__item.is-navigated-object .c-tree__item__label .c-tree__item__type-icon').click({ | ||||
|             button: 'right' | ||||
|         }); | ||||
|         await page.locator('li.icon-move').click(); | ||||
|  | ||||
|         // See if it's possible to put the folder in the Telemetry object after creation | ||||
|         await page.locator(`text=Location Open MCT ${myItemsFolderName} >> span`).nth(3).click(); | ||||
|         await page.locator(`form[name="mctForm"] >> text=${telemetryTable}`).click(); | ||||
|         let okButton2 = await page.locator('button.c-button.c-button--major:has-text("OK")'); | ||||
|         let okButtonStateDisabled2 = await okButton2.isDisabled(); | ||||
|         expect(okButtonStateDisabled2).toBeTruthy(); | ||||
|     }); | ||||
|  | ||||
|     test('Create a basic object and verify that it can be linked to another folder', async ({ page, openmctConfig }) => { | ||||
|         const { myItemsFolderName } = openmctConfig; | ||||
|  | ||||
|         // Go to Open MCT | ||||
|         await page.goto('./'); | ||||
|  | ||||
|         const parentFolder = await createDomainObjectWithDefaults(page, { | ||||
|             type: 'Folder', | ||||
|             name: 'Parent Folder' | ||||
|         }); | ||||
|         const childFolder = await createDomainObjectWithDefaults(page, { | ||||
|             type: 'Folder', | ||||
|             name: 'Child Folder', | ||||
|             parent: parentFolder.uuid | ||||
|         }); | ||||
|         await createDomainObjectWithDefaults(page, { | ||||
|             type: 'Folder', | ||||
|             name: 'Grandchild Folder', | ||||
|             parent: childFolder.uuid | ||||
|         }); | ||||
|  | ||||
|         // Attempt to link parent to its own grandparent | ||||
|         await page.locator(`text=Open MCT ${myItemsFolderName} >> span`).nth(3).click(); | ||||
|         await page.locator('.c-disclosure-triangle >> nth=0').click(); | ||||
|  | ||||
|         await page.locator(`a:has-text("Parent Folder") >> nth=0`).click({ | ||||
|             button: 'right' | ||||
|         }); | ||||
|  | ||||
|         await page.locator('li.icon-link').click(); | ||||
|         await page.locator('form[name="mctForm"] >> .c-disclosure-triangle >> nth=0').click(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Parent Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('form[name="mctForm"] >> .c-disclosure-triangle >> nth=1').click(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Child Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('form[name="mctForm"] >> .c-disclosure-triangle >> nth=2').click(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Grandchild Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('form[name="mctForm"] >> text=Parent Folder').click(); | ||||
|         await expect(page.locator('[aria-label="Save"]')).toBeDisabled(); | ||||
|         await page.locator('[aria-label="Cancel"]').click(); | ||||
|  | ||||
|         // Link Child Folder from Parent Folder to My Items | ||||
|         await page.locator('.c-disclosure-triangle >> nth=0').click(); | ||||
|         await page.locator('.c-disclosure-triangle >> nth=1').click(); | ||||
|  | ||||
|         await page.locator(`a:has-text("Child Folder") >> nth=0`).click({ | ||||
|             button: 'right' | ||||
|         }); | ||||
|         await page.locator('li.icon-link').click(); | ||||
|         await page.locator(`form[name="mctForm"] >> text=${myItemsFolderName}`).click(); | ||||
|  | ||||
|         await page.locator('text=OK').click(); | ||||
|  | ||||
|         // Expect that Child Folder is in My Items, the root folder | ||||
|         expect(page.locator(`text=${myItemsFolderName} >> nth=0:has(text=Child Folder)`)).toBeTruthy(); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| test.fixme('Cannot move a previously created domain object to non-peristable object in Move Modal', async ({ page }) => { | ||||
|     //Create a domain object | ||||
|     //Save Domain object | ||||
|     //Move Object and verify that cannot select non-persistable object | ||||
|     //Move Object to My Items | ||||
|     //Verify successful move | ||||
| }); | ||||
							
								
								
									
										148
									
								
								e2e/tests/functional/moveObjects.e2e.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								e2e/tests/functional/moveObjects.e2e.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2022, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /* | ||||
| This test suite is dedicated to tests which verify the basic operations surrounding moving objects. | ||||
| */ | ||||
|  | ||||
| const { test, expect } = require('../../pluginFixtures'); | ||||
|  | ||||
| test.describe('Move item tests', () => { | ||||
|     test('Create a basic object and verify that it can be moved to another folder', async ({ page, openmctConfig }) => { | ||||
|         const { myItemsFolderName } = openmctConfig; | ||||
|  | ||||
|         // Go to Open MCT | ||||
|         await page.goto('./'); | ||||
|  | ||||
|         // Create a new folder in the root my items folder | ||||
|         let folder1 = "Folder1"; | ||||
|         await page.locator('button:has-text("Create")').click(); | ||||
|         await page.locator('li.icon-folder').click(); | ||||
|  | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').fill(folder1); | ||||
|  | ||||
|         await Promise.all([ | ||||
|             page.waitForNavigation(), | ||||
|             page.locator('text=OK').click(), | ||||
|             page.waitForSelector('.c-message-banner__message') | ||||
|         ]); | ||||
|         //Wait until Save Banner is gone | ||||
|         await page.locator('.c-message-banner__close-button').click(); | ||||
|         await page.waitForSelector('.c-message-banner__message', { state: 'detached'}); | ||||
|  | ||||
|         // Create another folder with a new name at default location, which is currently inside Folder 1 | ||||
|         let folder2 = "Folder2"; | ||||
|         await page.locator('button:has-text("Create")').click(); | ||||
|         await page.locator('li.icon-folder').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').fill(folder2); | ||||
|  | ||||
|         await Promise.all([ | ||||
|             page.waitForNavigation(), | ||||
|             page.locator('text=OK').click(), | ||||
|             page.waitForSelector('.c-message-banner__message') | ||||
|         ]); | ||||
|         //Wait until Save Banner is gone | ||||
|         await page.locator('.c-message-banner__close-button').click(); | ||||
|         await page.waitForSelector('.c-message-banner__message', { state: 'detached'}); | ||||
|  | ||||
|         // Move Folder 2 from Folder 1 to My Items | ||||
|         await page.locator(`text=Open MCT ${myItemsFolderName} >> span`).nth(3).click(); | ||||
|         await page.locator('.c-tree__scrollable div div:nth-child(2) .c-tree__item .c-tree__item__view-control').click(); | ||||
|  | ||||
|         await page.locator(`a:has-text("${folder2}")`).click({ | ||||
|             button: 'right' | ||||
|         }); | ||||
|         await page.locator('li.icon-move').click(); | ||||
|         await page.locator(`form[name="mctForm"] >> text=${myItemsFolderName}`).click(); | ||||
|  | ||||
|         await page.locator('text=OK').click(); | ||||
|  | ||||
|         // Expect that Folder 2 is in My Items, the root folder | ||||
|         expect(page.locator(`text=${myItemsFolderName} >> nth=0:has(text=${folder2})`)).toBeTruthy(); | ||||
|     }); | ||||
|     test('Create a basic object and verify that it cannot be moved to telemetry object without Composition Provider', async ({ page, openmctConfig }) => { | ||||
|         const { myItemsFolderName } = openmctConfig; | ||||
|  | ||||
|         // Go to Open MCT | ||||
|         await page.goto('./'); | ||||
|  | ||||
|         // Create Telemetry Table | ||||
|         let telemetryTable = 'Test Telemetry Table'; | ||||
|         await page.locator('button:has-text("Create")').click(); | ||||
|         await page.locator('li:has-text("Telemetry Table")').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').fill(telemetryTable); | ||||
|  | ||||
|         await page.locator('text=OK').click(); | ||||
|  | ||||
|         // Finish editing and save Telemetry Table | ||||
|         await page.locator('.c-button--menu.c-button--major.icon-save').click(); | ||||
|         await page.locator('text=Save and Finish Editing').click(); | ||||
|  | ||||
|         // Create New Folder Basic Domain Object | ||||
|         let folder = 'Test Folder'; | ||||
|         await page.locator('button:has-text("Create")').click(); | ||||
|         await page.locator('li:has-text("Folder")').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').click(); | ||||
|         await page.locator('text=Properties Title Notes >> input[type="text"]').fill(folder); | ||||
|  | ||||
|         // See if it's possible to put the folder in the Telemetry object during creation (Soft Assert) | ||||
|         await page.locator(`form[name="mctForm"] >> text=${telemetryTable}`).click(); | ||||
|         let okButton = await page.locator('button.c-button.c-button--major:has-text("OK")'); | ||||
|         let okButtonStateDisabled = await okButton.isDisabled(); | ||||
|         expect.soft(okButtonStateDisabled).toBeTruthy(); | ||||
|  | ||||
|         // Continue test regardless of assertion and create it in My Items | ||||
|         await page.locator(`form[name="mctForm"] >> text=${myItemsFolderName}`).click(); | ||||
|         await page.locator('text=OK').click(); | ||||
|  | ||||
|         // Open My Items | ||||
|         await page.locator(`text=Open MCT ${myItemsFolderName} >> span`).nth(3).click(); | ||||
|  | ||||
|         // Select Folder Object and select Move from context menu | ||||
|         await Promise.all([ | ||||
|             page.waitForNavigation(), | ||||
|             page.locator(`a:has-text("${folder}")`).click() | ||||
|         ]); | ||||
|         await page.locator('.c-tree__item.is-navigated-object .c-tree__item__label .c-tree__item__type-icon').click({ | ||||
|             button: 'right' | ||||
|         }); | ||||
|         await page.locator('li.icon-move').click(); | ||||
|  | ||||
|         // See if it's possible to put the folder in the Telemetry object after creation | ||||
|         await page.locator(`text=Location Open MCT ${myItemsFolderName} >> span`).nth(3).click(); | ||||
|         await page.locator(`form[name="mctForm"] >> text=${telemetryTable}`).click(); | ||||
|         let okButton2 = await page.locator('button.c-button.c-button--major:has-text("OK")'); | ||||
|         let okButtonStateDisabled2 = await okButton2.isDisabled(); | ||||
|         expect(okButtonStateDisabled2).toBeTruthy(); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| test.fixme('Cannot move a previously created domain object to non-peristable object in Move Modal', async ({ page }) => { | ||||
|     //Create a domain object | ||||
|     //Save Domain object | ||||
|     //Move Object and verify that cannot select non-persistable object | ||||
|     //Move Object to My Items | ||||
|     //Verify successful move | ||||
| }); | ||||
| @@ -27,6 +27,7 @@ demonstrate some playwright for test developers. This pattern should not be re-u | ||||
| */ | ||||
| 
 | ||||
| const { test, expect } = require('../../../../pluginFixtures.js'); | ||||
| const { createDomainObjectWithDefaults } = require('../../../../appActions'); | ||||
| 
 | ||||
| let conditionSetUrl; | ||||
| let getConditionSetIdentifierFromUrl; | ||||
| @@ -178,3 +179,24 @@ test.describe.serial('Condition Set CRUD Operations on @localStorage', () => { | ||||
| 
 | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| test.describe('Basic Condition Set Use', () => { | ||||
|     test('Can add a condition', async ({ page }) => { | ||||
|         //Navigate to baseURL
 | ||||
|         await page.goto('./', { waitUntil: 'networkidle' }); | ||||
| 
 | ||||
|         // Create a new condition set
 | ||||
|         await createDomainObjectWithDefaults(page, { | ||||
|             type: 'Condition Set', | ||||
|             name: "Test Condition Set" | ||||
|         }); | ||||
|         // Change the object to edit mode
 | ||||
|         await page.locator('[title="Edit"]').click(); | ||||
| 
 | ||||
|         // Click Add Condition button
 | ||||
|         await page.locator('#addCondition').click(); | ||||
|         // Check that the new Unnamed Condition section appears
 | ||||
|         const numOfUnnamedConditions = await page.locator('text=Unnamed Condition').count(); | ||||
|         expect(numOfUnnamedConditions).toEqual(1); | ||||
|     }); | ||||
| }); | ||||
| @@ -1,98 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2022, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /* | ||||
| * | ||||
| */ | ||||
|  | ||||
| const { test, expect } = require('../../baseFixtures'); | ||||
| const { createDomainObjectWithDefaults } = require('../../appActions'); | ||||
|  | ||||
| test.describe('Renaming Timer Object', () => { | ||||
|     //Create a testcase name which will be obvious when it fails in CI | ||||
|     test('Can create a new Timer object and rename it from actions Menu', async ({ page }) => { | ||||
|         //Open a browser, navigate to the main page, and wait until all networkevents to resolve | ||||
|         await page.goto('./', { waitUntil: 'networkidle' }); | ||||
|         //We provide some helper functions in appActions like createDomainObjectWithDefaults. This example will create a Timer object | ||||
|         await createDomainObjectWithDefaults(page, { type: 'Timer' }); | ||||
|         //Assert the object to be created and check it's name in the title | ||||
|         await expect(page.locator('.l-browse-bar__object-name')).toContainText('Unnamed Timer'); | ||||
|  | ||||
|         const newObjectName = "Renamed Timer"; | ||||
|         //We've created an example of a shared function which pases the page and newObjectName values | ||||
|         await renameObjectFrom3DotMenu(page, newObjectName); | ||||
|  | ||||
|         //Assert that the name has changed in the browser bar to the value we assigned above | ||||
|         await expect(page.locator('.l-browse-bar__object-name')).toContainText(newObjectName); | ||||
|     }); | ||||
|     test('An existing Timer object can be renamed twice', async ({ page }) => { | ||||
|         //Open a browser, navigate to the main page, and wait until all networkevents to resolve | ||||
|         await page.goto('./', { waitUntil: 'networkidle' }); | ||||
|         //We provide some helper functions in appActions like createDomainObjectWithDefaults. This example will create a Timer object | ||||
|         await createDomainObjectWithDefaults(page, { type: 'Timer' }); | ||||
|         //Expect the object to be created and check it's name in the title | ||||
|         await expect(page.locator('.l-browse-bar__object-name')).toContainText('Unnamed Timer'); | ||||
|  | ||||
|         const newObjectName = "Renamed Timer"; | ||||
|         const newObjectName2 = "Re-Renamed Timer"; | ||||
|         //We've created an example of a shared function which pases the page and newObjectName values | ||||
|         await renameObjectFrom3DotMenu(page, newObjectName); | ||||
|  | ||||
|         //Assert that the name has changed in the browser bar to the value we assigned above | ||||
|         await expect(page.locator('.l-browse-bar__object-name')).toContainText(newObjectName); | ||||
|  | ||||
|         await renameObjectFrom3DotMenu(page, newObjectName2); | ||||
|  | ||||
|         //Assert that the name has changed in the browser bar to the second value | ||||
|         await expect(page.locator('.l-browse-bar__object-name')).toContainText(newObjectName2); | ||||
|     }); | ||||
|  | ||||
|     //If you run out of time to write new tests, please stub in the missing tests in place with a test.fixme and BDD-style test steps. Someone will carry the baton! | ||||
|     test.fixme('Can Rename Timer Object from Tree', async ({ page }) => { | ||||
|         //Create a new object | ||||
|         //Copy this object | ||||
|         //Delete first object | ||||
|         //Expect copied object to persist | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| //Structure: custom functions should be declared last. We are leaning on JSDoc pretty heavily to describe functionality. It is not required, but heavily recommended. | ||||
|  | ||||
| /** | ||||
|  * This is an example of a function which is shared between testcases in this test suite. When refactoring, we'll be looking | ||||
|  * for common functionality which makes sense to generalize for the entire test framework. | ||||
|  * @param {import('@playwright/test').Page} page | ||||
|  * @param {string} newNameForTimer New Name for object | ||||
|  */ | ||||
| async function renameObjectFrom3DotMenu(page, newNameForTimer) { | ||||
|  | ||||
|     // Click on 3 Dot Menu | ||||
|     await page.locator('button[title="More options"]').click(); | ||||
|     // Click text=Edit Properties... | ||||
|     await page.locator('text=Edit Properties...').click(); | ||||
|  | ||||
|     // Rename the object with newNameForTimer variable which is passed into this function | ||||
|     await page.locator('text=Properties Title Notes >> input[type="text"]').fill(newNameForTimer); | ||||
|  | ||||
|     // Click Ok button to Save | ||||
|     await page.locator('text=OK').click(); | ||||
| } | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "openmct", | ||||
|   "version": "2.0.8", | ||||
|   "version": "2.0.7", | ||||
|   "description": "The Open MCT core platform", | ||||
|   "devDependencies": { | ||||
|     "@babel/eslint-parser": "7.18.9", | ||||
|   | ||||
| @@ -51,7 +51,11 @@ export default class TelemetryCriterion extends EventEmitter { | ||||
|     } | ||||
|  | ||||
|     initialize() { | ||||
|         this.telemetryObjectIdAsString = this.openmct.objects.makeKeyString(this.telemetryDomainObjectDefinition.telemetry); | ||||
|         this.telemetryObjectIdAsString = ""; | ||||
|         if (![undefined, null, ""].includes(this.telemetryDomainObjectDefinition?.telemetry)) { | ||||
|             this.telemetryObjectIdAsString = this.openmct.objects.makeKeyString(this.telemetryDomainObjectDefinition.telemetry); | ||||
|         } | ||||
|  | ||||
|         this.updateTelemetryObjects(this.telemetryDomainObjectDefinition.telemetryObjects); | ||||
|         if (this.isValid() && this.isStalenessCheck() && this.isValidInput()) { | ||||
|             this.subscribeForStaleData(); | ||||
|   | ||||
| @@ -83,6 +83,7 @@ export default class LinkAction { | ||||
|                 } | ||||
|             ] | ||||
|         }; | ||||
|  | ||||
|         this.openmct.forms.showForm(formStructure) | ||||
|             .then(this.onSave.bind(this)); | ||||
|     } | ||||
| @@ -90,8 +91,8 @@ export default class LinkAction { | ||||
|     validate(currentParent) { | ||||
|         return (data) => { | ||||
|  | ||||
|             // default current parent to ROOT, if it's null, then it's a root level item | ||||
|             if (!currentParent) { | ||||
|             // default current parent to ROOT, if it's undefined, then it's a root level item | ||||
|             if (currentParent === undefined) { | ||||
|                 currentParent = { | ||||
|                     identifier: { | ||||
|                         key: 'ROOT', | ||||
| @@ -100,23 +101,24 @@ export default class LinkAction { | ||||
|                 }; | ||||
|             } | ||||
|  | ||||
|             const parentCandidatePath = data.value; | ||||
|             const parentCandidate = parentCandidatePath[0]; | ||||
|             const parentCandidate = data.value[0]; | ||||
|             const currentParentKeystring = this.openmct.objects.makeKeyString(currentParent.identifier); | ||||
|             const parentCandidateKeystring = this.openmct.objects.makeKeyString(parentCandidate.identifier); | ||||
|             const objectKeystring = this.openmct.objects.makeKeyString(this.object.identifier); | ||||
|  | ||||
|             if (!this.openmct.objects.isPersistable(parentCandidate.identifier)) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             // check if moving to same place | ||||
|             if (this.openmct.objects.areIdsEqual(parentCandidate.identifier, currentParent.identifier)) { | ||||
|             if (!parentCandidateKeystring || !currentParentKeystring) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             // check if moving to a child | ||||
|             if (parentCandidatePath.some(candidatePath => { | ||||
|                 return this.openmct.objects.areIdsEqual(candidatePath.identifier, this.object.identifier); | ||||
|             })) { | ||||
|             if (parentCandidateKeystring === currentParentKeystring) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             if (parentCandidateKeystring === objectKeystring) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -145,24 +145,26 @@ export default class MoveAction { | ||||
|             const parentCandidatePath = data.value; | ||||
|             const parentCandidate = parentCandidatePath[0]; | ||||
|  | ||||
|             // check if moving to same place | ||||
|             if (this.openmct.objects.areIdsEqual(parentCandidate.identifier, currentParent.identifier)) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             // check if moving to a child | ||||
|             if (parentCandidatePath.some(candidatePath => { | ||||
|                 return this.openmct.objects.areIdsEqual(candidatePath.identifier, this.object.identifier); | ||||
|             })) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             if (!this.openmct.objects.isPersistable(parentCandidate.identifier)) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             let currentParentKeystring = this.openmct.objects.makeKeyString(currentParent.identifier); | ||||
|             let parentCandidateKeystring = this.openmct.objects.makeKeyString(parentCandidate.identifier); | ||||
|             let objectKeystring = this.openmct.objects.makeKeyString(this.object.identifier); | ||||
|  | ||||
|             if (!parentCandidateKeystring || !currentParentKeystring) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             if (parentCandidateKeystring === currentParentKeystring) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             if (parentCandidateKeystring === objectKeystring) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             const parentCandidateComposition = parentCandidate.composition; | ||||
|             if (parentCandidateComposition && parentCandidateComposition.indexOf(objectKeystring) !== -1) { | ||||
|                 return false; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user