@eclipse-che/che-e2e 7.73.0 → 7.74.0-dev-41d1364
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 +183 -0
- package/.prettierignore +10 -0
- package/.prettierrc.json +10 -0
- package/README.md +47 -47
- package/configs/inversify.config.ts +14 -10
- package/configs/inversify.types.ts +29 -29
- 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 +54 -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 +14 -8
- package/dist/configs/inversify.config.js.map +1 -1
- package/dist/configs/inversify.types.js +2 -2
- 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} +13 -13
- package/dist/constants/API_TEST_CONSTANTS.js.map +1 -0
- package/dist/constants/{BaseTestConstants.js → BASE_TEST_CONSTANTS.js} +17 -16
- package/dist/constants/BASE_TEST_CONSTANTS.js.map +1 -0
- package/dist/constants/{ChromeDriverConstants.js → CHROME_DRIVER_CONSTANTS.js} +14 -14
- package/dist/constants/CHROME_DRIVER_CONSTANTS.js.map +1 -0
- package/dist/constants/{FactoryTestConstants.js → FACTORY_TEST_CONSTANTS.js} +15 -14
- package/dist/constants/FACTORY_TEST_CONSTANTS.js.map +1 -0
- package/dist/constants/{MonacoConstants.js → MONACO_CONSTANTS.js} +8 -8
- package/dist/constants/MONACO_CONSTANTS.js.map +1 -0
- package/dist/constants/{OAuthConstants.js → OAUTH_CONSTANTS.js} +15 -15
- 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} +13 -13
- 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 -16
- package/dist/driver/ChromeDriver.js.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/pageobjects/dashboard/CreateWorkspace.js +18 -18
- package/dist/pageobjects/dashboard/CreateWorkspace.js.map +1 -1
- package/dist/pageobjects/dashboard/Dashboard.js +27 -27
- package/dist/pageobjects/dashboard/Dashboard.js.map +1 -1
- package/dist/pageobjects/dashboard/Workspaces.js +42 -42
- package/dist/pageobjects/dashboard/Workspaces.js.map +1 -1
- package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js +44 -33
- package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js.map +1 -1
- package/dist/pageobjects/git-providers/OauthPage.js +37 -35
- package/dist/pageobjects/git-providers/OauthPage.js.map +1 -1
- package/dist/pageobjects/ide/CheCodeLocatorLoader.js +10 -10
- 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 +10 -10
- package/dist/pageobjects/login/kubernetes/DexLoginPage.js.map +1 -1
- package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js +6 -6
- package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpLoginPage.js +23 -23
- package/dist/pageobjects/login/openshift/OcpLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js +7 -7
- package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpUserLoginPage.js +7 -7
- package/dist/pageobjects/login/openshift/OcpUserLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/RedHatLoginPage.js +11 -11
- package/dist/pageobjects/login/openshift/RedHatLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js +10 -10
- package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpApplicationPage.js +7 -7
- package/dist/pageobjects/openshift/OcpApplicationPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js +9 -9
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpMainPage.js +15 -15
- package/dist/pageobjects/openshift/OcpMainPage.js.map +1 -1
- package/dist/specs/MochaHooks.js +27 -24
- package/dist/specs/MochaHooks.js.map +1 -1
- package/dist/specs/SmokeTest.spec.js +17 -13
- package/dist/specs/SmokeTest.spec.js.map +1 -1
- package/dist/specs/api/ContainerOverridesAPI.spec.js +10 -1
- package/dist/specs/api/ContainerOverridesAPI.spec.js.map +1 -1
- package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js +31 -18
- package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js.map +1 -1
- package/dist/specs/api/EmptyWorkspaceAPI.spec.js +18 -12
- package/dist/specs/api/EmptyWorkspaceAPI.spec.js.map +1 -1
- package/dist/specs/api/PodOverridesAPI.spec.js +12 -2
- package/dist/specs/api/PodOverridesAPI.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js +12 -8
- package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/Quarkus.spec.js +13 -9
- package/dist/specs/dashboard-samples/Quarkus.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js +47 -43
- package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js.map +1 -1
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js +17 -10
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js.map +1 -1
- package/dist/specs/factory/Factory.spec.js +28 -26
- package/dist/specs/factory/Factory.spec.js.map +1 -1
- package/dist/specs/factory/NoSetupRepoFactory.spec.js +41 -36
- package/dist/specs/factory/NoSetupRepoFactory.spec.js.map +1 -1
- package/dist/specs/factory/RefusedOAuthFactory.spec.js +37 -35
- package/dist/specs/factory/RefusedOAuthFactory.spec.js.map +1 -1
- package/dist/specs/miscellaneous/PredefinedNamespace.spec.js +18 -5
- package/dist/specs/miscellaneous/PredefinedNamespace.spec.js.map +1 -1
- package/dist/tests-library/LoginTests.js +7 -7
- 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 +61 -78
- package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
- package/dist/utils/BrowserTabsUtil.js +29 -24
- package/dist/utils/BrowserTabsUtil.js.map +1 -1
- package/dist/utils/CheReporter.js +44 -44
- package/dist/utils/CheReporter.js.map +1 -1
- package/dist/utils/DevWorkspaceConfigurationHelper.js +19 -10
- package/dist/utils/DevWorkspaceConfigurationHelper.js.map +1 -1
- package/dist/utils/DevfilesRegistryHelper.js +25 -19
- package/dist/utils/DevfilesRegistryHelper.js.map +1 -1
- package/dist/utils/DriverHelper.js +126 -128
- package/dist/utils/DriverHelper.js.map +1 -1
- package/dist/utils/KubernetesCommandLineToolsExecutor.js +53 -46
- package/dist/utils/KubernetesCommandLineToolsExecutor.js.map +1 -1
- package/dist/utils/Logger.js +62 -39
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/ScreenCatcher.js +18 -12
- package/dist/utils/ScreenCatcher.js.map +1 -1
- package/dist/utils/ShellExecutor.js +9 -0
- package/dist/utils/ShellExecutor.js.map +1 -1
- package/dist/utils/StringUtil.js +17 -9
- package/dist/utils/StringUtil.js.map +1 -1
- package/dist/utils/request-handlers/CheApiRequestHandler.js +36 -34
- package/dist/utils/request-handlers/CheApiRequestHandler.js.map +1 -1
- package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js +10 -6
- 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 +36 -30
- 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 -51
- package/driver/IDriver.ts +3 -3
- package/index.ts +9 -9
- package/package.json +59 -49
- package/pageobjects/dashboard/CreateWorkspace.ts +65 -56
- package/pageobjects/dashboard/Dashboard.ts +101 -100
- package/pageobjects/dashboard/Workspaces.ts +197 -166
- package/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +151 -127
- package/pageobjects/git-providers/OauthPage.ts +177 -166
- package/pageobjects/ide/CheCodeLocatorLoader.ts +49 -46
- package/pageobjects/login/interfaces/ICheLoginPage.ts +3 -3
- package/pageobjects/login/interfaces/IOcpLoginPage.ts +3 -3
- package/pageobjects/login/kubernetes/DexLoginPage.ts +32 -31
- package/pageobjects/login/kubernetes/KubernetesLoginPage.ts +16 -15
- package/pageobjects/login/openshift/OcpLoginPage.ts +62 -55
- package/pageobjects/login/openshift/OcpRedHatLoginPage.ts +30 -25
- package/pageobjects/login/openshift/OcpUserLoginPage.ts +16 -19
- package/pageobjects/login/openshift/RedHatLoginPage.ts +49 -44
- package/pageobjects/login/openshift/RegularUserOcpCheLoginPage.ts +39 -35
- package/pageobjects/openshift/OcpApplicationPage.ts +21 -20
- package/pageobjects/openshift/OcpImportFromGitPage.ts +70 -68
- package/pageobjects/openshift/OcpMainPage.ts +69 -68
- package/resources/pod-overrides-airgap.yaml +37 -0
- package/specs/MochaHooks.ts +59 -50
- package/specs/SmokeTest.spec.ts +43 -36
- package/specs/api/ContainerOverridesAPI.spec.ts +33 -26
- package/specs/api/DevfileAcceptanceTestAPI.spec.ts +107 -94
- package/specs/api/EmptyWorkspaceAPI.spec.ts +62 -57
- package/specs/api/PodOverridesAPI.spec.ts +42 -32
- package/specs/dashboard-samples/EmptyWorkspace.spec.ts +31 -27
- package/specs/dashboard-samples/Quarkus.spec.ts +34 -30
- package/specs/dashboard-samples/RecommendedExtensions.spec.ts +192 -170
- package/specs/devconsole-intergration/DevConsoleIntegration.spec.ts +62 -55
- package/specs/factory/Factory.spec.ts +178 -166
- package/specs/factory/NoSetupRepoFactory.spec.ts +227 -210
- package/specs/factory/RefusedOAuthFactory.spec.ts +219 -203
- package/specs/miscellaneous/PredefinedNamespace.spec.ts +64 -50
- package/tests-library/LoginTests.ts +34 -32
- package/tests-library/ProjectAndFileTests.ts +21 -18
- package/tests-library/WorkspaceHandlingTests.ts +98 -108
- package/tsconfig.json +15 -15
- package/utils/BrowserTabsUtil.ts +104 -98
- package/utils/CheReporter.ts +142 -148
- package/utils/DevWorkspaceConfigurationHelper.ts +70 -61
- package/utils/DevfilesRegistryHelper.ts +67 -58
- package/utils/DriverHelper.ts +726 -701
- package/utils/KubernetesCommandLineToolsExecutor.ts +196 -172
- package/utils/Logger.ts +104 -75
- package/utils/ScreenCatcher.ts +59 -48
- package/utils/ShellExecutor.ts +19 -11
- package/utils/StringUtil.ts +40 -32
- package/utils/request-handlers/CheApiRequestHandler.ts +92 -87
- 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 +153 -142
- package/utils/workspace/WorkspaceStatus.ts +5 -5
- package/constants/APITestConstants.ts +0 -56
- package/constants/BaseTestConstants.ts +0 -65
- 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.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
|
|
@@ -14,40 +14,42 @@ import { BrowserTabsUtil } from '../utils/BrowserTabsUtil';
|
|
|
14
14
|
import { inject, injectable } from 'inversify';
|
|
15
15
|
import { Dashboard } from '../pageobjects/dashboard/Dashboard';
|
|
16
16
|
import { IOcpLoginPage } from '../pageobjects/login/interfaces/IOcpLoginPage';
|
|
17
|
-
import {
|
|
17
|
+
import { BASE_TEST_CONSTANTS } from '../constants/BASE_TEST_CONSTANTS';
|
|
18
18
|
|
|
19
19
|
@injectable()
|
|
20
20
|
export class LoginTests {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
constructor(
|
|
22
|
+
@inject(CLASSES.BrowserTabsUtil)
|
|
23
|
+
private readonly browserTabsUtil: BrowserTabsUtil,
|
|
24
|
+
@inject(TYPES.CheLogin)
|
|
25
|
+
private readonly productLoginPage: ICheLoginPage,
|
|
26
|
+
@inject(TYPES.OcpLogin) private readonly ocpLoginPage: IOcpLoginPage,
|
|
27
|
+
@inject(CLASSES.Dashboard) private readonly dashboard: Dashboard
|
|
28
|
+
) {}
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
loginIntoChe(): void {
|
|
31
|
+
test('Login', async (): Promise<void> => {
|
|
32
|
+
if (!(await this.browserTabsUtil.getCurrentUrl()).includes(BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL)) {
|
|
33
|
+
await this.browserTabsUtil.navigateTo(BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL);
|
|
34
|
+
}
|
|
35
|
+
await this.productLoginPage.login();
|
|
36
|
+
await this.browserTabsUtil.maximize();
|
|
37
|
+
await this.dashboard.waitStartingPageLoaderDisappearance();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
loginIntoOcpConsole(): void {
|
|
42
|
+
test('Login into ocp console', async (): Promise<void> => {
|
|
43
|
+
const openshiftConsoleUrl: string = BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL.replace('devspaces', 'console-openshift-console');
|
|
44
|
+
await this.browserTabsUtil.navigateTo(openshiftConsoleUrl);
|
|
45
|
+
this.ocpLoginPage.login();
|
|
46
|
+
await this.browserTabsUtil.maximize();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
47
49
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
logoutFromChe(): void {
|
|
51
|
+
test('Logout', async (): Promise<void> => {
|
|
52
|
+
await this.dashboard.logout();
|
|
53
|
+
});
|
|
54
|
+
}
|
|
53
55
|
}
|
|
@@ -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
|
|
@@ -14,24 +14,27 @@ import { By, until } from 'selenium-webdriver';
|
|
|
14
14
|
import { DriverHelper } from '../utils/DriverHelper';
|
|
15
15
|
import { CLASSES } from '../configs/inversify.types';
|
|
16
16
|
import { Logger } from '../utils/Logger';
|
|
17
|
-
import {
|
|
17
|
+
import { TIMEOUT_CONSTANTS } from '../constants/TIMEOUT_CONSTANTS';
|
|
18
18
|
|
|
19
19
|
@injectable()
|
|
20
20
|
export class ProjectAndFileTests {
|
|
21
|
+
constructor(
|
|
22
|
+
@inject(CLASSES.DriverHelper)
|
|
23
|
+
private readonly driverHelper: DriverHelper
|
|
24
|
+
) {}
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
26
|
+
async waitWorkspaceReadinessForCheCodeEditor(): Promise<void> {
|
|
27
|
+
Logger.debug('waiting for editor.');
|
|
28
|
+
try {
|
|
29
|
+
const start: number = new Date().getTime();
|
|
30
|
+
await this.driverHelper
|
|
31
|
+
.getDriver()
|
|
32
|
+
.wait(until.elementLocated(By.className('monaco-workbench')), TIMEOUT_CONSTANTS.TS_SELENIUM_START_WORKSPACE_TIMEOUT);
|
|
33
|
+
const end: number = new Date().getTime();
|
|
34
|
+
Logger.debug(`editor was opened in ${end - start} seconds.`);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
Logger.error(`waiting for workspace readiness failed: ${err}`);
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
37
40
|
}
|
|
@@ -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,129 +13,119 @@ import { inject, injectable } from 'inversify';
|
|
|
13
13
|
import { CLASSES } from '../configs/inversify.types';
|
|
14
14
|
import { Dashboard } from '../pageobjects/dashboard/Dashboard';
|
|
15
15
|
import { CreateWorkspace } from '../pageobjects/dashboard/CreateWorkspace';
|
|
16
|
-
import { Workspaces } from '../pageobjects/dashboard/Workspaces';
|
|
17
16
|
import { BrowserTabsUtil } from '../utils/BrowserTabsUtil';
|
|
18
17
|
import { Logger } from '../utils/Logger';
|
|
19
18
|
import { ApiUrlResolver } from '../utils/workspace/ApiUrlResolver';
|
|
20
|
-
import {
|
|
19
|
+
import { TIMEOUT_CONSTANTS } from '../constants/TIMEOUT_CONSTANTS';
|
|
21
20
|
import { DriverHelper } from '../utils/DriverHelper';
|
|
22
21
|
import { By, error } from 'selenium-webdriver';
|
|
23
22
|
|
|
24
23
|
@injectable()
|
|
25
24
|
export class WorkspaceHandlingTests {
|
|
25
|
+
private static WORKSPACE_NAME_LOCATOR: By = By.xpath('//h1[contains(.,"Starting workspace ")]');
|
|
26
|
+
private static workspaceName: string = 'undefined';
|
|
27
|
+
private static parentGUID: string;
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
constructor(
|
|
30
|
+
@inject(CLASSES.Dashboard) private readonly dashboard: Dashboard,
|
|
31
|
+
@inject(CLASSES.CreateWorkspace)
|
|
32
|
+
private readonly createWorkspace: CreateWorkspace,
|
|
33
|
+
@inject(CLASSES.BrowserTabsUtil)
|
|
34
|
+
private readonly browserTabsUtil: BrowserTabsUtil,
|
|
35
|
+
@inject(CLASSES.ApiUrlResolver)
|
|
36
|
+
private readonly apiUrlResolver: ApiUrlResolver,
|
|
37
|
+
@inject(CLASSES.DriverHelper)
|
|
38
|
+
private readonly driverHelper: DriverHelper
|
|
39
|
+
) {}
|
|
30
40
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
41
|
+
static getWorkspaceName(): string {
|
|
42
|
+
return WorkspaceHandlingTests.workspaceName;
|
|
43
|
+
}
|
|
34
44
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@inject(CLASSES.Workspaces) private readonly workspaces: Workspaces,
|
|
39
|
-
@inject(CLASSES.BrowserTabsUtil) private readonly browserTabsUtil: BrowserTabsUtil,
|
|
40
|
-
@inject(CLASSES.ApiUrlResolver) private readonly apiUrlResolver: ApiUrlResolver,
|
|
41
|
-
@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) {}
|
|
45
|
+
setWindowHandle(guid: string): void {
|
|
46
|
+
WorkspaceHandlingTests.parentGUID = guid;
|
|
47
|
+
}
|
|
42
48
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
getWindowHandle(): string {
|
|
50
|
+
return WorkspaceHandlingTests.parentGUID;
|
|
51
|
+
}
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
async createAndOpenWorkspace(stack: string): Promise<void> {
|
|
54
|
+
await this.dashboard.clickWorkspacesButton();
|
|
55
|
+
await this.dashboard.waitPage();
|
|
56
|
+
Logger.debug('fetching user kubernetes namespace, storing auth token by getting workspaces API URL.');
|
|
57
|
+
await this.apiUrlResolver.getWorkspacesApiUrl();
|
|
58
|
+
await this.dashboard.clickCreateWorkspaceButton();
|
|
59
|
+
await this.createWorkspace.waitPage();
|
|
60
|
+
WorkspaceHandlingTests.parentGUID = await this.browserTabsUtil.getCurrentWindowHandle();
|
|
61
|
+
await this.createWorkspace.clickOnSampleNoEditorSelection(stack);
|
|
62
|
+
await this.browserTabsUtil.waitAndSwitchToAnotherWindow(WorkspaceHandlingTests.parentGUID, TIMEOUT_CONSTANTS.TS_IDE_LOAD_TIMEOUT);
|
|
63
|
+
}
|
|
50
64
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
await this.browserTabsUtil.waitAndSwitchToAnotherWindow(WorkspaceHandlingTests.parentGUID, TimeoutConstants.TS_IDE_LOAD_TIMEOUT);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
65
|
+
async createAndOpenWorkspaceFromGitRepository(factoryUrl: string): Promise<void> {
|
|
66
|
+
await this.dashboard.waitPage();
|
|
67
|
+
Logger.debug('fetching user kubernetes namespace, storing auth token by getting workspaces API URL.');
|
|
68
|
+
await this.apiUrlResolver.getWorkspacesApiUrl();
|
|
69
|
+
await this.dashboard.clickCreateWorkspaceButton();
|
|
70
|
+
await this.createWorkspace.waitPage();
|
|
71
|
+
WorkspaceHandlingTests.parentGUID = await this.browserTabsUtil.getCurrentWindowHandle();
|
|
72
|
+
await this.createWorkspace.importFromGitUsingUI(factoryUrl);
|
|
73
|
+
await this.browserTabsUtil.waitAndSwitchToAnotherWindow(WorkspaceHandlingTests.parentGUID, TIMEOUT_CONSTANTS.TS_IDE_LOAD_TIMEOUT);
|
|
74
|
+
}
|
|
64
75
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
await this.apiUrlResolver.getWorkspacesApiUrl();
|
|
70
|
-
await this.dashboard.clickCreateWorkspaceButton();
|
|
71
|
-
await this.createWorkspace.waitPage();
|
|
72
|
-
WorkspaceHandlingTests.parentGUID = await this.browserTabsUtil.getCurrentWindowHandle();
|
|
73
|
-
await this.createWorkspace.importFromGitUsingUI(factoryUrl);
|
|
74
|
-
await this.browserTabsUtil.waitAndSwitchToAnotherWindow(WorkspaceHandlingTests.parentGUID, TimeoutConstants.TS_IDE_LOAD_TIMEOUT);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
76
|
+
async obtainWorkspaceNameFromStartingPage(): Promise<void> {
|
|
77
|
+
const timeout: number = TIMEOUT_CONSTANTS.TS_IDE_LOAD_TIMEOUT;
|
|
78
|
+
const polling: number = TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING;
|
|
79
|
+
const attempts: number = Math.ceil(timeout / polling);
|
|
77
80
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
81
|
+
for (let i: number = 0; i < attempts; i++) {
|
|
82
|
+
try {
|
|
83
|
+
const startingWorkspaceLineContent: string = await this.driverHelper
|
|
84
|
+
.getDriver()
|
|
85
|
+
.findElement(WorkspaceHandlingTests.WORKSPACE_NAME_LOCATOR)
|
|
86
|
+
.getText();
|
|
87
|
+
Logger.trace(`obtained starting workspace getText():${startingWorkspaceLineContent}`);
|
|
88
|
+
// cutting away leading text
|
|
89
|
+
WorkspaceHandlingTests.workspaceName = startingWorkspaceLineContent.substring('Starting workspace '.length).trim();
|
|
90
|
+
Logger.trace(`trimmed workspace name from getText():${WorkspaceHandlingTests.workspaceName}`);
|
|
91
|
+
break;
|
|
92
|
+
} catch (err) {
|
|
93
|
+
if (err instanceof error.StaleElementReferenceError) {
|
|
94
|
+
Logger.trace('failed to obtain name from workspace start page, element possibly detached from DOM. Retrying.');
|
|
95
|
+
await this.driverHelper.wait(polling);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (err instanceof error.NoSuchElementError) {
|
|
99
|
+
Logger.trace('failed to obtain name from workspace start page, element not visible yet. Retrying.');
|
|
100
|
+
await this.driverHelper.wait(polling);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
Logger.error(`obtaining workspace name failed with an unexpected error:${err}`);
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (WorkspaceHandlingTests.workspaceName !== '' && WorkspaceHandlingTests.workspaceName !== 'undefined') {
|
|
108
|
+
Logger.info(`obtained workspace name from workspace loader page: ${WorkspaceHandlingTests.workspaceName}`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
Logger.error(`failed to obtain workspace name:${WorkspaceHandlingTests.workspaceName}`);
|
|
112
|
+
throw new error.InvalidArgumentError(
|
|
113
|
+
`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage failed to obtain workspace name:${WorkspaceHandlingTests.workspaceName}`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
88
116
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const attempts: number = Math.ceil(timeout / polling);
|
|
117
|
+
async stopWorkspace(workspaceName: string): Promise<void> {
|
|
118
|
+
await this.dashboard.openDashboard();
|
|
119
|
+
await this.dashboard.stopWorkspaceByUI(workspaceName);
|
|
120
|
+
}
|
|
94
121
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
// cutting away leading text
|
|
100
|
-
WorkspaceHandlingTests.workspaceName = startingWorkspaceLineContent.substring('Starting workspace '.length).trim();
|
|
101
|
-
Logger.trace(`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage trimmed workspace name from getText():${WorkspaceHandlingTests.workspaceName}`);
|
|
102
|
-
break;
|
|
103
|
-
} catch (err) {
|
|
104
|
-
if (err instanceof error.StaleElementReferenceError) {
|
|
105
|
-
Logger.trace(`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage Failed to obtain name from workspace start page, element possibly detached from DOM. Retrying.`);
|
|
106
|
-
await this.driverHelper.wait(polling);
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
if (err instanceof error.NoSuchElementError) {
|
|
110
|
-
Logger.trace(`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage Failed to obtain name from workspace start page, element not visible yet. Retrying.`);
|
|
111
|
-
await this.driverHelper.wait(polling);
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
Logger.error(`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage Obtaining workspace name failed with an unexpected error:${err}`);
|
|
115
|
-
throw err;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (WorkspaceHandlingTests.workspaceName !== '' && WorkspaceHandlingTests.workspaceName !== 'undefined') {
|
|
119
|
-
Logger.info(`Obtained workspace name from workspace loader page: ${WorkspaceHandlingTests.workspaceName}`);
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
Logger.error(`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage failed to obtain workspace name:${WorkspaceHandlingTests.workspaceName}`);
|
|
123
|
-
throw new error.InvalidArgumentError(`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage failed to obtain workspace name:${WorkspaceHandlingTests.workspaceName}`);
|
|
124
|
-
});
|
|
125
|
-
}
|
|
122
|
+
async removeWorkspace(workspaceName: string): Promise<void> {
|
|
123
|
+
await this.dashboard.openDashboard();
|
|
124
|
+
await this.dashboard.deleteStoppedWorkspaceByUI(workspaceName);
|
|
125
|
+
}
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
async removeWorkspace(workspaceName: string): Promise<void> {
|
|
133
|
-
await this.dashboard.openDashboard();
|
|
134
|
-
await this.dashboard.deleteStoppedWorkspaceByUI(workspaceName);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async stopAndRemoveWorkspace(workspaceName: string): Promise<void> {
|
|
138
|
-
await this.dashboard.openDashboard();
|
|
139
|
-
await this.dashboard.stopAndRemoveWorkspaceByUI(workspaceName);
|
|
140
|
-
}
|
|
127
|
+
async stopAndRemoveWorkspace(workspaceName: string): Promise<void> {
|
|
128
|
+
await this.dashboard.openDashboard();
|
|
129
|
+
await this.dashboard.stopAndRemoveWorkspaceByUI(workspaceName);
|
|
130
|
+
}
|
|
141
131
|
}
|
package/tsconfig.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"skipLibCheck": true,
|
|
4
|
+
"target": "es2017",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"outDir": "dist",
|
|
9
|
+
"lib": ["es2017", "dom"],
|
|
10
|
+
"types": ["reflect-metadata", "@types/mocha", "@types/node"],
|
|
11
|
+
"experimentalDecorators": true,
|
|
12
|
+
"emitDecoratorMetadata": true,
|
|
13
|
+
"noImplicitReturns": false,
|
|
14
|
+
"sourceMap": true
|
|
15
|
+
},
|
|
16
|
+
"include": [".eslintrc.js", "**/*.ts", "**/**/*.ts"]
|
|
17
17
|
}
|
package/utils/BrowserTabsUtil.ts
CHANGED
|
@@ -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
|
|
@@ -8,106 +8,112 @@
|
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
**********************************************************************/
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { inject, injectable } from 'inversify';
|
|
12
12
|
import { CLASSES } from '../configs/inversify.types';
|
|
13
13
|
import { DriverHelper } from './DriverHelper';
|
|
14
14
|
import { Logger } from './Logger';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { TIMEOUT_CONSTANTS } from '../constants/TIMEOUT_CONSTANTS';
|
|
16
|
+
import { CHROME_DRIVER_CONSTANTS } from '../constants/CHROME_DRIVER_CONSTANTS';
|
|
17
17
|
|
|
18
18
|
@injectable()
|
|
19
19
|
export class BrowserTabsUtil {
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
20
|
+
constructor(
|
|
21
|
+
@inject(CLASSES.DriverHelper)
|
|
22
|
+
private readonly driverHelper: DriverHelper
|
|
23
|
+
) {}
|
|
24
|
+
|
|
25
|
+
async switchToWindow(windowHandle: string): Promise<void> {
|
|
26
|
+
Logger.debug();
|
|
27
|
+
await this.driverHelper.getDriver().switchTo().window(windowHandle);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async getAllWindowHandles(): Promise<string[]> {
|
|
31
|
+
Logger.debug();
|
|
32
|
+
|
|
33
|
+
return (await this.driverHelper.getDriver()).getAllWindowHandles();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async getCurrentWindowHandle(): Promise<string> {
|
|
37
|
+
Logger.debug();
|
|
38
|
+
|
|
39
|
+
return await this.driverHelper.getDriver().getWindowHandle();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async navigateTo(url: string): Promise<void> {
|
|
43
|
+
Logger.debug(`${url}`);
|
|
44
|
+
|
|
45
|
+
await this.driverHelper.getDriver().navigate().to(url);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async navigateAndWaitToUrl(url: string, timeout: number = TIMEOUT_CONSTANTS.TS_SELENIUM_WAIT_FOR_URL): Promise<void> {
|
|
49
|
+
Logger.trace(`${url}`);
|
|
50
|
+
|
|
51
|
+
await this.navigateTo(url);
|
|
52
|
+
await this.waitURL(url, timeout);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async waitAndSwitchToAnotherWindow(currentWindowHandle: string, timeout: number): Promise<void> {
|
|
56
|
+
Logger.debug();
|
|
57
|
+
|
|
58
|
+
await this.driverHelper.waitUntilTrue(async (): Promise<boolean> => {
|
|
59
|
+
const windowHandles: string[] = await this.getAllWindowHandles();
|
|
60
|
+
|
|
61
|
+
return windowHandles.length > 1;
|
|
62
|
+
}, timeout);
|
|
63
|
+
|
|
64
|
+
const windowHandles: string[] = await this.getAllWindowHandles();
|
|
65
|
+
|
|
66
|
+
for (const windowHandle of windowHandles) {
|
|
67
|
+
if (windowHandle !== currentWindowHandle) {
|
|
68
|
+
await this.switchToWindow(windowHandle);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async refreshPage(): Promise<void> {
|
|
74
|
+
Logger.debug();
|
|
75
|
+
|
|
76
|
+
await (await this.driverHelper.getDriver()).navigate().refresh();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async getCurrentUrl(): Promise<string> {
|
|
80
|
+
return await this.driverHelper.getDriver().getCurrentUrl();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async waitURL(expectedUrl: string, timeout: number): Promise<void> {
|
|
84
|
+
Logger.trace(`${expectedUrl}`);
|
|
85
|
+
try {
|
|
86
|
+
await this.driverHelper.getDriver().wait(async (): Promise<boolean | undefined> => {
|
|
87
|
+
const currentUrl: string = await this.driverHelper.getDriver().getCurrentUrl();
|
|
88
|
+
const urlEquals: boolean = currentUrl === expectedUrl;
|
|
89
|
+
|
|
90
|
+
if (urlEquals) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}, timeout);
|
|
94
|
+
} catch (e) {
|
|
95
|
+
throw e;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async maximize(): Promise<void> {
|
|
100
|
+
Logger.trace();
|
|
101
|
+
if (CHROME_DRIVER_CONSTANTS.TS_SELENIUM_LAUNCH_FULLSCREEN) {
|
|
102
|
+
Logger.debug('TS_SELENIUM_LAUNCH_FULLSCREEN is set to true, maximizing window.');
|
|
103
|
+
await this.driverHelper.getDriver().manage().window().maximize();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async closeAllTabsExceptCurrent(): Promise<void> {
|
|
108
|
+
Logger.trace();
|
|
109
|
+
const allTabsHandles: string[] = await this.getAllWindowHandles();
|
|
110
|
+
const currentTabHandle: string = await this.getCurrentWindowHandle();
|
|
111
|
+
allTabsHandles.splice(allTabsHandles.indexOf(currentTabHandle), 1);
|
|
112
|
+
|
|
113
|
+
for (const tabHandle of allTabsHandles) {
|
|
114
|
+
await this.switchToWindow(tabHandle);
|
|
115
|
+
await this.driverHelper.getDriver().close();
|
|
116
|
+
}
|
|
117
|
+
await this.switchToWindow(currentTabHandle);
|
|
118
|
+
}
|
|
113
119
|
}
|