@eclipse-che/che-e2e 7.64.0-dev-2c00276 → 7.64.1-dev-43c3317
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 +10 -4
- package/configs/inversify.types.ts +3 -0
- package/constants/TestConstants.ts +14 -1
- package/constants/TimeoutConstants.ts +3 -3
- package/dist/configs/inversify.config.js +7 -3
- package/dist/configs/inversify.config.js.map +1 -1
- package/dist/configs/inversify.types.js +3 -0
- package/dist/configs/inversify.types.js.map +1 -1
- package/dist/constants/TestConstants.js +12 -2
- package/dist/constants/TestConstants.js.map +1 -1
- package/dist/constants/TimeoutConstants.js +3 -3
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/pageobjects/dashboard/Dashboard.js +5 -4
- package/dist/pageobjects/dashboard/Dashboard.js.map +1 -1
- package/dist/pageobjects/dashboard/Workspaces.js +4 -1
- package/dist/pageobjects/dashboard/Workspaces.js.map +1 -1
- package/dist/pageobjects/ide/CheCodeLocatorLoader.js +5 -0
- package/dist/pageobjects/ide/CheCodeLocatorLoader.js.map +1 -1
- package/dist/pageobjects/login/RedHatLoginPage.js +14 -15
- package/dist/pageobjects/login/RedHatLoginPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpApplicationPage.js +60 -0
- package/dist/pageobjects/openshift/OcpApplicationPage.js.map +1 -0
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js +91 -0
- package/dist/pageobjects/openshift/OcpImportFromGitPage.js.map +1 -0
- package/dist/pageobjects/openshift/OcpLoginPage.js +3 -3
- package/dist/pageobjects/openshift/OcpLoginPage.js.map +1 -1
- package/dist/pageobjects/openshift/OcpMainPage.js +108 -0
- package/dist/pageobjects/openshift/OcpMainPage.js.map +1 -0
- package/dist/specs/api/CloneGitRepoAPI.spec.js +7 -7
- package/dist/specs/api/CloneGitRepoAPI.spec.js.map +1 -1
- package/dist/specs/api/ContainerOverridesAPI.spec.js +36 -0
- package/dist/specs/api/ContainerOverridesAPI.spec.js.map +1 -0
- package/dist/specs/api/PodOverridesAPI.spec.js +42 -0
- package/dist/specs/api/PodOverridesAPI.spec.js.map +1 -0
- package/dist/specs/dashboard-samples/RecomendedExtentions.spec.js +58 -19
- package/dist/specs/dashboard-samples/RecomendedExtentions.spec.js.map +1 -1
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js +75 -0
- package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js.map +1 -0
- package/dist/specs/factory/Factory.spec.js.map +1 -1
- package/dist/specs/factory/NoSetupRepoFactory.spec.js.map +1 -1
- package/dist/specs/factory/RefusedOAuthFactory.spec.js.map +1 -1
- package/dist/tests-library/LoginTests.js +19 -10
- package/dist/tests-library/LoginTests.js.map +1 -1
- package/dist/tests-library/ProjectAndFileTests.js +4 -0
- package/dist/tests-library/ProjectAndFileTests.js.map +1 -1
- package/dist/tests-library/WorkspaceHandlingTests.js +2 -2
- package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
- package/dist/utils/BrowserTabsUtil.js +16 -1
- package/dist/utils/BrowserTabsUtil.js.map +1 -1
- package/dist/utils/CheReporter.js +6 -0
- package/dist/utils/CheReporter.js.map +1 -1
- package/dist/utils/DriverHelper.js +29 -3
- package/dist/utils/DriverHelper.js.map +1 -1
- package/dist/utils/KubernetesCommandLineToolsExecutor.js +162 -0
- package/dist/utils/KubernetesCommandLineToolsExecutor.js.map +1 -0
- package/dist/utils/ShellExecutor.js +15 -0
- package/dist/utils/ShellExecutor.js.map +1 -0
- package/index.ts +5 -1
- package/package.json +4 -3
- package/pageobjects/dashboard/Dashboard.ts +5 -4
- package/pageobjects/dashboard/Workspaces.ts +5 -2
- package/pageobjects/ide/CheCodeLocatorLoader.ts +5 -0
- package/pageobjects/login/RedHatLoginPage.ts +14 -16
- package/pageobjects/openshift/OcpApplicationPage.ts +42 -0
- package/pageobjects/openshift/OcpImportFromGitPage.ts +87 -0
- package/pageobjects/openshift/OcpLoginPage.ts +3 -3
- package/pageobjects/openshift/OcpMainPage.ts +109 -0
- package/resources/container-overrides.yaml +28 -0
- package/resources/pod-overrides.yaml +37 -0
- package/specs/api/CloneGitRepoAPI.spec.ts +8 -7
- package/specs/api/ContainerOverridesAPI.spec.ts +37 -0
- package/specs/api/PodOverridesAPI.spec.ts +43 -0
- package/specs/dashboard-samples/RecomendedExtentions.spec.ts +73 -21
- package/specs/devconsole-intergration/DevConsoleIntegration.spec.ts +98 -0
- package/specs/factory/Factory.spec.ts +1 -1
- package/specs/factory/NoSetupRepoFactory.spec.ts +1 -1
- package/specs/factory/RefusedOAuthFactory.spec.ts +1 -1
- package/tests-library/LoginTests.ts +17 -7
- package/tests-library/ProjectAndFileTests.ts +4 -0
- package/tests-library/WorkspaceHandlingTests.ts +2 -2
- package/utils/BrowserTabsUtil.ts +18 -3
- package/utils/CheReporter.ts +6 -0
- package/utils/DriverHelper.ts +36 -4
- package/utils/KubernetesCommandLineToolsExecutor.ts +167 -0
- package/utils/ShellExecutor.ts +13 -0
- package/dist/utils/OpenshiftClientExecutor.js +0 -98
- package/dist/utils/OpenshiftClientExecutor.js.map +0 -1
- package/utils/OpenshiftClientExecutor.ts +0 -117
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.KubernetesCommandLineToolsExecutor = void 0;
|
|
23
|
+
const shelljs_1 = require("shelljs");
|
|
24
|
+
const TestConstants_1 = require("../constants/TestConstants");
|
|
25
|
+
const Logger_1 = require("./Logger");
|
|
26
|
+
const ShellExecutor_1 = require("./ShellExecutor");
|
|
27
|
+
const path = __importStar(require("path"));
|
|
28
|
+
class KubernetesCommandLineToolsExecutor extends ShellExecutor_1.ShellExecutor {
|
|
29
|
+
constructor(_workspaceName, _namespace) {
|
|
30
|
+
super();
|
|
31
|
+
this.KUBERNETES_COMMAND_LINE_TOOL = TestConstants_1.TestConstants.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL;
|
|
32
|
+
this.workspaceName = _workspaceName;
|
|
33
|
+
this.namespace = this.setNamespace(_namespace);
|
|
34
|
+
}
|
|
35
|
+
get getWorkspaceName() {
|
|
36
|
+
return this.workspaceName;
|
|
37
|
+
}
|
|
38
|
+
get getNamespace() {
|
|
39
|
+
return this.namespace;
|
|
40
|
+
}
|
|
41
|
+
// login to Openshift cluster with username and password
|
|
42
|
+
loginToOcp() {
|
|
43
|
+
if (this.KUBERNETES_COMMAND_LINE_TOOL === TestConstants_1.KubernetesCommandLineTool.OC) {
|
|
44
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: Login to the "OC" client.`);
|
|
45
|
+
const url = this.getServerUrl();
|
|
46
|
+
if (this.isUserLoggedIn()) {
|
|
47
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: User already logged`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: Login ${url}, ${TestConstants_1.TestConstants.TS_SELENIUM_OCP_USERNAME}`);
|
|
51
|
+
shelljs_1.exec(`oc login --server=${url} -u=${TestConstants_1.TestConstants.TS_SELENIUM_OCP_USERNAME} -p=${TestConstants_1.TestConstants.TS_SELENIUM_OCP_PASSWORD} --insecure-skip-tls-verify`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: doesn't support login command`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
getContainerName() {
|
|
59
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.getContainerName.name)}: Get container name.`);
|
|
60
|
+
const output = this.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} get ${(KubernetesCommandLineToolsExecutor.pod)} -o jsonpath='{.spec.containers[*].name}' -n ${this.namespace}`);
|
|
61
|
+
shelljs_1.echo('\n');
|
|
62
|
+
return output.stderr ? output.stderr : output.stdout;
|
|
63
|
+
}
|
|
64
|
+
getWorkspacePodName() {
|
|
65
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.getWorkspacePodName.name)}: Get workspace pod name.`);
|
|
66
|
+
const output = this.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} get pod -l controller.devfile.io/devworkspace_name=${this.workspaceName} -n ${this.namespace} -o name`);
|
|
67
|
+
return output.stderr ? output.stderr : output.stdout.replace('\n', '');
|
|
68
|
+
}
|
|
69
|
+
deleteDevWorkspace() {
|
|
70
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.deleteDevWorkspace.name)}: Delete '${this.workspaceName}' workspace`);
|
|
71
|
+
this.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} patch dw ${this.workspaceName} -n ${this.namespace} -p '{ "metadata": { "finalizers": null }}' --type merge || true`);
|
|
72
|
+
this.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} delete dw ${this.workspaceName} -n ${this.namespace} || true`);
|
|
73
|
+
this.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} delete dwt ${TestConstants_1.TestConstants.TS_SELENIUM_EDITOR}-${this.workspaceName} -n ${this.namespace} || true`);
|
|
74
|
+
}
|
|
75
|
+
applyAndWaitDevWorkspace(yamlConfiguration) {
|
|
76
|
+
if (this.KUBERNETES_COMMAND_LINE_TOOL === TestConstants_1.KubernetesCommandLineTool.KUBECTL) {
|
|
77
|
+
this.createNamespace();
|
|
78
|
+
}
|
|
79
|
+
this.applyYamlConfigurationAsStringOutput(yamlConfiguration);
|
|
80
|
+
const output = this.waitDevWorkspace();
|
|
81
|
+
KubernetesCommandLineToolsExecutor.pod = this.getWorkspacePodName();
|
|
82
|
+
KubernetesCommandLineToolsExecutor.container = this.getContainerName();
|
|
83
|
+
return output;
|
|
84
|
+
}
|
|
85
|
+
executeCommand(commandToExecute) {
|
|
86
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.executeCommand.name)}:`);
|
|
87
|
+
return this.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} exec -i ${KubernetesCommandLineToolsExecutor.pod} -n ${this.namespace} -c ${KubernetesCommandLineToolsExecutor.container} -- sh -c "${commandToExecute}"`);
|
|
88
|
+
}
|
|
89
|
+
applyYamlConfigurationAsStringOutput(yamlConfiguration) {
|
|
90
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.applyYamlConfigurationAsStringOutput.name)}:`);
|
|
91
|
+
this.execWithLog(`cat <<EOF | ${this.KUBERNETES_COMMAND_LINE_TOOL} apply -n ${this.namespace} -f - \n` +
|
|
92
|
+
yamlConfiguration + '\n' +
|
|
93
|
+
'EOF');
|
|
94
|
+
}
|
|
95
|
+
applyYamlConfigurationAsFile(pathToFile) {
|
|
96
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.applyYamlConfigurationAsFile.name)}:`);
|
|
97
|
+
this.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} apply -n ${this.namespace} -f "${path.resolve(pathToFile)}"`);
|
|
98
|
+
}
|
|
99
|
+
getDevWorkspaceYamlConfiguration() {
|
|
100
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.getDevWorkspaceYamlConfiguration.name)}:`);
|
|
101
|
+
return this.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} get dw ${this.workspaceName} -n ${this.namespace} -o yaml`);
|
|
102
|
+
}
|
|
103
|
+
waitDevWorkspace(timeout = 360) {
|
|
104
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.waitDevWorkspace.name)}: Wait till workspace ready.`);
|
|
105
|
+
return this.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} wait -n ${this.namespace} --for=condition=Ready dw ${this.workspaceName} --timeout=${timeout}s`);
|
|
106
|
+
}
|
|
107
|
+
createNamespace() {
|
|
108
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.createNamespace.name)}: Create namespace "${this.namespace}".`);
|
|
109
|
+
this.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} create namespace ${this.namespace}`);
|
|
110
|
+
}
|
|
111
|
+
createProject(projectName) {
|
|
112
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.createProject.name)}: Create new project "${projectName}".`);
|
|
113
|
+
this.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} new-project ${projectName} -n ${this.namespace}`);
|
|
114
|
+
}
|
|
115
|
+
deleteProject(projectName) {
|
|
116
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.deleteProject.name)}: Delete "${projectName}".`);
|
|
117
|
+
this.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} delete project ${projectName} -n ${this.namespace}`);
|
|
118
|
+
}
|
|
119
|
+
isUserLoggedIn() {
|
|
120
|
+
const whoamiCommandOutput = this.execWithLog('oc whoami && oc whoami --show-server=true');
|
|
121
|
+
return whoamiCommandOutput.stdout.includes(TestConstants_1.TestConstants.TS_SELENIUM_OCP_USERNAME) && whoamiCommandOutput.stdout.includes(this.getServerUrl());
|
|
122
|
+
}
|
|
123
|
+
getLoggingName(methodName) {
|
|
124
|
+
return `${this.constructor.name}.${methodName} - ${(this.KUBERNETES_COMMAND_LINE_TOOL)}`;
|
|
125
|
+
}
|
|
126
|
+
setNamespace(_namespace) {
|
|
127
|
+
_namespace = _namespace !== undefined ? _namespace
|
|
128
|
+
: TestConstants_1.TestConstants.TS_SELENIUM_BASE_URL.includes('devspaces') ? TestConstants_1.TestConstants.TS_SELENIUM_OCP_USERNAME + '-devspaces'
|
|
129
|
+
: TestConstants_1.TestConstants.TS_SELENIUM_BASE_URL.includes('che') ? TestConstants_1.TestConstants.TS_SELENIUM_OCP_USERNAME + '-che'
|
|
130
|
+
: 'default';
|
|
131
|
+
return _namespace;
|
|
132
|
+
}
|
|
133
|
+
getServerUrl() {
|
|
134
|
+
Logger_1.Logger.debug(`${this.getLoggingName(this.getServerUrl.name)}: Get server api url.`);
|
|
135
|
+
return TestConstants_1.TestConstants.TS_SELENIUM_BASE_URL.replace('devspaces.apps', 'api') + ':6443';
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.KubernetesCommandLineToolsExecutor = KubernetesCommandLineToolsExecutor;
|
|
139
|
+
(function (KubernetesCommandLineToolsExecutor) {
|
|
140
|
+
class ContainerTerminal extends KubernetesCommandLineToolsExecutor {
|
|
141
|
+
constructor(cluster) {
|
|
142
|
+
super(cluster.getWorkspaceName, cluster.getNamespace);
|
|
143
|
+
}
|
|
144
|
+
ls(path = '') {
|
|
145
|
+
return this.executeCommand('ls ' + path);
|
|
146
|
+
}
|
|
147
|
+
pwd() {
|
|
148
|
+
return this.executeCommand('pwd');
|
|
149
|
+
}
|
|
150
|
+
cd(path) {
|
|
151
|
+
return this.executeCommand('cd ' + path);
|
|
152
|
+
}
|
|
153
|
+
gitClone(repository) {
|
|
154
|
+
return this.executeCommand('git clone ' + repository);
|
|
155
|
+
}
|
|
156
|
+
removeFolder(path) {
|
|
157
|
+
return this.executeCommand('rm -rf ' + path);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
KubernetesCommandLineToolsExecutor.ContainerTerminal = ContainerTerminal;
|
|
161
|
+
})(KubernetesCommandLineToolsExecutor = exports.KubernetesCommandLineToolsExecutor || (exports.KubernetesCommandLineToolsExecutor = {}));
|
|
162
|
+
//# sourceMappingURL=KubernetesCommandLineToolsExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KubernetesCommandLineToolsExecutor.js","sourceRoot":"","sources":["../../utils/KubernetesCommandLineToolsExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ShellExecutor = void 0;
|
|
4
|
+
const shelljs_1 = require("shelljs");
|
|
5
|
+
class ShellExecutor {
|
|
6
|
+
wait(seconds) {
|
|
7
|
+
this.execWithLog(`sleep ${seconds}s`);
|
|
8
|
+
}
|
|
9
|
+
execWithLog(command) {
|
|
10
|
+
shelljs_1.echo(command);
|
|
11
|
+
return shelljs_1.exec(command);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ShellExecutor = ShellExecutor;
|
|
15
|
+
//# sourceMappingURL=ShellExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShellExecutor.js","sourceRoot":"","sources":["../../utils/ShellExecutor.ts"],"names":[],"mappings":";;;AAAA,qCAAkD;AAElD,MAAa,aAAa;IAEtB,IAAI,CAAC,OAAe;QAChB,IAAI,CAAC,WAAW,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC;IAC1C,CAAC;IAES,WAAW,CAAC,OAAe;QACjC,cAAI,CAAC,OAAO,CAAC,CAAC;QACd,OAAO,cAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;CACJ;AAVD,sCAUC"}
|
package/index.ts
CHANGED
|
@@ -7,10 +7,11 @@ export * from './driver/ChromeDriver';
|
|
|
7
7
|
export * from './driver/IDriver';
|
|
8
8
|
export * from './utils/BrowserTabsUtil';
|
|
9
9
|
export * from './utils/DriverHelper';
|
|
10
|
+
export * from './utils/KubernetesCommandLineToolsExecutor';
|
|
10
11
|
export * from './utils/Logger';
|
|
11
|
-
export * from './utils/OpenshiftClientExecutor';
|
|
12
12
|
export * from './utils/Sanitizer';
|
|
13
13
|
export * from './utils/ScreenCatcher';
|
|
14
|
+
export * from './utils/ShellExecutor';
|
|
14
15
|
export * from './utils/request-handlers/CheApiRequestHandler';
|
|
15
16
|
export * from './utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler';
|
|
16
17
|
export * from './utils/request-handlers/headers/IAuthorizationHeaderHandler';
|
|
@@ -32,7 +33,10 @@ export * from './pageobjects/login/OcpUserLoginPage';
|
|
|
32
33
|
export * from './pageobjects/login/RedHatLoginPage';
|
|
33
34
|
export * from './pageobjects/login/RegularUserOcpCheLoginPage';
|
|
34
35
|
export * from './pageobjects/openshift/CheLoginPage';
|
|
36
|
+
export * from './pageobjects/openshift/OcpApplicationPage';
|
|
37
|
+
export * from './pageobjects/openshift/OcpImportFromGitPage';
|
|
35
38
|
export * from './pageobjects/openshift/OcpLoginPage';
|
|
39
|
+
export * from './pageobjects/openshift/OcpMainPage';
|
|
36
40
|
export * from './tests-library/LoginTests';
|
|
37
41
|
export * from './tests-library/ProjectAndFileTests';
|
|
38
42
|
export * from './tests-library/WorkspaceHandlingTests';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eclipse-che/che-e2e",
|
|
3
|
-
"version": "7.64.
|
|
3
|
+
"version": "7.64.1-dev-43c3317",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -35,10 +35,11 @@
|
|
|
35
35
|
"ts-node": "^10.9.1",
|
|
36
36
|
"tslint": "^6.1.3",
|
|
37
37
|
"typescript": "3.9.9",
|
|
38
|
-
"vscode-extension-tester-locators": "3.1.0"
|
|
38
|
+
"vscode-extension-tester-locators": "3.1.0",
|
|
39
|
+
"yaml": "^2.2.2"
|
|
39
40
|
},
|
|
40
41
|
"dependencies": {
|
|
41
|
-
"@eclipse-che/api": "
|
|
42
|
+
"@eclipse-che/api": "7.64.0",
|
|
42
43
|
"inversify": "5.0.1",
|
|
43
44
|
"reflect-metadata": "0.1.13"
|
|
44
45
|
},
|
|
@@ -22,7 +22,7 @@ export class Dashboard {
|
|
|
22
22
|
private static readonly WORKSPACES_BUTTON_XPATH: string = `//div[@id='page-sidebar']//a[contains(text(), 'Workspaces (')]`;
|
|
23
23
|
private static readonly CREATE_WORKSPACE_BUTTON_XPATH: string = `//div[@id='page-sidebar']//a[text()='Create Workspace']`;
|
|
24
24
|
private static readonly LOADER_PAGE_STEP_TITLES_XPATH: string = '//*[@data-testid="step-title"]';
|
|
25
|
-
private static readonly
|
|
25
|
+
private static readonly STARTING_PAGE_LOADER_CSS: string = '.main-page-loader';
|
|
26
26
|
private static readonly LOADER_ALERT_XPATH: string = '//*[@data-testid="loader-alert"]';
|
|
27
27
|
private static readonly LOGOUT_BUTTON_XPATH: string = '//button[text()="Logout"]';
|
|
28
28
|
|
|
@@ -121,10 +121,11 @@ export class Dashboard {
|
|
|
121
121
|
await this.driverHelper.waitDisappearance(By.id('chenavmenu'), timeout);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
async
|
|
125
|
-
Logger.debug(`Dashboard.
|
|
124
|
+
async waitStartingPageLoaderDisappearance(timeout: number = TimeoutConstants.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<void> {
|
|
125
|
+
Logger.debug(`Dashboard.waitStartingPageLoaderDisappearance`);
|
|
126
126
|
|
|
127
|
-
await this.driverHelper.
|
|
127
|
+
await this.driverHelper.waitDisappearance(By.css(Dashboard.STARTING_PAGE_LOADER_CSS), timeout);
|
|
128
|
+
await this.driverHelper.wait(TestConstants.TS_SELENIUM_DEFAULT_POLLING);
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
async getRecentWorkspaceName(timeout: number = TimeoutConstants.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<string> {
|
|
@@ -14,6 +14,7 @@ import { CLASSES } from '../../configs/inversify.types';
|
|
|
14
14
|
import { By, WebElement } from 'selenium-webdriver';
|
|
15
15
|
import { Logger } from '../../utils/Logger';
|
|
16
16
|
import { TimeoutConstants } from '../../constants/TimeoutConstants';
|
|
17
|
+
import { TestConstants } from '../../constants/TestConstants';
|
|
17
18
|
|
|
18
19
|
export enum WorkspaceStatusUI {
|
|
19
20
|
Running = 'green',
|
|
@@ -140,7 +141,6 @@ export class Workspaces {
|
|
|
140
141
|
await this.driverHelper.waitAndClick(enabledConfirmationWindowDeleteButton, timeout);
|
|
141
142
|
}
|
|
142
143
|
|
|
143
|
-
|
|
144
144
|
async deleteWorkspaceByActionsButton(workspaceName: string, timeout: number = TimeoutConstants.TS_DASHBOARD_WORKSPACE_STOP_TIMEOUT): Promise<void> {
|
|
145
145
|
Logger.debug('Workspaces.deleteWorkspaceByActionsButton');
|
|
146
146
|
|
|
@@ -163,9 +163,12 @@ export class Workspaces {
|
|
|
163
163
|
async waitWorkspaceListItemAbcence(workspaceName: string, timeout: number = TimeoutConstants.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<void> {
|
|
164
164
|
Logger.debug(`Workspaces.waitWorkspaceListItemAbcence "${workspaceName}"`);
|
|
165
165
|
|
|
166
|
+
const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING;
|
|
167
|
+
const attempts: number = Math.ceil(timeout / polling);
|
|
168
|
+
|
|
166
169
|
const workspaceListItemLocator: By = By.xpath(this.getWorkspaceListItemLocator(workspaceName));
|
|
167
170
|
|
|
168
|
-
await this.driverHelper.waitDisappearance(workspaceListItemLocator,
|
|
171
|
+
await this.driverHelper.waitDisappearance(workspaceListItemLocator, attempts, polling);
|
|
169
172
|
}
|
|
170
173
|
|
|
171
174
|
async getAllCreatedWorkspacesNames(timeout: number = TimeoutConstants.TS_COMMON_DASHBOARD_WAIT_TIMEOUT): Promise<string[]> {
|
|
@@ -15,48 +15,46 @@ import { DriverHelper } from '../../utils/DriverHelper';
|
|
|
15
15
|
import { Logger } from '../../utils/Logger';
|
|
16
16
|
import { TestConstants } from '../../constants/TestConstants';
|
|
17
17
|
|
|
18
|
-
const USERNAME_INPUT_ID: string = 'username-verification';
|
|
19
|
-
const PASSWORD_INPUT_ID: string = 'password';
|
|
20
|
-
const NEXT_BUTTON_ID: string = 'login-show-step2';
|
|
21
|
-
const LOGIN_BUTTON_ID: string = 'rh-password-verification-submit-button';
|
|
22
|
-
const timeout: number = 10000;
|
|
23
|
-
|
|
24
18
|
@injectable()
|
|
25
19
|
export class RedHatLoginPage {
|
|
20
|
+
private readonly USERNAME_INPUT_ID: string = 'username-verification';
|
|
21
|
+
private readonly PASSWORD_INPUT_ID: string = 'password';
|
|
22
|
+
private readonly NEXT_BUTTON_ID: string = 'login-show-step2';
|
|
23
|
+
private readonly LOGIN_BUTTON_ID: string = 'rh-password-verification-submit-button';
|
|
26
24
|
|
|
27
25
|
constructor(
|
|
28
26
|
@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { }
|
|
29
27
|
|
|
30
28
|
async waitRedHatLoginWelcomePage(): Promise<void> {
|
|
31
29
|
Logger.debug('RedHatLoginPage.waitRedHatLoginWelcomePage');
|
|
32
|
-
await this.driverHelper.waitVisibility(By.id(USERNAME_INPUT_ID));
|
|
30
|
+
await this.driverHelper.waitVisibility(By.id(this.USERNAME_INPUT_ID));
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
async enterPasswordRedHat(): Promise<void> {
|
|
36
34
|
Logger.debug('RedHatLoginPage.enterPasswordRedHat');
|
|
37
|
-
const passwordFieldLocator: By = By.id(PASSWORD_INPUT_ID);
|
|
35
|
+
const passwordFieldLocator: By = By.id(this.PASSWORD_INPUT_ID);
|
|
38
36
|
await this.driverHelper.waitVisibility(passwordFieldLocator, 3000);
|
|
39
|
-
await this.driverHelper.enterValue(passwordFieldLocator, TestConstants.TS_SELENIUM_OCP_PASSWORD
|
|
37
|
+
await this.driverHelper.enterValue(passwordFieldLocator, TestConstants.TS_SELENIUM_OCP_PASSWORD);
|
|
40
38
|
}
|
|
41
39
|
async clickOnLoginButton(): Promise<void> {
|
|
42
40
|
Logger.debug('RedHatLoginPage.clickOnLoginButton');
|
|
43
|
-
const loginButtonLocator: By = By.id(LOGIN_BUTTON_ID);
|
|
44
|
-
await this.driverHelper.waitAndClick(loginButtonLocator
|
|
41
|
+
const loginButtonLocator: By = By.id(this.LOGIN_BUTTON_ID);
|
|
42
|
+
await this.driverHelper.waitAndClick(loginButtonLocator);
|
|
45
43
|
}
|
|
46
44
|
async waitDisappearanceRedHatLoginWelcomePage(): Promise<void> {
|
|
47
45
|
Logger.debug('RedHatLoginPage.waitDisappearanceRedHatLoginWelcomePage');
|
|
48
|
-
await this.driverHelper.waitDisappearance(By.id(LOGIN_BUTTON_ID));
|
|
46
|
+
await this.driverHelper.waitDisappearance(By.id(this.LOGIN_BUTTON_ID));
|
|
49
47
|
}
|
|
50
48
|
async enterUserNameRedHat(): Promise<void> {
|
|
51
49
|
Logger.debug('RedHatLoginPage.enterUserNameRedHat');
|
|
52
|
-
const usernameFieldLocator: By = By.id(USERNAME_INPUT_ID);
|
|
50
|
+
const usernameFieldLocator: By = By.id(this.USERNAME_INPUT_ID);
|
|
53
51
|
await this.driverHelper.waitVisibility(usernameFieldLocator, 20000);
|
|
54
|
-
await this.driverHelper.enterValue(usernameFieldLocator, TestConstants.TS_SELENIUM_OCP_USERNAME
|
|
52
|
+
await this.driverHelper.enterValue(usernameFieldLocator, TestConstants.TS_SELENIUM_OCP_USERNAME);
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
async clickNextButton(): Promise<void> {
|
|
58
56
|
Logger.debug('RedHatLoginPage.clickNextButton');
|
|
59
|
-
const nextButtonLocator: By = By.id(NEXT_BUTTON_ID);
|
|
60
|
-
await this.driverHelper.waitAndClick(nextButtonLocator
|
|
57
|
+
const nextButtonLocator: By = By.id(this.NEXT_BUTTON_ID);
|
|
58
|
+
await this.driverHelper.waitAndClick(nextButtonLocator);
|
|
61
59
|
}
|
|
62
60
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* Copyright (c) 2019-2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
**********************************************************************/
|
|
10
|
+
import 'reflect-metadata';
|
|
11
|
+
import { inject, injectable } from 'inversify';
|
|
12
|
+
import { DriverHelper } from '../../utils/DriverHelper';
|
|
13
|
+
import { CLASSES } from '../../configs/inversify.types';
|
|
14
|
+
import { By } from 'selenium-webdriver';
|
|
15
|
+
import { Logger } from '../../utils/Logger';
|
|
16
|
+
import { TimeoutConstants } from '../../constants/TimeoutConstants';
|
|
17
|
+
import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil';
|
|
18
|
+
|
|
19
|
+
@injectable()
|
|
20
|
+
export class OcpApplicationPage {
|
|
21
|
+
|
|
22
|
+
private static readonly APPLICATION_ICON_LOCATOR: By = By.xpath('//*[@data-test-id="base-node-handler"]');
|
|
23
|
+
private static readonly EDIT_SOURCE_CODE_ICON_LOCATOR: By = By.xpath('//*[@aria-label="Edit source code"]');
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper,
|
|
27
|
+
@inject(CLASSES.BrowserTabsUtil) private readonly browserTabsUtil: BrowserTabsUtil) {
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async waitApplicationIcon(): Promise<void> {
|
|
31
|
+
Logger.debug(`${this.constructor.name}.${this.waitApplicationIcon.name}`);
|
|
32
|
+
|
|
33
|
+
await this.driverHelper.waitPresence(OcpApplicationPage.APPLICATION_ICON_LOCATOR, TimeoutConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async waitAndOpenEditSourceCodeIcon(): Promise<void> {
|
|
37
|
+
Logger.debug(`${this.constructor.name}.${this.waitAndOpenEditSourceCodeIcon.name}`);
|
|
38
|
+
const parentGUID: string = await this.browserTabsUtil.getCurrentWindowHandle();
|
|
39
|
+
await this.driverHelper.waitAndClick(OcpApplicationPage.EDIT_SOURCE_CODE_ICON_LOCATOR);
|
|
40
|
+
await this.browserTabsUtil.waitAndSwitchToAnotherWindow(parentGUID, TimeoutConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* Copyright (c) 2019-2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
**********************************************************************/
|
|
10
|
+
import 'reflect-metadata';
|
|
11
|
+
import { inject, injectable } from 'inversify';
|
|
12
|
+
import { DriverHelper } from '../../utils/DriverHelper';
|
|
13
|
+
import { CLASSES } from '../../configs/inversify.types';
|
|
14
|
+
import { By } from 'selenium-webdriver';
|
|
15
|
+
import { Logger } from '../../utils/Logger';
|
|
16
|
+
import { OcpApplicationPage } from './OcpApplicationPage';
|
|
17
|
+
import { e2eContainer } from '../../configs/inversify.config';
|
|
18
|
+
|
|
19
|
+
@injectable()
|
|
20
|
+
export class OcpImportFromGitPage {
|
|
21
|
+
|
|
22
|
+
private static readonly GIT_URL_INPUT_LOCATOR: By = By.id('form-input-git-url-field');
|
|
23
|
+
private static readonly SHOW_ADVANCED_GIT_OPTIONS_LINK_LOCATOR: By = By.xpath('//*[text()="Show advanced Git options"]//ancestor::button');
|
|
24
|
+
private static readonly HIDE_ADVANCED_GIT_OPTIONS_LOCATOR: By = By.xpath('//*[text()="Hide advanced Git options"]');
|
|
25
|
+
private static readonly GIT_REFERENCE_INPUT_LOCATOR: By = By.id('form-input-git-ref-field');
|
|
26
|
+
private static readonly EDIT_IMPORT_STRATEGY_LINK_LOCATOR: By = By.xpath('//*[text()="Edit Import Strategy"]//ancestor::button');
|
|
27
|
+
private static readonly BUILDER_IMAGE_STRATEGY_ITEM_LOCATOR: By = By.xpath('//*[text()="Builder Image"]//parent::div//parent::div');
|
|
28
|
+
private static readonly ADD_LABEL_LINK_LOCATOR: By = By.xpath('//button[text()="Labels"]');
|
|
29
|
+
private static readonly ADD_LABEL_INPUT_LOCATOR: By = By.id('form-selector-labels-field');
|
|
30
|
+
private static readonly SUBMIT_BUTTON_LOCATOR: By = By.xpath('//*[@data-test-id="submit-button"]');
|
|
31
|
+
|
|
32
|
+
constructor(
|
|
33
|
+
@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) {
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async enterGitRepoUrl(gitRepoUrl: string): Promise<void> {
|
|
37
|
+
Logger.debug(`${this.constructor.name}.${this.enterGitRepoUrl.name} "${gitRepoUrl}"`);
|
|
38
|
+
|
|
39
|
+
await this.driverHelper.enterValue(OcpImportFromGitPage.GIT_URL_INPUT_LOCATOR, gitRepoUrl);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async clickOnAdvancedOptionsButton(): Promise<void> {
|
|
43
|
+
Logger.debug(`${this.constructor.name}.${this.clickOnAdvancedOptionsButton.name}`);
|
|
44
|
+
|
|
45
|
+
if (!(await this.driverHelper.isVisible(OcpImportFromGitPage.HIDE_ADVANCED_GIT_OPTIONS_LOCATOR))) {
|
|
46
|
+
await this.driverHelper.waitAndClick(OcpImportFromGitPage.SHOW_ADVANCED_GIT_OPTIONS_LINK_LOCATOR);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async enterGitReference(gitReference: string): Promise<void> {
|
|
51
|
+
Logger.debug(`${this.constructor.name}.${this.enterGitReference.name} "${gitReference}"`);
|
|
52
|
+
|
|
53
|
+
await this.driverHelper.enterValue(OcpImportFromGitPage.GIT_REFERENCE_INPUT_LOCATOR, gitReference);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async selectBuilderImageImportStrategy(): Promise<void> {
|
|
57
|
+
Logger.debug(`${this.constructor.name}.${this.selectBuilderImageImportStrategy.name}`);
|
|
58
|
+
|
|
59
|
+
await this.driverHelper.scrollToAndClick(OcpImportFromGitPage.EDIT_IMPORT_STRATEGY_LINK_LOCATOR);
|
|
60
|
+
await this.driverHelper.scrollToAndClick(OcpImportFromGitPage.BUILDER_IMAGE_STRATEGY_ITEM_LOCATOR);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async addLabel(label: string): Promise<void> {
|
|
64
|
+
Logger.debug(`${this.constructor.name}.${this.addLabel.name} "${label}"`);
|
|
65
|
+
|
|
66
|
+
await this.driverHelper.scrollToAndClick(OcpImportFromGitPage.ADD_LABEL_LINK_LOCATOR);
|
|
67
|
+
await this.driverHelper.scrollToAndEnterValue(OcpImportFromGitPage.ADD_LABEL_INPUT_LOCATOR, label);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async submitConfiguration(): Promise<OcpApplicationPage> {
|
|
71
|
+
Logger.debug(`${this.constructor.name}.${this.submitConfiguration.name}`);
|
|
72
|
+
|
|
73
|
+
await this.driverHelper.waitAndClick(OcpImportFromGitPage.SUBMIT_BUTTON_LOCATOR);
|
|
74
|
+
return e2eContainer.get(CLASSES.OcpApplicationPage);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async fitAndSubmitConfiguration(gitRepoUrl: string, gitReference: string, label: string): Promise<OcpApplicationPage> {
|
|
78
|
+
Logger.debug(`${this.constructor.name}.${this.fitAndSubmitConfiguration.name}`);
|
|
79
|
+
|
|
80
|
+
await this.enterGitRepoUrl(gitRepoUrl);
|
|
81
|
+
await this.clickOnAdvancedOptionsButton();
|
|
82
|
+
await this.enterGitReference(gitReference);
|
|
83
|
+
await this.selectBuilderImageImportStrategy();
|
|
84
|
+
await this.addLabel(label);
|
|
85
|
+
return await this.submitConfiguration();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -34,7 +34,7 @@ export class OcpLoginPage {
|
|
|
34
34
|
Logger.debug('OcpLoginPage.clickOnLoginProviderTitle');
|
|
35
35
|
|
|
36
36
|
const loginProviderTitleLocator: By = By.xpath(`//a[text()=\'${TestConstants.TS_OCP_LOGIN_PAGE_PROVIDER_TITLE}\']`);
|
|
37
|
-
await this.driverHelper.waitAndClick(loginProviderTitleLocator);
|
|
37
|
+
await this.driverHelper.waitAndClick(loginProviderTitleLocator, TimeoutConstants.TS_SELENIUM_WAIT_FOR_URL);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
async isIdentityProviderLinkVisible(): Promise<boolean> {
|
|
@@ -80,8 +80,8 @@ export class OcpLoginPage {
|
|
|
80
80
|
async clickOnLoginButton(): Promise<void> {
|
|
81
81
|
Logger.debug('OcpLoginPage.clickOnLoginButton');
|
|
82
82
|
|
|
83
|
-
const
|
|
84
|
-
await this.driverHelper.waitAndClick(
|
|
83
|
+
const loginButtonLocator: By = By.css('button[type=submit]');
|
|
84
|
+
await this.driverHelper.waitAndClick(loginButtonLocator);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
async waitDisappearanceOpenShiftLoginWelcomePage(): Promise<void> {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* Copyright (c) 2019-2023 Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made
|
|
5
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
+
**********************************************************************/
|
|
10
|
+
import 'reflect-metadata';
|
|
11
|
+
import { inject, injectable } from 'inversify';
|
|
12
|
+
import { DriverHelper } from '../../utils/DriverHelper';
|
|
13
|
+
import { CLASSES } from '../../configs/inversify.types';
|
|
14
|
+
import { By } from 'selenium-webdriver';
|
|
15
|
+
import { Logger } from '../../utils/Logger';
|
|
16
|
+
import { TimeoutConstants } from '../../constants/TimeoutConstants';
|
|
17
|
+
import { OcpImportFromGitPage } from './OcpImportFromGitPage';
|
|
18
|
+
import { e2eContainer } from '../../configs/inversify.config';
|
|
19
|
+
|
|
20
|
+
@injectable()
|
|
21
|
+
export class OcpMainPage {
|
|
22
|
+
|
|
23
|
+
private static readonly MAIN_PAGE_HEADER_LOCATOR: By = By.id('page-main-header');
|
|
24
|
+
private static readonly SELECT_ROLE_BUTTON_LOCATOR: By = By.xpath('//*[@data-test-id="perspective-switcher-toggle"]');
|
|
25
|
+
private static readonly ADD_BUTTON_LOCATOR: By = By.xpath('//*[@data-test-id="+Add-header"]');
|
|
26
|
+
private static readonly IMPORT_FROM_GIT_ITEM_LOCATOR: By = By.xpath('//*[@data-test="item import-from-git"]');
|
|
27
|
+
private static readonly SELECT_PROJECT_DROPDOWN_LOCATOR: By = By.xpath('//div[@class="co-namespace-dropdown"]//button');
|
|
28
|
+
private static readonly PROJECT_FILTER_INPUT_LOCATOR: By = By.xpath('//*[@data-test="dropdown-text-filter"]');
|
|
29
|
+
private static readonly SKIP_TOUR_BUTTON_LOCATOR: By = By.xpath('//*[text()="Skip tour"]');
|
|
30
|
+
|
|
31
|
+
private static getRoleLocator(role: string): By {
|
|
32
|
+
return By.xpath(`//a//*[text()="${role}"]`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private static getProjectDropdownItemLocator(projectName: string): By {
|
|
36
|
+
return By.xpath(`//button//*[text()="${projectName}"]`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
constructor(
|
|
40
|
+
@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { }
|
|
41
|
+
|
|
42
|
+
async waitOpenMainPage(): Promise<void> {
|
|
43
|
+
Logger.debug(`${this.constructor.name}.${this.waitOpenMainPage.name}`);
|
|
44
|
+
|
|
45
|
+
await this.driverHelper.waitVisibility(OcpMainPage.MAIN_PAGE_HEADER_LOCATOR, TimeoutConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async clickOnSelectRoleButton(): Promise<void> {
|
|
49
|
+
Logger.debug(`${this.constructor.name}.${this.clickOnSelectRoleButton.name}`);
|
|
50
|
+
|
|
51
|
+
await this.driverHelper.waitAndClick(OcpMainPage.SELECT_ROLE_BUTTON_LOCATOR);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async clickAddToProjectButton(): Promise<void> {
|
|
55
|
+
Logger.debug(`${this.constructor.name}.${this.clickAddToProjectButton.name}`);
|
|
56
|
+
|
|
57
|
+
await this.driverHelper.waitAndClick(OcpMainPage.ADD_BUTTON_LOCATOR);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async selectDeveloperRole(): Promise<void> {
|
|
61
|
+
Logger.debug(`${this.constructor.name}.${this.selectDeveloperRole.name}`);
|
|
62
|
+
|
|
63
|
+
await this.waitOpenMainPage();
|
|
64
|
+
await this.tryToSkipWebTour();
|
|
65
|
+
await this.clickOnSelectRoleButton();
|
|
66
|
+
await this.selectRole('Developer');
|
|
67
|
+
await this.tryToSkipWebTour();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async selectImportFromGitMethod(): Promise<OcpImportFromGitPage> {
|
|
71
|
+
Logger.debug(`${this.constructor.name}.${this.selectImportFromGitMethod.name}`);
|
|
72
|
+
|
|
73
|
+
await this.driverHelper.waitAndClick(OcpMainPage.IMPORT_FROM_GIT_ITEM_LOCATOR);
|
|
74
|
+
return e2eContainer.get(CLASSES.OcpImportFromGitPage);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async openImportFromGitPage(): Promise<OcpImportFromGitPage> {
|
|
78
|
+
Logger.debug(`${this.constructor.name}.${this.openImportFromGitPage.name}`);
|
|
79
|
+
|
|
80
|
+
await this.clickAddToProjectButton();
|
|
81
|
+
return await this.selectImportFromGitMethod();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async selectProject(projectName: string): Promise<void> {
|
|
85
|
+
Logger.debug(`${this.constructor.name}.${this.selectProject.name}`);
|
|
86
|
+
|
|
87
|
+
await this.driverHelper.waitAndClick(OcpMainPage.SELECT_PROJECT_DROPDOWN_LOCATOR);
|
|
88
|
+
await this.driverHelper.enterValue(OcpMainPage.PROJECT_FILTER_INPUT_LOCATOR, projectName);
|
|
89
|
+
await this.driverHelper.waitAndClick(OcpMainPage.getProjectDropdownItemLocator(projectName));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private async selectRole(role: string): Promise<void> {
|
|
93
|
+
Logger.debug(`${this.constructor.name}.${this.selectRole.name} - selecting role ${role}`);
|
|
94
|
+
|
|
95
|
+
await this.driverHelper.waitAndClick(OcpMainPage.getRoleLocator(role));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private async tryToSkipWebTour(): Promise<void> {
|
|
99
|
+
Logger.debug(`${this.constructor.name}.${this.tryToSkipWebTour.name}`);
|
|
100
|
+
|
|
101
|
+
if (await this.driverHelper.isVisible(OcpMainPage.SKIP_TOUR_BUTTON_LOCATOR)) {
|
|
102
|
+
await this.driverHelper.waitAndClick(OcpMainPage.SKIP_TOUR_BUTTON_LOCATOR);
|
|
103
|
+
|
|
104
|
+
Logger.debug(`${this.constructor.name}.${this.tryToSkipWebTour.name} - Welcome tour modal dialog was located and skipped`);
|
|
105
|
+
} else {
|
|
106
|
+
Logger.debug(`${this.constructor.name}.${this.tryToSkipWebTour.name} - Welcome tour modal dialog was not located`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|