@eclipse-che/che-e2e 7.74.0-dev-1d09cb7 → 7.74.0-dev-aace77a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +10 -0
- package/.eslintrc.js +197 -0
- package/.prettierignore +10 -0
- package/.prettierrc.json +10 -0
- package/CODE_STYLE.md +144 -0
- package/README.md +47 -47
- package/configs/inversify.config.ts +39 -14
- package/configs/inversify.types.ts +44 -30
- package/configs/mocharc.ts +21 -24
- package/constants/API_TEST_CONSTANTS.ts +67 -0
- package/constants/BASE_TEST_CONSTANTS.ts +80 -0
- package/constants/CHROME_DRIVER_CONSTANTS.ts +42 -0
- package/constants/FACTORY_TEST_CONSTANTS.ts +61 -0
- package/constants/MONACO_CONSTANTS.ts +25 -0
- package/constants/OAUTH_CONSTANTS.ts +67 -0
- package/constants/PLUGIN_TEST_CONSTANTS.ts +15 -0
- package/constants/REPORTER_CONSTANTS.ts +53 -0
- package/constants/TIMEOUT_CONSTANTS.ts +131 -0
- package/dist/configs/inversify.config.js +36 -9
- package/dist/configs/inversify.config.js.map +1 -1
- package/dist/configs/inversify.types.js +19 -5
- package/dist/configs/inversify.types.js.map +1 -1
- package/dist/configs/mocharc.js +13 -16
- package/dist/configs/mocharc.js.map +1 -1
- package/dist/constants/{APITestConstants.js → API_TEST_CONSTANTS.js} +12 -12
- package/dist/constants/API_TEST_CONSTANTS.js.map +1 -0
- package/dist/constants/{BaseTestConstants.js → BASE_TEST_CONSTANTS.js} +16 -16
- package/dist/constants/BASE_TEST_CONSTANTS.js.map +1 -0
- package/dist/constants/CHROME_DRIVER_CONSTANTS.js +36 -0
- package/dist/constants/CHROME_DRIVER_CONSTANTS.js.map +1 -0
- package/dist/constants/{FactoryTestConstants.js → FACTORY_TEST_CONSTANTS.js} +14 -13
- package/dist/constants/FACTORY_TEST_CONSTANTS.js.map +1 -0
- package/dist/constants/{MonacoConstants.js → MONACO_CONSTANTS.js} +7 -7
- package/dist/constants/MONACO_CONSTANTS.js.map +1 -0
- package/dist/constants/{OAuthConstants.js → OAUTH_CONSTANTS.js} +14 -14
- package/dist/constants/OAUTH_CONSTANTS.js.map +1 -0
- package/dist/constants/{PluginsTestConstants.js → PLUGIN_TEST_CONSTANTS.js} +7 -7
- package/dist/constants/PLUGIN_TEST_CONSTANTS.js.map +1 -0
- package/dist/constants/{ReporterConstants.js → REPORTER_CONSTANTS.js} +12 -12
- package/dist/constants/REPORTER_CONSTANTS.js.map +1 -0
- package/dist/constants/{TimeoutConstants.js → TIMEOUT_CONSTANTS.js} +24 -24
- package/dist/constants/TIMEOUT_CONSTANTS.js.map +1 -0
- package/dist/driver/ChromeDriver.js +12 -22
- package/dist/driver/ChromeDriver.js.map +1 -1
- package/dist/index.js +18 -12
- package/dist/index.js.map +1 -1
- package/dist/pageobjects/dashboard/CreateWorkspace.js +15 -15
- package/dist/pageobjects/dashboard/CreateWorkspace.js.map +1 -1
- package/dist/pageobjects/dashboard/Dashboard.js +20 -21
- package/dist/pageobjects/dashboard/Dashboard.js.map +1 -1
- package/dist/pageobjects/dashboard/Workspaces.js +55 -60
- package/dist/pageobjects/dashboard/Workspaces.js.map +1 -1
- package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js +58 -48
- package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js.map +1 -1
- package/dist/pageobjects/git-providers/OauthPage.js +22 -20
- package/dist/pageobjects/git-providers/OauthPage.js.map +1 -1
- package/dist/pageobjects/ide/CheCodeLocatorLoader.js +26 -12
- package/dist/pageobjects/ide/CheCodeLocatorLoader.js.map +1 -1
- package/dist/pageobjects/login/interfaces/ICheLoginPage.js +2 -2
- package/dist/pageobjects/login/interfaces/IOcpLoginPage.js +2 -2
- package/dist/pageobjects/login/kubernetes/DexLoginPage.js +14 -14
- package/dist/pageobjects/login/kubernetes/DexLoginPage.js.map +1 -1
- package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js +7 -7
- package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpLoginPage.js +24 -28
- package/dist/pageobjects/login/openshift/OcpLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js +13 -16
- package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpUserLoginPage.js +9 -9
- package/dist/pageobjects/login/openshift/OcpUserLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/RedHatLoginPage.js +19 -23
- package/dist/pageobjects/login/openshift/RedHatLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js +20 -19
- package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpApplicationPage.js +11 -11
- package/dist/pageobjects/openshift/OcpApplicationPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js +24 -24
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpMainPage.js +30 -30
- package/dist/pageobjects/openshift/OcpMainPage.js.map +1 -1
- package/dist/specs/MochaHooks.js +33 -27
- package/dist/specs/MochaHooks.js.map +1 -1
- package/dist/specs/SmokeTest.spec.js +17 -17
- package/dist/specs/SmokeTest.spec.js.map +1 -1
- package/dist/specs/api/ContainerOverridesAPI.spec.js +8 -6
- package/dist/specs/api/ContainerOverridesAPI.spec.js.map +1 -1
- package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js +27 -24
- package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js.map +1 -1
- package/dist/specs/api/EmptyWorkspaceAPI.spec.js +17 -17
- package/dist/specs/api/EmptyWorkspaceAPI.spec.js.map +1 -1
- package/dist/specs/api/PodOverridesAPI.spec.js +10 -8
- package/dist/specs/api/PodOverridesAPI.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js +10 -10
- package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/Quarkus.spec.js +13 -13
- package/dist/specs/dashboard-samples/Quarkus.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js +52 -52
- package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js.map +1 -1
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js +23 -19
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js.map +1 -1
- package/dist/specs/factory/Factory.spec.js +38 -41
- package/dist/specs/factory/Factory.spec.js.map +1 -1
- package/dist/specs/factory/NoSetupRepoFactory.spec.js +52 -50
- package/dist/specs/factory/NoSetupRepoFactory.spec.js.map +1 -1
- package/dist/specs/factory/RefusedOAuthFactory.spec.js +49 -51
- package/dist/specs/factory/RefusedOAuthFactory.spec.js.map +1 -1
- package/dist/specs/miscellaneous/PredefinedNamespace.spec.js +45 -42
- package/dist/specs/miscellaneous/PredefinedNamespace.spec.js.map +1 -1
- package/dist/tests-library/LoginTests.js +13 -13
- package/dist/tests-library/LoginTests.js.map +1 -1
- package/dist/tests-library/ProjectAndFileTests.js +9 -7
- package/dist/tests-library/ProjectAndFileTests.js.map +1 -1
- package/dist/tests-library/WorkspaceHandlingTests.js +22 -19
- package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
- package/dist/utils/BrowserTabsUtil.js +21 -21
- package/dist/utils/BrowserTabsUtil.js.map +1 -1
- package/dist/utils/CheReporter.js +91 -65
- package/dist/utils/CheReporter.js.map +1 -1
- package/dist/utils/DevWorkspaceConfigurationHelper.js +34 -15
- package/dist/utils/DevWorkspaceConfigurationHelper.js.map +1 -1
- package/dist/utils/DevfilesRegistryHelper.js +34 -18
- package/dist/utils/DevfilesRegistryHelper.js.map +1 -1
- package/dist/utils/DriverHelper.js +73 -68
- package/dist/utils/DriverHelper.js.map +1 -1
- package/dist/utils/IContextParams.js +12 -0
- package/dist/utils/IContextParams.js.map +1 -0
- package/dist/utils/IKubernetesCommandLineToolsExecutor.js +3 -0
- package/dist/utils/IKubernetesCommandLineToolsExecutor.js.map +1 -0
- package/dist/utils/KubernetesCommandLineToolsExecutor.js +146 -107
- package/dist/utils/KubernetesCommandLineToolsExecutor.js.map +1 -1
- package/dist/utils/Logger.js +18 -19
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/ScreenCatcher.js +26 -16
- package/dist/utils/ScreenCatcher.js.map +1 -1
- package/dist/utils/ShellExecutor.js +29 -9
- package/dist/utils/ShellExecutor.js.map +1 -1
- package/dist/utils/StringUtil.js +19 -9
- package/dist/utils/StringUtil.js.map +1 -1
- package/dist/utils/request-handlers/CheApiRequestHandler.js +29 -29
- package/dist/utils/request-handlers/CheApiRequestHandler.js.map +1 -1
- package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js +12 -8
- package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js.map +1 -1
- package/dist/utils/request-handlers/headers/IAuthorizationHeaderHandler.js +2 -2
- package/dist/utils/workspace/ApiUrlResolver.js +5 -5
- package/dist/utils/workspace/ApiUrlResolver.js.map +1 -1
- package/dist/utils/workspace/ITestWorkspaceUtil.js +2 -2
- package/dist/utils/workspace/TestWorkspaceUtil.js +25 -23
- package/dist/utils/workspace/TestWorkspaceUtil.js.map +1 -1
- package/dist/utils/workspace/WorkspaceStatus.js +2 -2
- package/dist/utils/workspace/WorkspaceStatus.js.map +1 -1
- package/driver/ChromeDriver.ts +45 -58
- package/driver/IDriver.ts +3 -3
- package/index.ts +11 -9
- package/package.json +59 -49
- package/pageobjects/dashboard/CreateWorkspace.ts +65 -55
- package/pageobjects/dashboard/Dashboard.ts +100 -100
- package/pageobjects/dashboard/Workspaces.ts +210 -186
- package/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +153 -131
- package/pageobjects/git-providers/OauthPage.ts +177 -166
- package/pageobjects/ide/CheCodeLocatorLoader.ts +51 -46
- package/pageobjects/login/interfaces/ICheLoginPage.ts +3 -3
- package/pageobjects/login/interfaces/IOcpLoginPage.ts +3 -3
- package/pageobjects/login/kubernetes/DexLoginPage.ts +31 -30
- package/pageobjects/login/kubernetes/KubernetesLoginPage.ts +15 -14
- package/pageobjects/login/openshift/OcpLoginPage.ts +51 -56
- package/pageobjects/login/openshift/OcpRedHatLoginPage.ts +27 -27
- package/pageobjects/login/openshift/OcpUserLoginPage.ts +15 -18
- package/pageobjects/login/openshift/RedHatLoginPage.ts +49 -46
- package/pageobjects/login/openshift/RegularUserOcpCheLoginPage.ts +43 -34
- package/pageobjects/openshift/OcpApplicationPage.ts +21 -19
- package/pageobjects/openshift/OcpImportFromGitPage.ts +68 -68
- package/pageobjects/openshift/OcpMainPage.ts +69 -69
- package/specs/MochaHooks.ts +59 -52
- package/specs/SmokeTest.spec.ts +47 -45
- package/specs/api/ContainerOverridesAPI.spec.ts +39 -26
- package/specs/api/DevfileAcceptanceTestAPI.spec.ts +110 -97
- package/specs/api/EmptyWorkspaceAPI.spec.ts +67 -58
- package/specs/api/PodOverridesAPI.spec.ts +48 -34
- package/specs/dashboard-samples/EmptyWorkspace.spec.ts +36 -36
- package/specs/dashboard-samples/Quarkus.spec.ts +41 -40
- package/specs/dashboard-samples/RecommendedExtensions.spec.ts +202 -183
- package/specs/devconsole-intergration/DevConsoleIntegration.spec.ts +85 -75
- package/specs/factory/Factory.spec.ts +184 -178
- package/specs/factory/NoSetupRepoFactory.spec.ts +233 -219
- package/specs/factory/RefusedOAuthFactory.spec.ts +223 -211
- package/specs/miscellaneous/PredefinedNamespace.spec.ts +70 -64
- package/tests-library/LoginTests.ts +34 -32
- package/tests-library/ProjectAndFileTests.ts +21 -18
- package/tests-library/WorkspaceHandlingTests.ts +98 -89
- package/tsconfig.json +15 -15
- package/utils/BrowserTabsUtil.ts +78 -74
- package/utils/CheReporter.ts +159 -157
- package/utils/DevWorkspaceConfigurationHelper.ts +63 -69
- package/utils/DevfilesRegistryHelper.ts +71 -57
- package/utils/DriverHelper.ts +728 -700
- package/utils/IContextParams.ts +26 -0
- package/utils/IKubernetesCommandLineToolsExecutor.ts +42 -0
- package/utils/KubernetesCommandLineToolsExecutor.ts +231 -183
- package/utils/Logger.ts +102 -125
- package/utils/ScreenCatcher.ts +57 -46
- package/utils/ShellExecutor.ts +23 -12
- package/utils/StringUtil.ts +49 -36
- package/utils/request-handlers/CheApiRequestHandler.ts +91 -88
- package/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.ts +32 -21
- package/utils/request-handlers/headers/IAuthorizationHeaderHandler.ts +3 -3
- package/utils/workspace/ApiUrlResolver.ts +31 -26
- package/utils/workspace/ITestWorkspaceUtil.ts +31 -31
- package/utils/workspace/TestWorkspaceUtil.ts +152 -145
- package/utils/workspace/WorkspaceStatus.ts +5 -5
- package/constants/APITestConstants.ts +0 -57
- package/constants/BaseTestConstants.ts +0 -68
- package/constants/ChromeDriverConstants.ts +0 -46
- package/constants/FactoryTestConstants.ts +0 -51
- package/constants/MonacoConstants.ts +0 -22
- package/constants/OAuthConstants.ts +0 -57
- package/constants/PluginsTestConstants.ts +0 -15
- package/constants/ReporterConstants.ts +0 -45
- package/constants/TimeoutConstants.ts +0 -113
- package/dist/constants/APITestConstants.js.map +0 -1
- package/dist/constants/BaseTestConstants.js.map +0 -1
- package/dist/constants/ChromeDriverConstants.js +0 -44
- package/dist/constants/ChromeDriverConstants.js.map +0 -1
- package/dist/constants/FactoryTestConstants.js.map +0 -1
- package/dist/constants/MonacoConstants.js.map +0 -1
- package/dist/constants/OAuthConstants.js.map +0 -1
- package/dist/constants/PluginsTestConstants.js.map +0 -1
- package/dist/constants/ReporterConstants.js.map +0 -1
- package/dist/constants/TimeoutConstants.js.map +0 -1
- package/tslint.json +0 -126
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
1
|
+
/** *******************************************************************
|
|
2
|
+
* copyright (c) 2019-2023 Red Hat, Inc.
|
|
3
3
|
*
|
|
4
4
|
* This program and the accompanying materials are made
|
|
5
5
|
* available under the terms of the Eclipse Public License 2.0
|
|
@@ -12,107 +12,107 @@ import 'reflect-metadata';
|
|
|
12
12
|
import { CLASSES } from '../../configs/inversify.types';
|
|
13
13
|
import { By } from 'selenium-webdriver';
|
|
14
14
|
import { DriverHelper } from '../../utils/DriverHelper';
|
|
15
|
-
import {
|
|
15
|
+
import { TIMEOUT_CONSTANTS } from '../../constants/TIMEOUT_CONSTANTS';
|
|
16
16
|
import { Workspaces } from './Workspaces';
|
|
17
17
|
import { Logger } from '../../utils/Logger';
|
|
18
|
-
import {
|
|
18
|
+
import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
|
|
19
19
|
|
|
20
20
|
@injectable()
|
|
21
21
|
export class Dashboard {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
22
|
+
private static readonly WORKSPACES_BUTTON: By = By.xpath('//div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")]');
|
|
23
|
+
private static readonly CREATE_WORKSPACE_BUTTON: By = By.xpath('//div[@id="page-sidebar"]//a[text()="Create Workspace"]');
|
|
24
|
+
private static readonly LOADER_PAGE_STEP_TITLES: By = By.xpath('//*[@data-testid="step-title"]');
|
|
25
|
+
private static readonly STARTING_PAGE_LOADER: By = By.css('.main-page-loader');
|
|
26
|
+
private static readonly LOADER_ALERT: By = By.xpath('//*[@data-testid="loader-alert"]');
|
|
27
|
+
private static readonly LOGOUT_BUTTON: By = By.xpath('//button[text()="Logout"]');
|
|
28
|
+
private static readonly USER_SETTINGS_DROPDOWN: By = By.xpath('//header//button/span[text()!=""]//parent::button');
|
|
29
|
+
|
|
30
|
+
constructor(
|
|
31
|
+
@inject(CLASSES.DriverHelper)
|
|
32
|
+
private readonly driverHelper: DriverHelper,
|
|
33
|
+
@inject(CLASSES.Workspaces) private readonly workspaces: Workspaces
|
|
34
|
+
) {}
|
|
35
|
+
|
|
36
|
+
async stopWorkspaceByUI(workspaceName: string): Promise<void> {
|
|
37
|
+
Logger.debug(`"${workspaceName}"`);
|
|
38
|
+
|
|
39
|
+
await this.clickWorkspacesButton();
|
|
40
|
+
await this.workspaces.waitPage();
|
|
41
|
+
await this.workspaces.waitWorkspaceListItem(workspaceName);
|
|
42
|
+
await this.workspaces.waitWorkspaceWithRunningStatus(workspaceName);
|
|
43
|
+
await this.workspaces.stopWorkspaceByActionsButton(workspaceName);
|
|
44
|
+
await this.workspaces.waitWorkspaceWithStoppedStatus(workspaceName);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async deleteStoppedWorkspaceByUI(workspaceName: string): Promise<void> {
|
|
48
|
+
Logger.debug(`"${workspaceName}"`);
|
|
49
|
+
|
|
50
|
+
await this.clickWorkspacesButton();
|
|
51
|
+
await this.workspaces.waitPage();
|
|
52
|
+
await this.workspaces.waitWorkspaceListItem(workspaceName);
|
|
53
|
+
await this.workspaces.deleteWorkspaceByActionsButton(workspaceName);
|
|
54
|
+
await this.workspaces.waitPage();
|
|
55
|
+
await this.workspaces.waitWorkspaceListItemAbsence(workspaceName);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async stopAndRemoveWorkspaceByUI(workspaceName: string): Promise<void> {
|
|
59
|
+
Logger.debug(`"${workspaceName}"`);
|
|
60
|
+
|
|
61
|
+
await this.stopWorkspaceByUI(workspaceName);
|
|
62
|
+
await this.deleteStoppedWorkspaceByUI(workspaceName);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async openDashboard(): Promise<void> {
|
|
66
|
+
Logger.debug();
|
|
67
|
+
|
|
68
|
+
await this.driverHelper.navigateToUrl(BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL);
|
|
69
|
+
await this.waitPage();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async waitPage(timeout: number = TIMEOUT_CONSTANTS.TS_SELENIUM_LOAD_PAGE_TIMEOUT): Promise<void> {
|
|
73
|
+
Logger.debug();
|
|
74
|
+
|
|
75
|
+
await this.driverHelper.waitVisibility(Dashboard.WORKSPACES_BUTTON, timeout);
|
|
76
|
+
await this.driverHelper.waitVisibility(Dashboard.CREATE_WORKSPACE_BUTTON, timeout);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async clickWorkspacesButton(timeout: number = TIMEOUT_CONSTANTS.TS_CLICK_DASHBOARD_ITEM_TIMEOUT): Promise<void> {
|
|
80
|
+
Logger.debug();
|
|
81
|
+
|
|
82
|
+
await this.driverHelper.waitAndClick(Dashboard.WORKSPACES_BUTTON, timeout);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async clickCreateWorkspaceButton(timeout: number = TIMEOUT_CONSTANTS.TS_CLICK_DASHBOARD_ITEM_TIMEOUT): Promise<void> {
|
|
86
|
+
Logger.debug();
|
|
87
|
+
|
|
88
|
+
await this.driverHelper.waitAndClick(Dashboard.CREATE_WORKSPACE_BUTTON, timeout);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async getLoaderAlert(timeout: number = TIMEOUT_CONSTANTS.TS_WAIT_LOADER_PRESENCE_TIMEOUT): Promise<string> {
|
|
92
|
+
Logger.debug();
|
|
93
|
+
|
|
94
|
+
return await this.driverHelper.waitAndGetText(Dashboard.LOADER_ALERT, timeout);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async waitLoader(timeout: number = TIMEOUT_CONSTANTS.TS_WAIT_LOADER_PRESENCE_TIMEOUT): Promise<void> {
|
|
98
|
+
Logger.debug();
|
|
99
|
+
|
|
100
|
+
await this.driverHelper.waitAllPresence(Dashboard.LOADER_PAGE_STEP_TITLES, timeout);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async waitStartingPageLoaderDisappearance(timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<void> {
|
|
104
|
+
Logger.debug();
|
|
105
|
+
|
|
106
|
+
await this.driverHelper.waitDisappearance(Dashboard.STARTING_PAGE_LOADER, timeout);
|
|
107
|
+
await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async logout(timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<void> {
|
|
111
|
+
Logger.debug();
|
|
112
|
+
|
|
113
|
+
await this.openDashboard();
|
|
114
|
+
await this.driverHelper.waitAndClick(Dashboard.USER_SETTINGS_DROPDOWN, timeout);
|
|
115
|
+
await this.driverHelper.waitAndClick(Dashboard.LOGOUT_BUTTON, timeout);
|
|
116
|
+
await this.driverHelper.waitDisappearance(Dashboard.USER_SETTINGS_DROPDOWN, timeout);
|
|
117
|
+
}
|
|
118
118
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
1
|
+
/** *******************************************************************
|
|
2
|
+
* copyright (c) 2019-2023 Red Hat, Inc.
|
|
3
3
|
*
|
|
4
4
|
* This program and the accompanying materials are made
|
|
5
5
|
* available under the terms of the Eclipse Public License 2.0
|
|
@@ -13,202 +13,226 @@ import { DriverHelper } from '../../utils/DriverHelper';
|
|
|
13
13
|
import { CLASSES } from '../../configs/inversify.types';
|
|
14
14
|
import { By, WebElement } from 'selenium-webdriver';
|
|
15
15
|
import { Logger } from '../../utils/Logger';
|
|
16
|
-
import {
|
|
16
|
+
import { TIMEOUT_CONSTANTS } from '../../constants/TIMEOUT_CONSTANTS';
|
|
17
17
|
|
|
18
18
|
export enum WorkspaceStatusUI {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
Running = 'green',
|
|
20
|
+
Stopped = 'grey'
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
@injectable()
|
|
24
24
|
export class Workspaces {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
private static readonly ADD_WORKSPACE_BUTTON: By = By.xpath('//button[text()="Add Workspace"]');
|
|
26
|
+
private static readonly WORKSPACE_ITEM_TABLE_NAME_SECTION: By = By.xpath('//td[@data-label="Name"]/span/a');
|
|
27
|
+
private static readonly DELETE_WORKSPACE_BUTTON_ENABLED: By = By.xpath(
|
|
28
|
+
'//button[@data-testid="delete-workspace-button" and not(@disabled)]'
|
|
29
|
+
);
|
|
30
|
+
private static readonly DELETE_CONFIRMATION_CHECKBOX: By = By.xpath('//input[@data-testid="confirmation-checkbox"]');
|
|
31
|
+
private static readonly CONFIRMATION_WINDOW: By = By.xpath('//div[@aria-label="Delete workspaces confirmation window"]');
|
|
27
32
|
|
|
28
|
-
|
|
29
|
-
|
|
33
|
+
constructor(
|
|
34
|
+
@inject(CLASSES.DriverHelper)
|
|
35
|
+
private readonly driverHelper: DriverHelper
|
|
36
|
+
) {}
|
|
30
37
|
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
async waitPage(timeout: number = TIMEOUT_CONSTANTS.TS_SELENIUM_LOAD_PAGE_TIMEOUT): Promise<void> {
|
|
39
|
+
Logger.debug();
|
|
33
40
|
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
await this.driverHelper.waitVisibility(Workspaces.ADD_WORKSPACE_BUTTON, timeout);
|
|
42
|
+
}
|
|
36
43
|
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
async clickAddWorkspaceButton(timeout: number = TIMEOUT_CONSTANTS.TS_CLICK_DASHBOARD_ITEM_TIMEOUT): Promise<void> {
|
|
45
|
+
Logger.debug();
|
|
39
46
|
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
await this.driverHelper.waitAndClick(Workspaces.ADD_WORKSPACE_BUTTON, timeout);
|
|
48
|
+
}
|
|
42
49
|
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
async clickOpenButton(workspaceName: string, timeout: number = TIMEOUT_CONSTANTS.TS_SELENIUM_LOAD_PAGE_TIMEOUT): Promise<void> {
|
|
51
|
+
Logger.debug();
|
|
45
52
|
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
await this.driverHelper.waitAndClick(this.getOpenButtonLocator(workspaceName), timeout);
|
|
54
|
+
}
|
|
48
55
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
56
|
+
async waitWorkspaceListItem(
|
|
57
|
+
workspaceName: string,
|
|
58
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT
|
|
59
|
+
): Promise<void> {
|
|
60
|
+
Logger.debug(`"${workspaceName}"`);
|
|
61
|
+
|
|
62
|
+
await this.driverHelper.waitVisibility(this.getWorkspaceListItemLocator(workspaceName), timeout);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async waitWorkspaceWithRunningStatus(
|
|
66
|
+
workspaceName: string,
|
|
67
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT
|
|
68
|
+
): Promise<void> {
|
|
69
|
+
Logger.debug(`"${workspaceName}"`);
|
|
70
|
+
|
|
71
|
+
await this.driverHelper.waitVisibility(this.getWorkspaceStatusLocator(workspaceName, WorkspaceStatusUI.Running), timeout);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async waitWorkspaceWithStoppedStatus(
|
|
75
|
+
workspaceName: string,
|
|
76
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT
|
|
77
|
+
): Promise<void> {
|
|
78
|
+
Logger.debug(`"${workspaceName}"`);
|
|
79
|
+
|
|
80
|
+
await this.driverHelper.waitVisibility(this.getWorkspaceStatusLocator(workspaceName, WorkspaceStatusUI.Stopped), timeout);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async clickWorkspaceListItem(
|
|
84
|
+
workspaceName: string,
|
|
85
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_CLICK_DASHBOARD_ITEM_TIMEOUT
|
|
86
|
+
): Promise<void> {
|
|
87
|
+
Logger.debug(`"${workspaceName}"`);
|
|
88
|
+
|
|
89
|
+
await this.driverHelper.waitAndClick(this.getWorkspaceListItemLocator(workspaceName), timeout);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async clickActionsButton(workspaceName: string): Promise<void> {
|
|
93
|
+
Logger.debug(`of the '${workspaceName}' list item`);
|
|
94
|
+
|
|
95
|
+
await this.driverHelper.waitAndClick(this.getActionsLocator(workspaceName));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async waitActionsPopup(workspaceName: string, timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<void> {
|
|
99
|
+
Logger.debug(`of the '${workspaceName}' list item`);
|
|
100
|
+
|
|
101
|
+
await this.driverHelper.waitVisibility(this.getExpandedActionsLocator(workspaceName), timeout);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async openActionsPopup(workspaceName: string, timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<void> {
|
|
105
|
+
Logger.debug(`for the '${workspaceName}' list item`);
|
|
106
|
+
|
|
107
|
+
await this.clickActionsButton(workspaceName);
|
|
108
|
+
await this.waitActionsPopup(workspaceName, timeout);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async clickActionsDeleteButton(workspaceName: string): Promise<void> {
|
|
112
|
+
Logger.debug(`for the '${workspaceName}' list item`);
|
|
113
|
+
|
|
114
|
+
await this.driverHelper.waitAndClick(this.getActionsPopupButtonLocator(workspaceName, 'Delete Workspace'));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async clickActionsStopWorkspaceButton(workspaceName: string): Promise<void> {
|
|
118
|
+
Logger.debug(`for the '${workspaceName}' list item`);
|
|
119
|
+
// todo: workaround because of issue CRW-3649
|
|
120
|
+
try {
|
|
121
|
+
await this.driverHelper.waitAndClick(this.getActionsPopupButtonLocator(workspaceName, 'Stop Workspace'));
|
|
122
|
+
} catch (e) {
|
|
123
|
+
Logger.warn(`for the '${workspaceName}' list item - popup was missed, try to click one more time (issue CRW-3649).`);
|
|
124
|
+
|
|
125
|
+
await this.driverHelper.waitAndClick(this.getActionsLocator(workspaceName));
|
|
126
|
+
await this.driverHelper.waitAndClick(this.getActionsPopupButtonLocator(workspaceName, 'Stop Workspace'));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async waitDeleteWorkspaceConfirmationWindow(timeout: number = TIMEOUT_CONSTANTS.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT): Promise<void> {
|
|
131
|
+
Logger.debug();
|
|
132
|
+
|
|
133
|
+
await this.driverHelper.waitVisibility(Workspaces.CONFIRMATION_WINDOW, timeout);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async clickToDeleteConfirmationCheckbox(timeout: number = TIMEOUT_CONSTANTS.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT): Promise<void> {
|
|
137
|
+
Logger.debug();
|
|
138
|
+
|
|
139
|
+
await this.driverHelper.waitAndClick(Workspaces.DELETE_CONFIRMATION_CHECKBOX, timeout);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async waitAndClickEnabledConfirmationWindowDeleteButton(
|
|
143
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT
|
|
144
|
+
): Promise<void> {
|
|
145
|
+
Logger.debug();
|
|
146
|
+
|
|
147
|
+
await this.driverHelper.waitAndClick(Workspaces.DELETE_WORKSPACE_BUTTON_ENABLED, timeout);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async deleteWorkspaceByActionsButton(
|
|
151
|
+
workspaceName: string,
|
|
152
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT
|
|
153
|
+
): Promise<void> {
|
|
154
|
+
Logger.debug();
|
|
155
|
+
|
|
156
|
+
await this.waitWorkspaceListItem(workspaceName, timeout);
|
|
157
|
+
await this.openActionsPopup(workspaceName, timeout);
|
|
158
|
+
await this.clickActionsDeleteButton(workspaceName);
|
|
159
|
+
await this.waitDeleteWorkspaceConfirmationWindow(timeout);
|
|
160
|
+
await this.clickToDeleteConfirmationCheckbox(timeout);
|
|
161
|
+
await this.waitAndClickEnabledConfirmationWindowDeleteButton(timeout);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async stopWorkspaceByActionsButton(
|
|
165
|
+
workspaceName: string,
|
|
166
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT
|
|
167
|
+
): Promise<void> {
|
|
168
|
+
Logger.debug();
|
|
169
|
+
|
|
170
|
+
await this.waitWorkspaceListItem(workspaceName, timeout);
|
|
171
|
+
await this.openActionsPopup(workspaceName, timeout);
|
|
172
|
+
await this.clickActionsStopWorkspaceButton(workspaceName);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async waitWorkspaceListItemAbsence(
|
|
176
|
+
workspaceName: string,
|
|
177
|
+
timeout: number = TIMEOUT_CONSTANTS.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT
|
|
178
|
+
): Promise<void> {
|
|
179
|
+
Logger.debug(`"${workspaceName}"`);
|
|
180
|
+
|
|
181
|
+
const polling: number = TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING;
|
|
182
|
+
const attempts: number = Math.ceil(timeout / polling);
|
|
183
|
+
|
|
184
|
+
await this.driverHelper.waitDisappearance(this.getWorkspaceListItemLocator(workspaceName), attempts, polling);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async getAllCreatedWorkspacesNames(timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<string[]> {
|
|
188
|
+
Logger.debug();
|
|
189
|
+
|
|
190
|
+
const workspaceNames: string[] = [];
|
|
191
|
+
try {
|
|
192
|
+
const workspaceItems: WebElement[] = await this.driverHelper.waitAllPresence(
|
|
193
|
+
Workspaces.WORKSPACE_ITEM_TABLE_NAME_SECTION,
|
|
194
|
+
timeout
|
|
195
|
+
);
|
|
196
|
+
for (const item of workspaceItems) {
|
|
197
|
+
Logger.debug(`try to get ${workspaceItems.indexOf(item)} items name`);
|
|
198
|
+
workspaceNames.push(await item.getText());
|
|
199
|
+
Logger.debug(`workspace name is "${workspaceNames[workspaceNames.length - 1]}"`);
|
|
200
|
+
}
|
|
201
|
+
} catch (e) {
|
|
202
|
+
Logger.debug(`${e}`);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
Logger.debug(`${workspaceNames.length} workspaces have been created in DevSpaces`);
|
|
206
|
+
return workspaceNames;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private getWorkspaceListItemLocator(workspaceName: string): By {
|
|
210
|
+
return By.xpath(`//tr[td//a[text()='${workspaceName}']]`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private getWorkspaceStatusLocator(workspaceName: string, workspaceStatus: WorkspaceStatusUI): By {
|
|
214
|
+
return By.xpath(
|
|
215
|
+
`${
|
|
216
|
+
this.getWorkspaceListItemLocator(workspaceName).value
|
|
217
|
+
}//span[@data-testid='workspace-status-indicator']//*[local-name()='svg' and @fill='${workspaceStatus}']`
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private getActionsLocator(workspaceName: string): By {
|
|
222
|
+
return By.xpath(`${this.getWorkspaceListItemLocator(workspaceName).value}/td/div/button[@aria-label='Actions']`);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
private getExpandedActionsLocator(workspaceName: string): By {
|
|
226
|
+
return By.xpath(
|
|
227
|
+
`${this.getWorkspaceListItemLocator(workspaceName).value}//button[@aria-label='Actions' and @aria-expanded='true']`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
private getActionsPopupButtonLocator(workspaceName: string, buttonText: string): By {
|
|
232
|
+
return By.xpath(`${this.getWorkspaceListItemLocator(workspaceName).value}//li//button[text()='${buttonText}']`);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private getOpenButtonLocator(workspaceName: string): By {
|
|
236
|
+
return By.xpath(`${this.getWorkspaceListItemLocator(workspaceName).value}//td[@data-key=5]//a[text()='Open']`);
|
|
237
|
+
}
|
|
214
238
|
}
|