@eclipse-che/che-e2e 7.73.0-dev-1397a5e → 7.73.0-dev-ed57855
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/configs/inversify.config.ts +6 -6
- package/configs/inversify.types.ts +27 -27
- package/configs/mocharc.ts +21 -21
- package/constants/APITestConstants.ts +39 -38
- package/constants/BaseTestConstants.ts +46 -43
- package/constants/ChromeDriverConstants.ts +29 -29
- package/constants/FactoryTestConstants.ts +30 -30
- package/constants/MonacoConstants.ts +10 -10
- package/constants/OAuthConstants.ts +46 -46
- package/constants/ReporterConstants.ts +28 -28
- package/constants/TimeoutConstants.ts +101 -101
- package/dist/configs/inversify.config.js.map +1 -1
- package/dist/configs/inversify.types.js.map +1 -1
- package/dist/configs/mocharc.js +1 -1
- package/dist/configs/mocharc.js.map +1 -1
- package/dist/constants/APITestConstants.js +2 -2
- package/dist/constants/APITestConstants.js.map +1 -1
- package/dist/constants/BaseTestConstants.js +2 -1
- package/dist/constants/BaseTestConstants.js.map +1 -1
- package/dist/constants/ChromeDriverConstants.js +1 -1
- package/dist/constants/ChromeDriverConstants.js.map +1 -1
- package/dist/constants/FactoryTestConstants.js +1 -1
- package/dist/constants/FactoryTestConstants.js.map +1 -1
- package/dist/constants/MonacoConstants.js +1 -1
- package/dist/constants/MonacoConstants.js.map +1 -1
- package/dist/constants/OAuthConstants.js +1 -1
- package/dist/constants/OAuthConstants.js.map +1 -1
- package/dist/constants/ReporterConstants.js +1 -1
- package/dist/constants/ReporterConstants.js.map +1 -1
- package/dist/constants/TimeoutConstants.js.map +1 -1
- package/dist/driver/ChromeDriver.js.map +1 -1
- package/dist/pageobjects/dashboard/CreateWorkspace.js +8 -8
- package/dist/pageobjects/dashboard/CreateWorkspace.js.map +1 -1
- package/dist/pageobjects/dashboard/Dashboard.js +11 -11
- package/dist/pageobjects/dashboard/Dashboard.js.map +1 -1
- package/dist/pageobjects/dashboard/Workspaces.js +14 -14
- package/dist/pageobjects/dashboard/Workspaces.js.map +1 -1
- package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js +8 -8
- package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js.map +1 -1
- package/dist/pageobjects/git-providers/OauthPage.js +17 -17
- package/dist/pageobjects/git-providers/OauthPage.js.map +1 -1
- package/dist/pageobjects/ide/CheCodeLocatorLoader.js +1 -1
- package/dist/pageobjects/ide/CheCodeLocatorLoader.js.map +1 -1
- package/dist/pageobjects/login/kubernetes/DexLoginPage.js +5 -5
- package/dist/pageobjects/login/kubernetes/DexLoginPage.js.map +1 -1
- package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js +1 -1
- package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpLoginPage.js +10 -10
- package/dist/pageobjects/login/openshift/OcpLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js +2 -2
- package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/OcpUserLoginPage.js +1 -1
- package/dist/pageobjects/login/openshift/OcpUserLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/RedHatLoginPage.js +6 -6
- package/dist/pageobjects/login/openshift/RedHatLoginPage.js.map +1 -1
- package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js +2 -2
- package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpApplicationPage.js +2 -2
- package/dist/pageobjects/openshift/OcpApplicationPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js +5 -5
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpMainPage.js +11 -11
- package/dist/pageobjects/openshift/OcpMainPage.js.map +1 -1
- package/dist/specs/MochaHooks.js +1 -1
- package/dist/specs/MochaHooks.js.map +1 -1
- package/dist/specs/SmokeTest.spec.js +7 -3
- package/dist/specs/SmokeTest.spec.js.map +1 -1
- package/dist/specs/api/ContainerOverridesAPI.spec.js.map +1 -1
- package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js +7 -5
- package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js.map +1 -1
- package/dist/specs/api/EmptyWorkspaceAPI.spec.js +1 -1
- package/dist/specs/api/EmptyWorkspaceAPI.spec.js.map +1 -1
- package/dist/specs/api/PodOverridesAPI.spec.js +2 -1
- package/dist/specs/api/PodOverridesAPI.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js +9 -5
- package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/Quarkus.spec.js +7 -3
- package/dist/specs/dashboard-samples/Quarkus.spec.js.map +1 -1
- package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js +6 -2
- package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js.map +1 -1
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js +3 -1
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js.map +1 -1
- package/dist/specs/factory/Factory.spec.js +3 -1
- package/dist/specs/factory/Factory.spec.js.map +1 -1
- package/dist/specs/factory/NoSetupRepoFactory.spec.js +4 -2
- package/dist/specs/factory/NoSetupRepoFactory.spec.js.map +1 -1
- package/dist/specs/factory/RefusedOAuthFactory.spec.js +4 -2
- package/dist/specs/factory/RefusedOAuthFactory.spec.js.map +1 -1
- package/dist/specs/miscellaneous/PredefinedNamespace.spec.js +6 -2
- package/dist/specs/miscellaneous/PredefinedNamespace.spec.js.map +1 -1
- package/dist/tests-library/LoginTests.js.map +1 -1
- package/dist/tests-library/ProjectAndFileTests.js +3 -3
- package/dist/tests-library/ProjectAndFileTests.js.map +1 -1
- package/dist/tests-library/WorkspaceHandlingTests.js +54 -74
- package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
- package/dist/utils/BrowserTabsUtil.js +10 -10
- package/dist/utils/BrowserTabsUtil.js.map +1 -1
- package/dist/utils/CheReporter.js.map +1 -1
- package/dist/utils/DevWorkspaceConfigurationHelper.js +2 -2
- package/dist/utils/DevWorkspaceConfigurationHelper.js.map +1 -1
- package/dist/utils/DevfilesRegistryHelper.js +7 -7
- package/dist/utils/DevfilesRegistryHelper.js.map +1 -1
- package/dist/utils/DriverHelper.js +81 -81
- package/dist/utils/DriverHelper.js.map +1 -1
- package/dist/utils/KubernetesCommandLineToolsExecutor.js +38 -35
- package/dist/utils/KubernetesCommandLineToolsExecutor.js.map +1 -1
- package/dist/utils/Logger.js +19 -10
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/ScreenCatcher.js.map +1 -1
- package/dist/utils/ShellExecutor.js.map +1 -1
- package/dist/utils/StringUtil.js +2 -2
- package/dist/utils/StringUtil.js.map +1 -1
- package/dist/utils/request-handlers/CheApiRequestHandler.js +13 -11
- package/dist/utils/request-handlers/CheApiRequestHandler.js.map +1 -1
- package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js +1 -1
- package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js.map +1 -1
- package/dist/utils/workspace/ApiUrlResolver.js +3 -3
- package/dist/utils/workspace/ApiUrlResolver.js.map +1 -1
- package/dist/utils/workspace/TestWorkspaceUtil.js +20 -16
- package/dist/utils/workspace/TestWorkspaceUtil.js.map +1 -1
- package/dist/utils/workspace/WorkspaceStatus.js.map +1 -1
- package/driver/ChromeDriver.ts +44 -44
- package/driver/IDriver.ts +1 -1
- package/package.json +1 -1
- package/pageobjects/dashboard/CreateWorkspace.ts +52 -52
- package/pageobjects/dashboard/Dashboard.ts +72 -72
- package/pageobjects/dashboard/Workspaces.ts +138 -139
- package/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +92 -93
- package/pageobjects/git-providers/OauthPage.ts +136 -136
- package/pageobjects/ide/CheCodeLocatorLoader.ts +40 -40
- package/pageobjects/login/interfaces/ICheLoginPage.ts +1 -1
- package/pageobjects/login/interfaces/IOcpLoginPage.ts +1 -1
- package/pageobjects/login/kubernetes/DexLoginPage.ts +27 -27
- package/pageobjects/login/kubernetes/KubernetesLoginPage.ts +11 -11
- package/pageobjects/login/openshift/OcpLoginPage.ts +50 -50
- package/pageobjects/login/openshift/OcpRedHatLoginPage.ts +21 -21
- package/pageobjects/login/openshift/OcpUserLoginPage.ts +14 -14
- package/pageobjects/login/openshift/RedHatLoginPage.ts +44 -41
- package/pageobjects/login/openshift/RegularUserOcpCheLoginPage.ts +23 -23
- package/pageobjects/openshift/OcpApplicationPage.ts +16 -16
- package/pageobjects/openshift/OcpImportFromGitPage.ts +54 -54
- package/pageobjects/openshift/OcpMainPage.ts +64 -64
- package/resources/pod-overrides-airgap.yaml +37 -0
- package/specs/MochaHooks.ts +44 -44
- package/specs/SmokeTest.spec.ts +35 -31
- package/specs/api/ContainerOverridesAPI.spec.ts +23 -23
- package/specs/api/DevfileAcceptanceTestAPI.spec.ts +93 -91
- package/specs/api/EmptyWorkspaceAPI.spec.ts +50 -50
- package/specs/api/PodOverridesAPI.spec.ts +30 -29
- package/specs/dashboard-samples/EmptyWorkspace.spec.ts +29 -25
- package/specs/dashboard-samples/Quarkus.spec.ts +31 -27
- package/specs/dashboard-samples/RecommendedExtensions.spec.ts +156 -152
- package/specs/devconsole-intergration/DevConsoleIntegration.spec.ts +62 -64
- package/specs/factory/Factory.spec.ts +149 -147
- package/specs/factory/NoSetupRepoFactory.spec.ts +188 -186
- package/specs/factory/RefusedOAuthFactory.spec.ts +182 -180
- package/specs/miscellaneous/PredefinedNamespace.spec.ts +52 -48
- package/tests-library/LoginTests.ts +29 -29
- package/tests-library/ProjectAndFileTests.ts +13 -13
- package/tests-library/WorkspaceHandlingTests.ts +84 -103
- package/utils/BrowserTabsUtil.ts +69 -69
- package/utils/CheReporter.ts +4 -6
- package/utils/DevWorkspaceConfigurationHelper.ts +58 -58
- package/utils/DevfilesRegistryHelper.ts +51 -51
- package/utils/DriverHelper.ts +599 -600
- package/utils/KubernetesCommandLineToolsExecutor.ts +166 -158
- package/utils/Logger.ts +98 -67
- package/utils/ScreenCatcher.ts +42 -42
- package/utils/ShellExecutor.ts +10 -10
- package/utils/StringUtil.ts +29 -29
- package/utils/request-handlers/CheApiRequestHandler.ts +84 -82
- package/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.ts +18 -18
- package/utils/request-handlers/headers/IAuthorizationHeaderHandler.ts +1 -1
- package/utils/workspace/ApiUrlResolver.ts +23 -23
- package/utils/workspace/ITestWorkspaceUtil.ts +29 -29
- package/utils/workspace/TestWorkspaceUtil.ts +120 -116
- package/utils/workspace/WorkspaceStatus.ts +3 -3
|
@@ -13,7 +13,6 @@ 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';
|
|
@@ -24,118 +23,100 @@ import { By, error } from 'selenium-webdriver';
|
|
|
24
23
|
@injectable()
|
|
25
24
|
export class WorkspaceHandlingTests {
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
static getWorkspaceName(): string {
|
|
27
|
+
return WorkspaceHandlingTests.workspaceName;
|
|
28
|
+
}
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
private static WORKSPACE_NAME_LOCATOR: By = By.xpath(`//h1[contains(.,'Starting workspace ')]`);
|
|
31
|
+
private static workspaceName: string = 'undefined';
|
|
32
|
+
private static parentGUID: string;
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) {}
|
|
34
|
+
constructor(
|
|
35
|
+
@inject(CLASSES.Dashboard) private readonly dashboard: Dashboard,
|
|
36
|
+
@inject(CLASSES.CreateWorkspace) private readonly createWorkspace: CreateWorkspace,
|
|
37
|
+
@inject(CLASSES.BrowserTabsUtil) private readonly browserTabsUtil: BrowserTabsUtil,
|
|
38
|
+
@inject(CLASSES.ApiUrlResolver) private readonly apiUrlResolver: ApiUrlResolver,
|
|
39
|
+
@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) {}
|
|
42
40
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
setWindowHandle(guid: string): void {
|
|
42
|
+
WorkspaceHandlingTests.parentGUID = guid;
|
|
43
|
+
}
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
getWindowHandle(): string {
|
|
46
|
+
return WorkspaceHandlingTests.parentGUID;
|
|
47
|
+
}
|
|
50
48
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
});
|
|
63
|
-
}
|
|
49
|
+
async createAndOpenWorkspace(stack: string): Promise<void> {
|
|
50
|
+
await this.dashboard.clickWorkspacesButton();
|
|
51
|
+
await this.dashboard.waitPage();
|
|
52
|
+
Logger.debug(`fetching user kubernetes namespace, storing auth token by getting workspaces API URL.`);
|
|
53
|
+
await this.apiUrlResolver.getWorkspacesApiUrl();
|
|
54
|
+
await this.dashboard.clickCreateWorkspaceButton();
|
|
55
|
+
await this.createWorkspace.waitPage();
|
|
56
|
+
WorkspaceHandlingTests.parentGUID = await this.browserTabsUtil.getCurrentWindowHandle();
|
|
57
|
+
await this.createWorkspace.clickOnSampleNoEditorSelection(stack);
|
|
58
|
+
await this.browserTabsUtil.waitAndSwitchToAnotherWindow(WorkspaceHandlingTests.parentGUID, TimeoutConstants.TS_IDE_LOAD_TIMEOUT);
|
|
59
|
+
}
|
|
64
60
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
});
|
|
76
|
-
}
|
|
61
|
+
async createAndOpenWorkspaceFromGitRepository(factoryUrl: string): Promise<void> {
|
|
62
|
+
await this.dashboard.waitPage();
|
|
63
|
+
Logger.debug(`fetching user kubernetes namespace, storing auth token by getting workspaces API URL.`);
|
|
64
|
+
await this.apiUrlResolver.getWorkspacesApiUrl();
|
|
65
|
+
await this.dashboard.clickCreateWorkspaceButton();
|
|
66
|
+
await this.createWorkspace.waitPage();
|
|
67
|
+
WorkspaceHandlingTests.parentGUID = await this.browserTabsUtil.getCurrentWindowHandle();
|
|
68
|
+
await this.createWorkspace.importFromGitUsingUI(factoryUrl);
|
|
69
|
+
await this.browserTabsUtil.waitAndSwitchToAnotherWindow(WorkspaceHandlingTests.parentGUID, TimeoutConstants.TS_IDE_LOAD_TIMEOUT);
|
|
70
|
+
}
|
|
77
71
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
await this.apiUrlResolver.getWorkspacesApiUrl();
|
|
83
|
-
await this.dashboard.clickWorkspacesButton();
|
|
84
|
-
await this.workspaces.waitPage();
|
|
85
|
-
await this.workspaces.clickOpenButton(workspaceName);
|
|
86
|
-
});
|
|
87
|
-
}
|
|
72
|
+
async obtainWorkspaceNameFromStartingPage(): Promise<void> {
|
|
73
|
+
const timeout: number = TimeoutConstants.TS_IDE_LOAD_TIMEOUT;
|
|
74
|
+
const polling: number = TimeoutConstants.TS_SELENIUM_DEFAULT_POLLING;
|
|
75
|
+
const attempts: number = Math.ceil(timeout / polling);
|
|
88
76
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
});
|
|
77
|
+
for (let i: number = 0; i < attempts; i++) {
|
|
78
|
+
try {
|
|
79
|
+
let startingWorkspaceLineContent: string = await this.driverHelper.getDriver().findElement(WorkspaceHandlingTests.WORKSPACE_NAME_LOCATOR).getText();
|
|
80
|
+
Logger.trace(`obtained starting workspace getText():${startingWorkspaceLineContent}`);
|
|
81
|
+
// cutting away leading text
|
|
82
|
+
WorkspaceHandlingTests.workspaceName = startingWorkspaceLineContent.substring('Starting workspace '.length).trim();
|
|
83
|
+
Logger.trace(`trimmed workspace name from getText():${WorkspaceHandlingTests.workspaceName}`);
|
|
84
|
+
break;
|
|
85
|
+
} catch (err) {
|
|
86
|
+
if (err instanceof error.StaleElementReferenceError) {
|
|
87
|
+
Logger.trace(`failed to obtain name from workspace start page, element possibly detached from DOM. Retrying.`);
|
|
88
|
+
await this.driverHelper.wait(polling);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (err instanceof error.NoSuchElementError) {
|
|
92
|
+
Logger.trace(`failed to obtain name from workspace start page, element not visible yet. Retrying.`);
|
|
93
|
+
await this.driverHelper.wait(polling);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
Logger.error(`obtaining workspace name failed with an unexpected error:${err}`);
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
125
99
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
await this.dashboard.stopWorkspaceByUI(workspaceName);
|
|
100
|
+
if (WorkspaceHandlingTests.workspaceName !== '' && WorkspaceHandlingTests.workspaceName !== 'undefined') {
|
|
101
|
+
Logger.info(`obtained workspace name from workspace loader page: ${WorkspaceHandlingTests.workspaceName}`);
|
|
102
|
+
return;
|
|
130
103
|
}
|
|
104
|
+
Logger.error(`failed to obtain workspace name:${WorkspaceHandlingTests.workspaceName}`);
|
|
105
|
+
throw new error.InvalidArgumentError(`WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage failed to obtain workspace name:${WorkspaceHandlingTests.workspaceName}`);
|
|
106
|
+
}
|
|
131
107
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
108
|
+
async stopWorkspace(workspaceName: string): Promise<void> {
|
|
109
|
+
await this.dashboard.openDashboard();
|
|
110
|
+
await this.dashboard.stopWorkspaceByUI(workspaceName);
|
|
111
|
+
}
|
|
136
112
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
113
|
+
async removeWorkspace(workspaceName: string): Promise<void> {
|
|
114
|
+
await this.dashboard.openDashboard();
|
|
115
|
+
await this.dashboard.deleteStoppedWorkspaceByUI(workspaceName);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async stopAndRemoveWorkspace(workspaceName: string): Promise<void> {
|
|
119
|
+
await this.dashboard.openDashboard();
|
|
120
|
+
await this.dashboard.stopAndRemoveWorkspaceByUI(workspaceName);
|
|
121
|
+
}
|
|
141
122
|
}
|
package/utils/BrowserTabsUtil.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
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';
|
|
@@ -17,97 +17,97 @@ import { ChromeDriverConstants } from '../constants/ChromeDriverConstants';
|
|
|
17
17
|
|
|
18
18
|
@injectable()
|
|
19
19
|
export class BrowserTabsUtil {
|
|
20
|
-
|
|
20
|
+
constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { }
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
async switchToWindow(windowHandle: string): Promise<void> {
|
|
23
|
+
Logger.debug();
|
|
24
|
+
await this.driverHelper.getDriver().switchTo().window(windowHandle);
|
|
25
|
+
}
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
async getAllWindowHandles(): Promise<string[]> {
|
|
28
|
+
Logger.debug();
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
return (await this.driverHelper.getDriver()).getAllWindowHandles();
|
|
31
|
+
}
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
async getCurrentWindowHandle(): Promise<string> {
|
|
34
|
+
Logger.debug();
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
return await this.driverHelper.getDriver().getWindowHandle();
|
|
37
|
+
}
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
async navigateTo(url: string): Promise<void> {
|
|
40
|
+
Logger.debug(`${url}`);
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
await this.driverHelper.getDriver().navigate().to(url);
|
|
43
|
+
}
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
async navigateAndWaitToUrl(url: string, timeout: number = TimeoutConstants.TS_SELENIUM_WAIT_FOR_URL): Promise<void> {
|
|
46
|
+
Logger.trace(`${url}`);
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
await this.navigateTo(url);
|
|
49
|
+
await this.waitURL(url, timeout);
|
|
50
|
+
}
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
async waitAndSwitchToAnotherWindow(currentWindowHandle: string, timeout: number): Promise<void> {
|
|
53
|
+
Logger.debug();
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
await this.driverHelper.waitUntilTrue(async () => {
|
|
56
|
+
const windowHandles: string[] = await this.getAllWindowHandles();
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
return windowHandles.length > 1;
|
|
59
|
+
}, timeout);
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
const windowHandles: string[] = await this.getAllWindowHandles();
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
63
|
+
for (const windowHandle of windowHandles) {
|
|
64
|
+
if (windowHandle !== currentWindowHandle) {
|
|
65
|
+
await this.switchToWindow(windowHandle);
|
|
66
|
+
}
|
|
68
67
|
}
|
|
68
|
+
}
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
async refreshPage(): Promise<void> {
|
|
71
|
+
Logger.debug();
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
await (await this.driverHelper.getDriver()).navigate().refresh();
|
|
74
|
+
}
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
async getCurrentUrl(): Promise<string> {
|
|
77
|
+
return await this.driverHelper.getDriver().getCurrentUrl();
|
|
78
|
+
}
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
async waitURL(expectedUrl: string, timeout: number): Promise<void> {
|
|
81
|
+
Logger.trace(`${expectedUrl}`);
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
await this.driverHelper.getDriver().wait(async () => {
|
|
84
|
+
const currentUrl: string = await this.driverHelper.getDriver().getCurrentUrl();
|
|
85
|
+
const urlEquals: boolean = currentUrl === expectedUrl;
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
if (urlEquals) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}, timeout);
|
|
91
|
+
}
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
93
|
+
async maximize(): Promise<void> {
|
|
94
|
+
Logger.trace();
|
|
95
|
+
if (ChromeDriverConstants.TS_SELENIUM_LAUNCH_FULLSCREEN) {
|
|
96
|
+
Logger.debug(`TS_SELENIUM_LAUNCH_FULLSCREEN is set to true, maximizing window.`);
|
|
97
|
+
await this.driverHelper.getDriver().manage().window().maximize();
|
|
99
98
|
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async closeAllTabsExceptCurrent(): Promise<void> {
|
|
102
|
+
Logger.trace();
|
|
103
|
+
const allTabsHandles: string[] = await this.getAllWindowHandles();
|
|
104
|
+
const currentTabHandle: string = await this.getCurrentWindowHandle();
|
|
105
|
+
allTabsHandles.splice(allTabsHandles.indexOf(currentTabHandle), 1);
|
|
100
106
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const currentTabHandle: string = await this.getCurrentWindowHandle();
|
|
105
|
-
allTabsHandles.splice(allTabsHandles.indexOf(currentTabHandle), 1);
|
|
106
|
-
|
|
107
|
-
for (const tabHandle of allTabsHandles) {
|
|
108
|
-
await this.switchToWindow(tabHandle);
|
|
109
|
-
await this.driverHelper.getDriver().close();
|
|
110
|
-
}
|
|
111
|
-
await this.switchToWindow(currentTabHandle);
|
|
107
|
+
for (const tabHandle of allTabsHandles) {
|
|
108
|
+
await this.switchToWindow(tabHandle);
|
|
109
|
+
await this.driverHelper.getDriver().close();
|
|
112
110
|
}
|
|
111
|
+
await this.switchToWindow(currentTabHandle);
|
|
112
|
+
}
|
|
113
113
|
}
|
package/utils/CheReporter.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import * as mocha from 'mocha';
|
|
11
11
|
import { CLASSES } from '../configs/inversify.types';
|
|
12
12
|
import * as fs from 'fs';
|
|
13
|
+
import { WriteStream } from 'fs';
|
|
13
14
|
import * as rm from 'rimraf';
|
|
14
15
|
import { logging } from 'selenium-webdriver';
|
|
15
16
|
import { DriverHelper } from './DriverHelper';
|
|
@@ -17,7 +18,6 @@ import { ScreenCatcher } from './ScreenCatcher';
|
|
|
17
18
|
import { TimeoutConstants } from '../constants/TimeoutConstants';
|
|
18
19
|
import { Logger } from './Logger';
|
|
19
20
|
import { e2eContainer } from '../configs/inversify.config';
|
|
20
|
-
import { WriteStream } from 'fs';
|
|
21
21
|
import { StringUtil } from './StringUtil';
|
|
22
22
|
import { BaseTestConstants } from '../constants/BaseTestConstants';
|
|
23
23
|
import { ChromeDriverConstants } from '../constants/ChromeDriverConstants';
|
|
@@ -79,7 +79,7 @@ class CheReporter extends mocha.reporters.Spec {
|
|
|
79
79
|
rm.sync(ReporterConstants.TS_SELENIUM_REPORT_FOLDER);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
runner.on('test', async function
|
|
82
|
+
runner.on('test', async function(test: mocha.Test): Promise<void> {
|
|
83
83
|
if (!ReporterConstants.TS_SELENIUM_EXECUTION_SCREENCAST) {
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
@@ -108,8 +108,7 @@ class CheReporter extends mocha.reporters.Spec {
|
|
|
108
108
|
}
|
|
109
109
|
});
|
|
110
110
|
|
|
111
|
-
|
|
112
|
-
runner.on('end', async function (): Promise<void> {
|
|
111
|
+
runner.on('end', async function(): Promise<void> {
|
|
113
112
|
// ensure that fired events done
|
|
114
113
|
await driverHelper.wait(5000);
|
|
115
114
|
|
|
@@ -122,7 +121,7 @@ class CheReporter extends mocha.reporters.Spec {
|
|
|
122
121
|
}
|
|
123
122
|
});
|
|
124
123
|
|
|
125
|
-
runner.on('fail', async function
|
|
124
|
+
runner.on('fail', async function(test: mocha.Test): Promise<void> {
|
|
126
125
|
Logger.error(`CheReporter runner.on.fail: ${test.fullTitle()} failed after ${test.duration}ms`);
|
|
127
126
|
// raise flag for keeping the screencast
|
|
128
127
|
deleteScreencast = false;
|
|
@@ -139,7 +138,6 @@ class CheReporter extends mocha.reporters.Spec {
|
|
|
139
138
|
const pageSourceFileName: string = `${testReportDirPath}/pagesource-${testTitle}.html`;
|
|
140
139
|
const browserLogsFileName: string = `${testReportDirPath}/browserlogs-${testTitle}.txt`;
|
|
141
140
|
|
|
142
|
-
|
|
143
141
|
// create reporter dir if not exist
|
|
144
142
|
const reportDirExists: boolean = fs.existsSync(ReporterConstants.TS_SELENIUM_REPORT_FOLDER);
|
|
145
143
|
|
|
@@ -13,71 +13,71 @@ import { APITestConstants } from '../constants/APITestConstants';
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
interface IContextParams {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
16
|
+
devfilePath?: string | undefined;
|
|
17
|
+
devfileUrl?: string | undefined;
|
|
18
|
+
devfileContent?: string | undefined;
|
|
19
|
+
outputFile?: string | undefined;
|
|
20
|
+
editorPath?: string | undefined;
|
|
21
|
+
editorContent?: string | undefined;
|
|
22
|
+
editorEntry?: string | undefined;
|
|
23
|
+
pluginRegistryUrl?: string | undefined;
|
|
24
|
+
projects?: {
|
|
25
|
+
name: string;
|
|
26
|
+
location: string;
|
|
27
|
+
}[];
|
|
28
|
+
injectDefaultComponent?: string | undefined;
|
|
29
|
+
defaultComponentImage?: string | undefined;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
export class DevWorkspaceConfigurationHelper {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
private generator: Generator = new Generator();
|
|
34
|
+
private readonly params: IContextParams;
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
// check if one or both has value
|
|
42
|
-
if (APITestConstants.TS_API_TEST_UDI_IMAGE || params.defaultComponentImage) {
|
|
43
|
-
params.injectDefaultComponent = 'true';
|
|
44
|
-
// check if not explicitly passed than assign value from the constants
|
|
45
|
-
if (!params.defaultComponentImage) {
|
|
46
|
-
params.defaultComponentImage = APITestConstants.TS_API_TEST_UDI_IMAGE;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// assign value from the constants if not explicitly passed
|
|
50
|
-
if (APITestConstants.TS_API_TEST_PLUGIN_REGISTRY_URL && !params.pluginRegistryUrl) {
|
|
51
|
-
params.pluginRegistryUrl = APITestConstants.TS_API_TEST_PLUGIN_REGISTRY_URL;
|
|
52
|
-
}
|
|
53
|
-
if (APITestConstants.TS_API_TEST_CHE_CODE_EDITOR_DEVFILE_URI && !params.editorContent) {
|
|
54
|
-
params.editorContent = ShellExecutor.curl(APITestConstants.TS_API_TEST_CHE_CODE_EDITOR_DEVFILE_URI).stdout;
|
|
55
|
-
}
|
|
56
|
-
this.params = params;
|
|
36
|
+
constructor(params: IContextParams) {
|
|
37
|
+
// check if all undefined
|
|
38
|
+
if (!(params.editorPath || params.editorEntry || params.editorContent)) {
|
|
39
|
+
params.editorEntry = 'che-incubator/che-code/latest';
|
|
57
40
|
}
|
|
41
|
+
// check if one or both has value
|
|
42
|
+
if (APITestConstants.TS_API_TEST_UDI_IMAGE || params.defaultComponentImage) {
|
|
43
|
+
params.injectDefaultComponent = 'true';
|
|
44
|
+
// check if not explicitly passed than assign value from the constants
|
|
45
|
+
if (!params.defaultComponentImage) {
|
|
46
|
+
params.defaultComponentImage = APITestConstants.TS_API_TEST_UDI_IMAGE;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// assign value from the constants if not explicitly passed
|
|
50
|
+
if (APITestConstants.TS_API_TEST_PLUGIN_REGISTRY_URL && !params.pluginRegistryUrl) {
|
|
51
|
+
params.pluginRegistryUrl = APITestConstants.TS_API_TEST_PLUGIN_REGISTRY_URL;
|
|
52
|
+
}
|
|
53
|
+
if (APITestConstants.TS_API_TEST_CHE_CODE_EDITOR_DEVFILE_URI && !params.editorContent) {
|
|
54
|
+
params.editorContent = ShellExecutor.curl(APITestConstants.TS_API_TEST_CHE_CODE_EDITOR_DEVFILE_URI).stdout;
|
|
55
|
+
}
|
|
56
|
+
this.params = params;
|
|
57
|
+
}
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
return await this.generator.generateDevfileContext(
|
|
65
|
-
{
|
|
66
|
-
...this.params,
|
|
67
|
-
projects: this.params.projects
|
|
68
|
-
},
|
|
69
|
-
axios.default as any
|
|
70
|
-
);
|
|
59
|
+
async generateDevfileContext(): Promise<DevfileContext> {
|
|
60
|
+
Logger.debug();
|
|
61
|
+
if (!this.params.projects) {
|
|
62
|
+
this.params.projects = [];
|
|
71
63
|
}
|
|
64
|
+
return await this.generator.generateDevfileContext(
|
|
65
|
+
{
|
|
66
|
+
...this.params,
|
|
67
|
+
projects: this.params.projects
|
|
68
|
+
},
|
|
69
|
+
axios.default as any
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
// write templates and then DevWorkspace in a single file
|
|
74
|
+
async getDevWorkspaceConfigurationYamlAsString(context: DevfileContext): Promise<string> {
|
|
75
|
+
Logger.debug();
|
|
76
|
+
const allContentArray: any[] = context.devWorkspaceTemplates.map(
|
|
77
|
+
(template: V1alpha2DevWorkspaceTemplate) => YAML.stringify(template)
|
|
78
|
+
);
|
|
79
|
+
allContentArray.push(YAML.stringify(context.devWorkspace));
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
return allContentArray.join('---\n');
|
|
82
|
+
}
|
|
83
83
|
}
|