From 387698131743241687315ec1149fe84b2211b774 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Tue, 5 Nov 2024 09:51:40 +0100 Subject: [PATCH 1/7] service browser --- .../tests/serviceBrowser/leftFilters.spec.js | 42 +++++++++++ .../tests/serviceBrowser/mainView.spec.js | 71 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js create mode 100644 tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js diff --git a/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js new file mode 100644 index 000000000000..2a459bded5cd --- /dev/null +++ b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js @@ -0,0 +1,42 @@ +/* eslint-disable no-undef */ + +const { test, expect } = require('@playwright/test'); + +import { LoginPage } from '../fixtures/loginPage'; + +import products from '../products.json'; +import users from '../users.json'; + +const product = "osparc"; +const productUrl = products[product]; +const user = users[product][0]; + +test.describe.serial(`Left Filters:`, () => { + let page = null; + let loginPageFixture = null; + + test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); + loginPageFixture = new LoginPage(page, productUrl); + const role = await loginPageFixture.login(user.email, user.password); + expect(role).toBe(user.role); + }); + + test.afterAll(async ({ browser }) => { + await loginPageFixture.logout(); + await page.close(); + await browser.close(); + }); + + test(`Filters`, async () => { + const contextTree = page.getByTestId("contextTree"); + await expect(contextTree).toBeVisible({ + timeout: 30000 // it will take some time to load the Study Browser + }); + + const workspacesAndFoldersTreeItems = page.getByTestId("workspacesAndFoldersTreeItem"); + const count = await workspacesAndFoldersTreeItems.count(); + // at least two: My Workspace and Shared Workspaces + expect(count > 1).toBeTruthy(); + }); +}); diff --git a/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js new file mode 100644 index 000000000000..04f0adcc6c6c --- /dev/null +++ b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js @@ -0,0 +1,71 @@ +/* eslint-disable no-undef */ + +const { test, expect } = require('@playwright/test'); + +import { LoginPage } from '../fixtures/loginPage'; + +import products from '../products.json'; +import users from '../users.json'; + +const servicesTabExposed = { + "osparc": { + "areServicesExposed": true, + }, + "s4l": { + "areServicesExposed": true, + }, + "s4lacad": { + "areServicesExposed": true, + }, + "s4llite": { + "areServicesExposed": false, + }, + "tis": { + "areServicesExposed": false, + }, + "tiplite": { + "areServicesExposed": false, + }, +} + +for (const product in products) { + expect(servicesTabExposed[product]).toBeDefined(); + if (!servicesTabExposed[product]["areServicesExposed"]) { + continue; + } + + if (product in users) { + const productUrl = products[product]; + const productUsers = users[product]; + for (const user of productUsers) { + // expected roles for users: "USER" + const role = "USER"; + expect(user.role).toBe(role); + + test.describe.serial(`Main View: ${product}`, () => { + let page = null; + let loginPageFixture = null; + + test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); + loginPageFixture = new LoginPage(page, productUrl); + const role = await loginPageFixture.login(user.email, user.password); + expect(role).toBe(user.role); + }); + + test.afterAll(async ({ browser }) => { + await loginPageFixture.logout(); + await page.close(); + await browser.close(); + }); + + test(`Services list`, async () => { + const servicesList = page.getByTestId("servicesList"); + const serviceItems = servicesList.locator(':scope > *'); + const count = await serviceItems.count(); + expect(count > 0); + }); + }); + } + } +} From 50031581785863e26747792c672b1014418f1472 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Tue, 5 Nov 2024 10:26:38 +0100 Subject: [PATCH 2/7] print n services --- .../tests/serviceBrowser/mainView.spec.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js index 04f0adcc6c6c..915f1e55bdc5 100644 --- a/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js +++ b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js @@ -48,9 +48,19 @@ for (const product in products) { test.beforeAll(async ({ browser }) => { page = await browser.newPage(); + + const responsePromise = page.waitForResponse('**/services/-/latest**'); + loginPageFixture = new LoginPage(page, productUrl); const role = await loginPageFixture.login(user.email, user.password); expect(role).toBe(user.role); + + const response = await responsePromise; + const resp = await response.json(); + expect("data" in resp && "_meta" in resp["data"] && "total" in resp["data"]["_meta"]); + console.log("N Services in Response:", resp["data"]["_meta"]["total"]); + + await page.getByTestId("servicesTabBtn").click(); }); test.afterAll(async ({ browser }) => { @@ -61,8 +71,13 @@ for (const product in products) { test(`Services list`, async () => { const servicesList = page.getByTestId("servicesList"); + await expect(servicesList).toBeVisible({ + timeout: 30000 + }); + const serviceItems = servicesList.locator(':scope > *'); const count = await serviceItems.count(); + console.log("N Services listed", count); expect(count > 0); }); }); From 96ef52ce3ba5ece53b06f230798b93edc86b84e1 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Tue, 5 Nov 2024 10:31:11 +0100 Subject: [PATCH 3/7] update IDs --- .../client/source/class/osparc/dashboard/ResourceFilter.js | 6 +++--- tests/e2e-frontend/tests/studyBrowser/leftFilters.spec.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js b/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js index 0cbb33577377..cec3341b981d 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js @@ -22,7 +22,7 @@ qx.Class.define("osparc.dashboard.ResourceFilter", { construct: function(resourceType) { this.base(arguments); - osparc.utils.Utils.setIdToWidget(this, "resourceFilter"); + osparc.utils.Utils.setIdToWidget(this, resourceType + "-resourceFilter"); this.__resourceType = resourceType; this.__sharedWithButtons = []; @@ -138,7 +138,7 @@ qx.Class.define("osparc.dashboard.ResourceFilter", { /* TAGS */ __createTagsFilterLayout: function() { const layout = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)); - osparc.utils.Utils.setIdToWidget(layout, "tagsFilter"); + osparc.utils.Utils.setIdToWidget(layout, this.__resourceType + "-tagsFilter"); this.__populateTags(layout, []); osparc.store.Store.getInstance().addListener("changeTags", () => { @@ -159,7 +159,7 @@ qx.Class.define("osparc.dashboard.ResourceFilter", { layout.removeAll(); osparc.store.Store.getInstance().getTags().forEach((tag, idx) => { const button = new qx.ui.form.ToggleButton(tag.name, "@FontAwesome5Solid/tag/18"); - osparc.utils.Utils.setIdToWidget(button, "tagFilterItem"); + osparc.utils.Utils.setIdToWidget(button, this.__resourceType + "-tagFilterItem"); button.id = tag.id; button.set({ appearance: "filter-toggle-button", diff --git a/tests/e2e-frontend/tests/studyBrowser/leftFilters.spec.js b/tests/e2e-frontend/tests/studyBrowser/leftFilters.spec.js index 2a8dfa724d70..5412b82baae2 100644 --- a/tests/e2e-frontend/tests/studyBrowser/leftFilters.spec.js +++ b/tests/e2e-frontend/tests/studyBrowser/leftFilters.spec.js @@ -41,12 +41,12 @@ test.describe.serial(`Left Filters:`, () => { }); test(`Tags`, async () => { - const tagsFilter = page.getByTestId("tagsFilter"); + const tagsFilter = page.getByTestId("study-tagsFilter"); await expect(tagsFilter).toBeVisible({ timeout: 30000 // it will take some time to load the Study Browser }); - const tagFilterItems = page.getByTestId("tagFilterItem"); + const tagFilterItems = page.getByTestId("study-tagFilterItem"); const count = await tagFilterItems.count(); // at least two and less than 6 (max five are shown) expect(count > 1 && count < 6).toBeTruthy(); From fbb0e41784eeb40c24e471a7beac5a4068120ce4 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Tue, 5 Nov 2024 10:37:07 +0100 Subject: [PATCH 4/7] add IDs --- .../client/source/class/osparc/dashboard/ResourceFilter.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js b/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js index cec3341b981d..142cdab7d3fa 100644 --- a/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js +++ b/services/static-webserver/client/source/class/osparc/dashboard/ResourceFilter.js @@ -102,6 +102,7 @@ qx.Class.define("osparc.dashboard.ResourceFilter", { label: option.label, icon: option.icon, }); + osparc.utils.Utils.setIdToWidget(button, this.__resourceType + "-sharedWithFilterItem"); if (this.__resourceType === "study") { if (option.id === "show-all") { button.set({ @@ -220,6 +221,7 @@ qx.Class.define("osparc.dashboard.ResourceFilter", { const iconSize = 20; const button = new qx.ui.toolbar.RadioButton(serviceType.label, serviceType.icon+iconSize); button.id = serviceId; + osparc.utils.Utils.setIdToWidget(button, this.__resourceType + "-serviceTypeFilterItem"); button.set({ appearance: "filter-toggle-button", value: false From 93c9617a41b8074285b6ab045a02aa94d5b2589b Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Tue, 5 Nov 2024 10:42:34 +0100 Subject: [PATCH 5/7] test filters --- .../tests/serviceBrowser/leftFilters.spec.js | 34 +++++++++++++++---- .../tests/serviceBrowser/mainView.spec.js | 4 ++- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js index 2a459bded5cd..a0e05fc0cbce 100644 --- a/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js +++ b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js @@ -17,9 +17,18 @@ test.describe.serial(`Left Filters:`, () => { test.beforeAll(async ({ browser }) => { page = await browser.newPage(); + + const responsePromise = page.waitForResponse('**/services/-/latest**', { + timeout: 30000 + }); + loginPageFixture = new LoginPage(page, productUrl); const role = await loginPageFixture.login(user.email, user.password); expect(role).toBe(user.role); + + await responsePromise; + + await page.getByTestId("servicesTabBtn").click(); }); test.afterAll(async ({ browser }) => { @@ -29,14 +38,27 @@ test.describe.serial(`Left Filters:`, () => { }); test(`Filters`, async () => { - const contextTree = page.getByTestId("contextTree"); - await expect(contextTree).toBeVisible({ + const sharedWithFilters = page.getByTestId("service-sharedWithFilterItem"); + await expect(sharedWithFilters).toBeVisible({ + timeout: 30000 // it will take some time to load the Study Browser + }); + + const countSharedWith = await sharedWithFilters.count(); + // All Services + // My Services + // Shared with Me + // Shared with Everyone + expect(countSharedWith === 4).toBeTruthy(); + + + const serviceTypeFilters = page.getByTestId("service-serviceTypeFilterItem"); + await expect(serviceTypeFilters).toBeVisible({ timeout: 30000 // it will take some time to load the Study Browser }); - const workspacesAndFoldersTreeItems = page.getByTestId("workspacesAndFoldersTreeItem"); - const count = await workspacesAndFoldersTreeItems.count(); - // at least two: My Workspace and Shared Workspaces - expect(count > 1).toBeTruthy(); + const countServiceType = await serviceTypeFilters.count(); + // Computational + // Interactive + expect(countServiceType === 2).toBeTruthy(); }); }); diff --git a/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js index 915f1e55bdc5..29774d5acf1e 100644 --- a/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js +++ b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js @@ -49,7 +49,9 @@ for (const product in products) { test.beforeAll(async ({ browser }) => { page = await browser.newPage(); - const responsePromise = page.waitForResponse('**/services/-/latest**'); + const responsePromise = page.waitForResponse('**/services/-/latest**', { + timeout: 30000 + }); loginPageFixture = new LoginPage(page, productUrl); const role = await loginPageFixture.login(user.email, user.password); From c90911b87730effa9cee47ee7f215a289bcaa553 Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Tue, 5 Nov 2024 10:58:53 +0100 Subject: [PATCH 6/7] minors --- tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js index a0e05fc0cbce..04269a1aa7a3 100644 --- a/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js +++ b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js @@ -39,7 +39,7 @@ test.describe.serial(`Left Filters:`, () => { test(`Filters`, async () => { const sharedWithFilters = page.getByTestId("service-sharedWithFilterItem"); - await expect(sharedWithFilters).toBeVisible({ + await expect(sharedWithFilters.first()).toBeVisible({ timeout: 30000 // it will take some time to load the Study Browser }); @@ -52,7 +52,7 @@ test.describe.serial(`Left Filters:`, () => { const serviceTypeFilters = page.getByTestId("service-serviceTypeFilterItem"); - await expect(serviceTypeFilters).toBeVisible({ + await expect(serviceTypeFilters.first()).toBeVisible({ timeout: 30000 // it will take some time to load the Study Browser }); From 1a428406308937f1b1033a2995c7f20a40bc7fbc Mon Sep 17 00:00:00 2001 From: Odei Maiz Date: Tue, 5 Nov 2024 11:18:25 +0100 Subject: [PATCH 7/7] renaming --- .../tests/serviceBrowser/leftFilters.spec.js | 16 ++++++++-------- .../tests/serviceBrowser/mainView.spec.js | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js index 04269a1aa7a3..247f5def5822 100644 --- a/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js +++ b/tests/e2e-frontend/tests/serviceBrowser/leftFilters.spec.js @@ -38,27 +38,27 @@ test.describe.serial(`Left Filters:`, () => { }); test(`Filters`, async () => { - const sharedWithFilters = page.getByTestId("service-sharedWithFilterItem"); - await expect(sharedWithFilters.first()).toBeVisible({ + const sharedWithButtons = page.getByTestId("service-sharedWithFilterItem"); + await expect(sharedWithButtons.first()).toBeVisible({ timeout: 30000 // it will take some time to load the Study Browser }); - const countSharedWith = await sharedWithFilters.count(); + const countSharedWithButtons = await sharedWithButtons.count(); // All Services // My Services // Shared with Me // Shared with Everyone - expect(countSharedWith === 4).toBeTruthy(); + expect(countSharedWithButtons === 4).toBeTruthy(); - const serviceTypeFilters = page.getByTestId("service-serviceTypeFilterItem"); - await expect(serviceTypeFilters.first()).toBeVisible({ + const serviceTypeButtons = page.getByTestId("service-serviceTypeFilterItem"); + await expect(serviceTypeButtons.first()).toBeVisible({ timeout: 30000 // it will take some time to load the Study Browser }); - const countServiceType = await serviceTypeFilters.count(); + const countServiceTypeButtons = await serviceTypeButtons.count(); // Computational // Interactive - expect(countServiceType === 2).toBeTruthy(); + expect(countServiceTypeButtons === 2).toBeTruthy(); }); }); diff --git a/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js index 29774d5acf1e..c3077e467e70 100644 --- a/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js +++ b/tests/e2e-frontend/tests/serviceBrowser/mainView.spec.js @@ -77,8 +77,8 @@ for (const product in products) { timeout: 30000 }); - const serviceItems = servicesList.locator(':scope > *'); - const count = await serviceItems.count(); + const serviceCards = servicesList.locator(':scope > *'); + const count = await serviceCards.count(); console.log("N Services listed", count); expect(count > 0); });