@eclipse-che/che-e2e 7.64.0-dev-db63138 → 7.64.0-dev-f0466d9

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.
Files changed (62) hide show
  1. package/configs/inversify.types.ts +2 -2
  2. package/configs/mocharc.ts +2 -2
  3. package/constants/TestConstants.ts +2 -2
  4. package/constants/TimeoutConstants.ts +1 -1
  5. package/dist/configs/inversify.types.js.map +1 -1
  6. package/dist/configs/mocharc.js +2 -2
  7. package/dist/configs/mocharc.js.map +1 -1
  8. package/dist/constants/TestConstants.js.map +1 -1
  9. package/dist/constants/TimeoutConstants.js.map +1 -1
  10. package/dist/driver/ChromeDriver.js.map +1 -1
  11. package/dist/pageobjects/dashboard/CreateWorkspace.js +5 -5
  12. package/dist/pageobjects/dashboard/CreateWorkspace.js.map +1 -1
  13. package/dist/pageobjects/dashboard/Dashboard.js.map +1 -1
  14. package/dist/specs/MochaHooks.js.map +1 -1
  15. package/dist/specs/SmokeTest.spec.js +49 -0
  16. package/dist/specs/SmokeTest.spec.js.map +1 -0
  17. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js +1 -1
  18. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js.map +1 -1
  19. package/dist/tests-library/WorkspaceHandlingTests.js +12 -0
  20. package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
  21. package/dist/utils/CheReporter.js +5 -2
  22. package/dist/utils/CheReporter.js.map +1 -1
  23. package/dist/utils/DriverHelper.js.map +1 -1
  24. package/dist/utils/Logger.js.map +1 -1
  25. package/dist/utils/ScreenCatcher.js.map +1 -1
  26. package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js.map +1 -1
  27. package/dist/utils/vsc/GitUtil.js +1 -6
  28. package/dist/utils/vsc/GitUtil.js.map +1 -1
  29. package/dist/utils/workspace/ApiUrlResolver.js.map +1 -1
  30. package/dist/utils/workspace/TestWorkspaceUtil.js +1 -1
  31. package/dist/utils/workspace/TestWorkspaceUtil.js.map +1 -1
  32. package/driver/ChromeDriver.ts +2 -2
  33. package/package.json +1 -1
  34. package/pageobjects/dashboard/CreateWorkspace.ts +6 -6
  35. package/pageobjects/dashboard/Dashboard.ts +15 -19
  36. package/pageobjects/dashboard/Workspaces.ts +20 -20
  37. package/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +16 -16
  38. package/pageobjects/git-providers/OauthPage.ts +12 -12
  39. package/pageobjects/ide/CheCodeLocatorLoader.ts +1 -1
  40. package/pageobjects/login/OcpUserLoginPage.ts +1 -1
  41. package/pageobjects/login/RedHatLoginPage.ts +6 -6
  42. package/pageobjects/login/RegularUserOcpCheLoginPage.ts +1 -1
  43. package/pageobjects/openshift/CheLoginPage.ts +3 -3
  44. package/pageobjects/openshift/OcpLoginPage.ts +8 -8
  45. package/specs/MochaHooks.ts +7 -7
  46. package/specs/SmokeTest.spec.ts +50 -0
  47. package/specs/devfiles/Quarkus.spec.ts +6 -6
  48. package/specs/factory/Factory.spec.ts +17 -17
  49. package/specs/factory/NoSetupRepoFactory.spec.ts +21 -21
  50. package/specs/factory/RefusedOAuthFactory.spec.ts +21 -21
  51. package/specs/miscellaneous/PredefinedNamespace.spec.ts +5 -5
  52. package/tests-library/WorkspaceHandlingTests.ts +13 -0
  53. package/tslint.json +4 -4
  54. package/utils/BrowserTabsUtil.ts +7 -7
  55. package/utils/CheReporter.ts +12 -8
  56. package/utils/DriverHelper.ts +31 -31
  57. package/utils/Logger.ts +8 -8
  58. package/utils/ScreenCatcher.ts +8 -7
  59. package/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.ts +2 -1
  60. package/utils/vsc/GitUtil.ts +1 -4
  61. package/utils/workspace/ApiUrlResolver.ts +3 -2
  62. package/utils/workspace/TestWorkspaceUtil.ts +22 -22
package/utils/Logger.ts CHANGED
@@ -17,7 +17,7 @@ export abstract class Logger {
17
17
  * @param text log text
18
18
  * @param indentLevel log level
19
19
  */
20
- public static error(text: string, indentLevel: number = 1) {
20
+ public static error(text: string, indentLevel: number = 1): void {
21
21
  this.logText(indentLevel, `[ERROR] ${text}`);
22
22
  }
23
23
 
@@ -26,7 +26,7 @@ export abstract class Logger {
26
26
  * @param text log text
27
27
  * @param indentLevel log level
28
28
  */
29
- public static warn(text: string, indentLevel: number = 1) {
29
+ public static warn(text: string, indentLevel: number = 1): void {
30
30
  if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR') {
31
31
  return;
32
32
  }
@@ -38,7 +38,7 @@ export abstract class Logger {
38
38
  * @param text log text
39
39
  * @param indentLevel log level
40
40
  */
41
- public static info(text: string, indentLevel: number = 3) {
41
+ public static info(text: string, indentLevel: number = 3): void {
42
42
  if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
43
43
  TestConstants.TS_SELENIUM_LOG_LEVEL === 'WARN') {
44
44
  return;
@@ -51,7 +51,7 @@ export abstract class Logger {
51
51
  * @param text log text
52
52
  * @param indentLevel log level
53
53
  */
54
- public static debug(text: string, indentLevel: number = 5) {
54
+ public static debug(text: string, indentLevel: number = 5): void {
55
55
  if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
56
56
  TestConstants.TS_SELENIUM_LOG_LEVEL === 'WARN' ||
57
57
  TestConstants.TS_SELENIUM_LOG_LEVEL === 'INFO') {
@@ -66,7 +66,7 @@ export abstract class Logger {
66
66
  * @param text log text
67
67
  * @param indentLevel log level
68
68
  */
69
- public static trace(text: string, indentLevel: number = 6) {
69
+ public static trace(text: string, indentLevel: number = 6): void {
70
70
  if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
71
71
  TestConstants.TS_SELENIUM_LOG_LEVEL === 'WARN' ||
72
72
  TestConstants.TS_SELENIUM_LOG_LEVEL === 'INFO' ||
@@ -76,16 +76,16 @@ export abstract class Logger {
76
76
  this.logText(indentLevel, `‣ ${text}`);
77
77
  }
78
78
 
79
- private static logText(messageIndentationLevel: number, text: string) {
79
+ private static logText(messageIndentationLevel: number, text: string): void {
80
80
  // start group for every level
81
- for (let i = 0; i < messageIndentationLevel; i++) {
81
+ for (let i: number = 0; i < messageIndentationLevel; i++) {
82
82
  console.group();
83
83
  }
84
84
  // print the trimmed text
85
85
  // if multiline, the message should be properly padded
86
86
  console.log(text);
87
87
  // end group for every level
88
- for (let i = 0; i < messageIndentationLevel; i++) {
88
+ for (let i: number = 0; i < messageIndentationLevel; i++) {
89
89
  console.groupEnd();
90
90
  }
91
91
  }
@@ -14,15 +14,16 @@ import { DriverHelper } from './DriverHelper';
14
14
  import { Sanitizer } from './Sanitizer';
15
15
  import { error } from 'selenium-webdriver';
16
16
  import { TestConstants } from '../constants/TestConstants';
17
+ import { WriteStream } from 'fs';
17
18
 
18
19
  @injectable()
19
20
  export class ScreenCatcher {
20
21
  constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper,
21
22
  @inject(CLASSES.Sanitizer) private readonly sanitizer: Sanitizer) { }
22
23
 
23
- async catchMethodScreen(methodName: string, methodIndex: number, screenshotIndex: number) {
24
- const executionScreenCastDir = `${TestConstants.TS_SELENIUM_REPORT_FOLDER}/executionScreencast`;
25
- const executionScreenCastErrorsDir = `${TestConstants.TS_SELENIUM_REPORT_FOLDER}/executionScreencastErrors`;
24
+ async catchMethodScreen(methodName: string, methodIndex: number, screenshotIndex: number): Promise<void> {
25
+ const executionScreenCastDir: string = `${TestConstants.TS_SELENIUM_REPORT_FOLDER}/executionScreencast`;
26
+ const executionScreenCastErrorsDir: string = `${TestConstants.TS_SELENIUM_REPORT_FOLDER}/executionScreencastErrors`;
26
27
  const formattedMethodIndex: string = new Intl.NumberFormat('en-us', { minimumIntegerDigits: 3 }).format(methodIndex);
27
28
  const formattedScreenshotIndex: string = new Intl.NumberFormat('en-us', { minimumIntegerDigits: 5 }).format(screenshotIndex).replace(/,/g, '');
28
29
 
@@ -54,18 +55,18 @@ export class ScreenCatcher {
54
55
  }
55
56
  }
56
57
 
57
- async catchScreen(screenshotPath: string) {
58
+ async catchScreen(screenshotPath: string): Promise<void> {
58
59
  const screenshot: string = await this.driverHelper.getDriver().takeScreenshot();
59
- const screenshotStream = fs.createWriteStream(screenshotPath);
60
+ const screenshotStream: WriteStream = fs.createWriteStream(screenshotPath);
60
61
  screenshotStream.write(Buffer.from(screenshot, 'base64'));
61
62
  screenshotStream.end();
62
63
  }
63
64
 
64
- async writeErrorLog(errorLogPath: string, err: error.IError) {
65
+ async writeErrorLog(errorLogPath: string, err: error.IError): Promise<void> {
65
66
  console.log(`Failed to save screenshot, additional information in the ${errorLogPath}`);
66
67
 
67
68
  if (err.stack) {
68
- const screenshotStream = fs.createWriteStream(errorLogPath);
69
+ const screenshotStream: WriteStream = fs.createWriteStream(errorLogPath);
69
70
  screenshotStream.write(Buffer.from(err.stack, 'utf8'));
70
71
  screenshotStream.end();
71
72
  }
@@ -13,6 +13,7 @@ import { inject, injectable } from 'inversify';
13
13
  import { DriverHelper } from '../../DriverHelper';
14
14
  import { CLASSES } from '../../../configs/inversify.types';
15
15
  import { Logger } from '../../Logger';
16
+ import { IWebDriverCookie } from 'selenium-webdriver';
16
17
 
17
18
  @injectable()
18
19
  export class CheMultiuserAuthorizationHeaderHandler implements IAuthorizationHeaderHandler {
@@ -22,7 +23,7 @@ export class CheMultiuserAuthorizationHeaderHandler implements IAuthorizationHea
22
23
 
23
24
  async get(): Promise<AxiosRequestConfig> {
24
25
  try {
25
- let token = await this.driverHelper.getDriver().manage().getCookie('_oauth_proxy');
26
+ let token: IWebDriverCookie = await this.driverHelper.getDriver().manage().getCookie('_oauth_proxy');
26
27
  if (this.authorizationToken !== token.value) {
27
28
  this.authorizationToken = token.value;
28
29
  }
@@ -12,9 +12,6 @@ import { injectable } from 'inversify';
12
12
 
13
13
  @injectable()
14
14
  export class GitUtil {
15
-
16
- constructor() { }
17
-
18
15
  /**
19
16
  * Method extracts a test repo name from git clone https url;
20
17
  * it splits the url into string[] by "/" or ".", deletes empty elements and elements that contains just "git" word, than returns the last one;
@@ -22,7 +19,7 @@ export class GitUtil {
22
19
  * @param url git https url (which using for "git clone")
23
20
  * @return project name
24
21
  */
25
- getProjectNameFromGitUrl(url: string) {
22
+ getProjectNameFromGitUrl(url: string): string {
26
23
  return url.split(/[\/.]/).filter((e: string) => e !== '' && e !== 'git').reverse()[0];
27
24
  }
28
25
  }
@@ -11,6 +11,7 @@ import { inject, injectable } from 'inversify';
11
11
  import { CLASSES } from '../../configs/inversify.types';
12
12
  import { Logger } from '../Logger';
13
13
  import { CheApiRequestHandler } from '../request-handlers/CheApiRequestHandler';
14
+ import { AxiosResponse } from 'axios';
14
15
 
15
16
  @injectable()
16
17
  export class ApiUrlResolver {
@@ -26,7 +27,7 @@ export class ApiUrlResolver {
26
27
  }
27
28
 
28
29
  public async getWorkspacesApiUrl(): Promise<string> {
29
- const namespace = await this.obtainUserNamespace();
30
+ const namespace: string = await this.obtainUserNamespace();
30
31
  return `${ApiUrlResolver.DASHBOARD_API_URL}/${namespace}/devworkspaces`;
31
32
  }
32
33
 
@@ -34,7 +35,7 @@ export class ApiUrlResolver {
34
35
  Logger.debug(`ApiUrlResolver.obtainUserNamespace ${this.userNamespace}`);
35
36
  if (this.userNamespace.length === 0) {
36
37
  Logger.trace(`ApiUrlResolver.obtainUserNamespace USER_NAMESPACE.length = 0, calling kubernetes API`);
37
- const kubernetesResponse = await this.processRequestHandler.get(ApiUrlResolver.KUBERNETES_API_URL);
38
+ const kubernetesResponse: AxiosResponse = await this.processRequestHandler.get(ApiUrlResolver.KUBERNETES_API_URL);
38
39
  if (kubernetesResponse.status !== 200) {
39
40
  throw new Error(`Cannot get user namespace from kubernetes API. Code: ${kubernetesResponse.status} Data: ${kubernetesResponse.data}`);
40
41
  }
@@ -17,7 +17,7 @@ import { error } from 'selenium-webdriver';
17
17
  import { CheApiRequestHandler } from '../request-handlers/CheApiRequestHandler';
18
18
  import { CLASSES } from '../../configs/inversify.types';
19
19
  import { Logger } from '../Logger';
20
- import axios from 'axios';
20
+ import axios, { AxiosResponse } from 'axios';
21
21
  import { ITestWorkspaceUtil } from './ITestWorkspaceUtil';
22
22
  import { ApiUrlResolver } from './ApiUrlResolver';
23
23
 
@@ -32,13 +32,13 @@ export class TestWorkspaceUtil implements ITestWorkspaceUtil {
32
32
  @inject(CLASSES.ApiUrlResolver) private readonly apiUrlResolver: ApiUrlResolver
33
33
  ) { }
34
34
 
35
- public async waitWorkspaceStatus(workspaceName: string, expectedWorkspaceStatus: WorkspaceStatus) {
35
+ public async waitWorkspaceStatus(workspaceName: string, expectedWorkspaceStatus: WorkspaceStatus): Promise<void> {
36
36
  Logger.debug('TestWorkspaceUtil.waitWorkspaceStatus');
37
37
 
38
38
  let workspaceStatus: string = '';
39
39
  let expectedStatus: boolean = false;
40
- for (let i = 0; i < this.attempts; i++) {
41
- const response = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspaceApiUrl(workspaceName));
40
+ for (let i: number = 0; i < this.attempts; i++) {
41
+ const response: AxiosResponse = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspaceApiUrl(workspaceName));
42
42
 
43
43
  if (response.status !== 200) {
44
44
  throw new Error(`Can not get status of a workspace. Code: ${response.status} Data: ${response.data}`);
@@ -55,16 +55,16 @@ export class TestWorkspaceUtil implements ITestWorkspaceUtil {
55
55
  }
56
56
 
57
57
  if (!expectedStatus) {
58
- let waitTime = this.attempts * this.polling;
59
- throw new error.TimeoutError(`The workspace was not stopped in ${waitTime} ms. Currnet status is: ${workspaceStatus}`);
58
+ let waitTime: number = this.attempts * this.polling;
59
+ throw new error.TimeoutError(`The workspace was not stopped in ${waitTime} ms. Current status is: ${workspaceStatus}`);
60
60
  }
61
61
  }
62
62
 
63
- public async stopWorkspaceByName(workspaceName: string) {
63
+ public async stopWorkspaceByName(workspaceName: string): Promise<void> {
64
64
  Logger.debug('TestWorkspaceUtil.stopWorkspaceByName');
65
65
 
66
66
  const stopWorkspaceApiUrl: string = await this.apiUrlResolver.getWorkspaceApiUrl(workspaceName);
67
- let stopWorkspaceResponse;
67
+ let stopWorkspaceResponse: AxiosResponse;
68
68
 
69
69
  try {
70
70
  stopWorkspaceResponse = await this.processRequestHandler.patch(stopWorkspaceApiUrl, [{'op': 'replace', 'path': '/spec/started', 'value': false}]);
@@ -81,11 +81,11 @@ export class TestWorkspaceUtil implements ITestWorkspaceUtil {
81
81
  }
82
82
 
83
83
  // delete a workspace without stopping phase (similar with force deleting)
84
- public async deleteWorkspaceByName(workspaceName: string) {
84
+ public async deleteWorkspaceByName(workspaceName: string): Promise<void> {
85
85
  Logger.debug(`TestWorkspaceUtil.deleteWorkspaceByName ${workspaceName}` );
86
86
 
87
87
  const deleteWorkspaceApiUrl: string = await this.apiUrlResolver.getWorkspaceApiUrl(workspaceName);
88
- let deleteWorkspaceResponse;
88
+ let deleteWorkspaceResponse: AxiosResponse;
89
89
  let deleteWorkspaceStatus: boolean = false;
90
90
  try {
91
91
  deleteWorkspaceResponse = await this.processRequestHandler.delete(deleteWorkspaceApiUrl);
@@ -102,7 +102,7 @@ export class TestWorkspaceUtil implements ITestWorkspaceUtil {
102
102
  throw new Error(`Can not delete workspace. Code: ${deleteWorkspaceResponse.status} Data: ${deleteWorkspaceResponse.data}`);
103
103
  }
104
104
 
105
- for (let i = 0; i < this.attempts; i++) {
105
+ for (let i: number = 0; i < this.attempts; i++) {
106
106
  try {
107
107
  deleteWorkspaceResponse = await this.processRequestHandler.get(deleteWorkspaceApiUrl);
108
108
  } catch (error) {
@@ -114,13 +114,13 @@ export class TestWorkspaceUtil implements ITestWorkspaceUtil {
114
114
  }
115
115
 
116
116
  if (!deleteWorkspaceStatus) {
117
- let waitTime = this.attempts * this.polling;
117
+ let waitTime: number = this.attempts * this.polling;
118
118
  throw new error.TimeoutError(`The workspace was not stopped in ${waitTime} ms.`);
119
119
  }
120
120
  }
121
121
 
122
122
  // stop workspace before deleting with checking stopping phase
123
- public async stopAndDeleteWorkspaceByName(workspaceName: string) {
123
+ public async stopAndDeleteWorkspaceByName(workspaceName: string): Promise<void> {
124
124
  Logger.debug('TestWorkspaceUtil.stopAndDeleteWorkspaceByName');
125
125
 
126
126
  await this.stopWorkspaceByName(workspaceName);
@@ -128,21 +128,21 @@ export class TestWorkspaceUtil implements ITestWorkspaceUtil {
128
128
  }
129
129
 
130
130
  // stop all run workspaces in the namespace
131
- public async stopAllRunningWorkspaces(namespace: string) {
131
+ public async stopAllRunningWorkspaces(namespace: string): Promise<void> {
132
132
  Logger.debug('TestWorkspaceUtil.stopAllRunProjects');
133
- let response = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspacesApiUrl());
134
- for (let i = 0; i < response.data.items.length; i++) {
133
+ let response: AxiosResponse = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspacesApiUrl());
134
+ for (let i: number = 0; i < response.data.items.length; i++) {
135
135
  Logger.info('The project is being stopped: ' + response.data.items[i].metadata.name);
136
136
  await this.stopWorkspaceByName(response.data.items[i].metadata.name);
137
137
  }
138
138
  }
139
139
 
140
140
  // stop all run workspaces, check statuses and remove the workspaces
141
- public async stopAndDeleteAllRunningWorkspaces(namespace: string) {
141
+ public async stopAndDeleteAllRunningWorkspaces(namespace: string): Promise<void> {
142
142
  Logger.debug('TestWorkspaceUtil.stopAndDeleteAllRunProjects');
143
- let response = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspacesApiUrl());
143
+ let response: AxiosResponse = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspacesApiUrl());
144
144
  await this.stopAllRunningWorkspaces(namespace);
145
- for (let i = 0; i < response.data.items.length; i++) {
145
+ for (let i: number = 0; i < response.data.items.length; i++) {
146
146
  Logger.info('The project is being deleted: ' + response.data.items[i].metadata.name);
147
147
  await this.deleteWorkspaceByName(response.data.items[i].metadata.name);
148
148
  }
@@ -150,11 +150,11 @@ export class TestWorkspaceUtil implements ITestWorkspaceUtil {
150
150
 
151
151
  // stop all run workspaces without stopping and waiting for of 'Stopped' phase
152
152
  // similar with 'force' deleting
153
- public async deleteAllWorkspaces(namespace: string) {
153
+ public async deleteAllWorkspaces(namespace: string): Promise<void> {
154
154
  Logger.debug('TestWorkspaceUtil.deleteAllRunProjects');
155
- let response = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspacesApiUrl());
155
+ let response: AxiosResponse = await this.processRequestHandler.get(await this.apiUrlResolver.getWorkspacesApiUrl());
156
156
 
157
- for (let i = 0; i < response.data.items.length; i++) {
157
+ for (let i: number = 0; i < response.data.items.length; i++) {
158
158
  Logger.info('The project is being deleted .......: ' + response.data.items[i].metadata.name);
159
159
  await this.deleteWorkspaceByName(response.data.items[i].metadata.name);
160
160
  }