From 161fca98d5bf338fa0f16023dd5a17eb8edc09c2 Mon Sep 17 00:00:00 2001 From: Scott Bell Date: Thu, 28 Jul 2022 01:41:21 -0700 Subject: [PATCH] 5469 search results sometimes show the wrong contextual path or no path at all master (#5567) * use identifier from domain object to tell vue to rerender, also show object in annotations * fix annotation result clicks * use key string instead * add nice e2e test * add some more search types * added negative expect --- e2e/tests/functional/search.e2e.spec.js | 96 +++++++++++++++---- src/ui/components/ObjectPath.vue | 85 +++++----------- .../layout/search/AnnotationSearchResult.vue | 18 ++-- src/ui/layout/search/ObjectSearchResult.vue | 8 +- .../layout/search/SearchResultsDropDown.vue | 9 +- 5 files changed, 114 insertions(+), 102 deletions(-) diff --git a/e2e/tests/functional/search.e2e.spec.js b/e2e/tests/functional/search.e2e.spec.js index fcff6aa5d3..4aeb19c0d4 100644 --- a/e2e/tests/functional/search.e2e.spec.js +++ b/e2e/tests/functional/search.e2e.spec.js @@ -19,7 +19,6 @@ * 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 search functionalities. */ @@ -30,35 +29,36 @@ test.describe('Grand Search', () => { test('Can search for objects, and subsequent search dropdown behaves properly', async ({ page, openmctConfig }) => { const { myItemsFolderName } = openmctConfig; - await createClockAndDisplayLayout(page, myItemsFolderName); + await createObjectsForSearch(page, myItemsFolderName); // Click [aria-label="OpenMCT Search"] input[type="search"] await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').click(); // Fill [aria-label="OpenMCT Search"] input[type="search"] await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('Cl'); - await expect(page.locator('[aria-label="Search Result"]')).toContainText('Clock'); + 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=1')).toContainText(`Clock B ${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`); // Click text=Elements >> nth=0 await page.locator('text=Elements').first().click(); - await expect(page.locator('[aria-label="Search Result"]')).not.toBeVisible(); + await expect(page.locator('[aria-label="Search Result"] >> nth=0')).not.toBeVisible(); - // Click [aria-label="OpenMCT Search"] [aria-label="Search Input"] await page.locator('[aria-label="OpenMCT Search"] [aria-label="Search Input"]').click(); - // Click [aria-label="Unnamed Clock clock result"] >> text=Unnamed Clock - await page.locator('[aria-label="Unnamed Clock clock result"] >> text=Unnamed Clock').click(); + await page.locator('[aria-label="Clock A clock result"] >> text=Clock A').click(); await expect(page.locator('.js-preview-window')).toBeVisible(); // Click [aria-label="Close"] await page.locator('[aria-label="Close"]').click(); - await expect(page.locator('[aria-label="Search Result"]')).toBeVisible(); - await expect(page.locator('[aria-label="Search Result"]')).toContainText('Cloc'); + await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toBeVisible(); + 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 await page.locator('[aria-label="OpenMCT Search"] a').first().click(); - await expect(page.locator('[aria-label="Search Result"]')).not.toBeVisible(); + await expect(page.locator('[aria-label="Search Result"] >> nth=0')).not.toBeVisible(); // Fill [aria-label="OpenMCT Search"] input[type="search"] await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('foo'); - await expect(page.locator('[aria-label="Search Result"]')).not.toBeVisible(); + await expect(page.locator('[aria-label="Search Result"] >> nth=0')).not.toBeVisible(); // Click text=Snapshot Save and Finish Editing Save and Continue Editing >> button >> nth=1 await page.locator('text=Snapshot Save and Finish Editing Save and Continue Editing >> button').nth(1).click(); @@ -68,12 +68,24 @@ test.describe('Grand Search', () => { await page.locator('[aria-label="OpenMCT Search"] [aria-label="Search Input"]').click(); // Fill [aria-label="OpenMCT Search"] [aria-label="Search Input"] await page.locator('[aria-label="OpenMCT Search"] [aria-label="Search Input"]').fill('Cl'); - // Click text=Unnamed Clock await Promise.all([ page.waitForNavigation(), - page.locator('text=Unnamed Clock').click() + page.locator('text=Clock A').click() ]); await expect(page.locator('.is-object-type-clock')).toBeVisible(); + + await page.locator('[aria-label="OpenMCT Search"] [aria-label="Search Input"]').fill('Disp'); + await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toContainText('Unnamed Display Layout'); + await expect(page.locator('[aria-label="Search Result"] >> nth=0')).not.toContainText('Folder'); + + await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('Clock C'); + await expect(page.locator('[aria-label="Search Result"] >> nth=0')).toContainText(`Clock C ${myItemsFolderName} Red Folder Blue Folder`); + + await page.locator('[aria-label="OpenMCT Search"] input[type="search"]').fill('Cloc'); + 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=1')).toContainText(`Clock B ${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`); }); }); @@ -174,25 +186,67 @@ async function waitForSearchCompletion(page) { } /** - * Creates a notebook object and adds an entry. + * Creates some domain objects for searching * @param {import('@playwright/test').Page} page - * @param {string} myItemsFolderName */ -async function createClockAndDisplayLayout(page, myItemsFolderName) { +async function createObjectsForSearch(page, myItemsFolderName) { //Go to baseURL await page.goto('./', { waitUntil: 'networkidle' }); - // Click button:has-text("Create") await page.locator('button:has-text("Create")').click(); - // Click li:has-text("Notebook") - await page.locator('li:has-text("Clock")').click(); - // Click button:has-text("OK") + await page.locator('li:has-text("Folder") >> nth=1').click(); await Promise.all([ page.waitForNavigation(), + await page.locator('text=Properties Title Notes >> input[type="text"]').fill('Red Folder'), + await page.locator(`text=Save In Open MCT ${myItemsFolderName} >> span`).nth(3).click(), + page.locator('button:has-text("OK")').click() + ]); + + await page.locator('button:has-text("Create")').click(); + await page.locator('li:has-text("Folder") >> nth=2').click(); + await Promise.all([ + page.waitForNavigation(), + await page.locator('text=Properties Title Notes >> input[type="text"]').fill('Blue Folder'), + await page.locator('form[name="mctForm"] >> text=Red Folder').click(), + page.locator('button:has-text("OK")').click() + ]); + + await page.locator('button:has-text("Create")').click(); + await page.locator('li[title="A UTC-based clock that supports a variety of display formats. Clocks can be added to Display Layouts."]').click(); + await Promise.all([ + page.waitForNavigation(), + await page.locator('text=Properties Title Notes >> input[type="text"] >> nth=0').fill('Clock A'), + await page.locator('form[name="mctForm"] >> text=Blue Folder').click(), + page.locator('button:has-text("OK")').click() + ]); + + await page.locator('button:has-text("Create")').click(); + await page.locator('li[title="A UTC-based clock that supports a variety of display formats. Clocks can be added to Display Layouts."]').click(); + await Promise.all([ + page.waitForNavigation(), + await page.locator('text=Properties Title Notes >> input[type="text"] >> nth=0').fill('Clock B'), + await page.locator('form[name="mctForm"] >> text=Blue Folder').click(), + page.locator('button:has-text("OK")').click() + ]); + + await page.locator('button:has-text("Create")').click(); + await page.locator('li[title="A UTC-based clock that supports a variety of display formats. Clocks can be added to Display Layouts."]').click(); + await Promise.all([ + page.waitForNavigation(), + await page.locator('text=Properties Title Notes >> input[type="text"] >> nth=0').fill('Clock C'), + await page.locator('form[name="mctForm"] >> text=Blue Folder').click(), + page.locator('button:has-text("OK")').click() + ]); + + await page.locator('button:has-text("Create")').click(); + await page.locator('li[title="A UTC-based clock that supports a variety of display formats. Clocks can be added to Display Layouts."]').click(); + await Promise.all([ + page.waitForNavigation(), + await page.locator('text=Properties Title Notes >> input[type="text"] >> nth=0').fill('Clock D'), + await page.locator('form[name="mctForm"] >> text=Blue Folder').click(), page.locator('button:has-text("OK")').click() ]); - // Click a:has-text("My Items") await Promise.all([ page.waitForNavigation(), page.locator(`a:has-text("${myItemsFolderName}") >> nth=0`).click() diff --git a/src/ui/components/ObjectPath.vue b/src/ui/components/ObjectPath.vue index 7e149ce375..65bb3b6268 100644 --- a/src/ui/components/ObjectPath.vue +++ b/src/ui/components/ObjectPath.vue @@ -22,7 +22,7 @@