@eclipse-che/che-e2e 7.74.0-dev-1d09cb7 → 7.74.0-dev-41d1364

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/.eslintignore +10 -0
  2. package/.eslintrc.js +183 -0
  3. package/.prettierignore +10 -0
  4. package/.prettierrc.json +10 -0
  5. package/README.md +47 -47
  6. package/configs/inversify.config.ts +13 -9
  7. package/configs/inversify.types.ts +29 -29
  8. package/configs/mocharc.ts +21 -24
  9. package/constants/API_TEST_CONSTANTS.ts +67 -0
  10. package/constants/BASE_TEST_CONSTANTS.ts +80 -0
  11. package/constants/CHROME_DRIVER_CONSTANTS.ts +54 -0
  12. package/constants/FACTORY_TEST_CONSTANTS.ts +61 -0
  13. package/constants/MONACO_CONSTANTS.ts +25 -0
  14. package/constants/OAUTH_CONSTANTS.ts +67 -0
  15. package/constants/PLUGIN_TEST_CONSTANTS.ts +15 -0
  16. package/constants/REPORTER_CONSTANTS.ts +53 -0
  17. package/constants/TIMEOUT_CONSTANTS.ts +131 -0
  18. package/dist/configs/inversify.config.js +14 -8
  19. package/dist/configs/inversify.config.js.map +1 -1
  20. package/dist/configs/inversify.types.js +2 -2
  21. package/dist/configs/inversify.types.js.map +1 -1
  22. package/dist/configs/mocharc.js +13 -16
  23. package/dist/configs/mocharc.js.map +1 -1
  24. package/dist/constants/{APITestConstants.js → API_TEST_CONSTANTS.js} +12 -12
  25. package/dist/constants/API_TEST_CONSTANTS.js.map +1 -0
  26. package/dist/constants/{BaseTestConstants.js → BASE_TEST_CONSTANTS.js} +16 -16
  27. package/dist/constants/BASE_TEST_CONSTANTS.js.map +1 -0
  28. package/dist/constants/{ChromeDriverConstants.js → CHROME_DRIVER_CONSTANTS.js} +13 -13
  29. package/dist/constants/CHROME_DRIVER_CONSTANTS.js.map +1 -0
  30. package/dist/constants/{FactoryTestConstants.js → FACTORY_TEST_CONSTANTS.js} +14 -13
  31. package/dist/constants/FACTORY_TEST_CONSTANTS.js.map +1 -0
  32. package/dist/constants/{MonacoConstants.js → MONACO_CONSTANTS.js} +7 -7
  33. package/dist/constants/MONACO_CONSTANTS.js.map +1 -0
  34. package/dist/constants/{OAuthConstants.js → OAUTH_CONSTANTS.js} +14 -14
  35. package/dist/constants/OAUTH_CONSTANTS.js.map +1 -0
  36. package/dist/constants/{PluginsTestConstants.js → PLUGIN_TEST_CONSTANTS.js} +7 -7
  37. package/dist/constants/PLUGIN_TEST_CONSTANTS.js.map +1 -0
  38. package/dist/constants/{ReporterConstants.js → REPORTER_CONSTANTS.js} +12 -12
  39. package/dist/constants/REPORTER_CONSTANTS.js.map +1 -0
  40. package/dist/constants/{TimeoutConstants.js → TIMEOUT_CONSTANTS.js} +24 -24
  41. package/dist/constants/TIMEOUT_CONSTANTS.js.map +1 -0
  42. package/dist/driver/ChromeDriver.js +12 -16
  43. package/dist/driver/ChromeDriver.js.map +1 -1
  44. package/dist/index.js +9 -9
  45. package/dist/index.js.map +1 -1
  46. package/dist/pageobjects/dashboard/CreateWorkspace.js +11 -11
  47. package/dist/pageobjects/dashboard/CreateWorkspace.js.map +1 -1
  48. package/dist/pageobjects/dashboard/Dashboard.js +16 -16
  49. package/dist/pageobjects/dashboard/Dashboard.js.map +1 -1
  50. package/dist/pageobjects/dashboard/Workspaces.js +28 -28
  51. package/dist/pageobjects/dashboard/Workspaces.js.map +1 -1
  52. package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js +36 -25
  53. package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js.map +1 -1
  54. package/dist/pageobjects/git-providers/OauthPage.js +20 -18
  55. package/dist/pageobjects/git-providers/OauthPage.js.map +1 -1
  56. package/dist/pageobjects/ide/CheCodeLocatorLoader.js +9 -9
  57. package/dist/pageobjects/ide/CheCodeLocatorLoader.js.map +1 -1
  58. package/dist/pageobjects/login/interfaces/ICheLoginPage.js +2 -2
  59. package/dist/pageobjects/login/interfaces/IOcpLoginPage.js +2 -2
  60. package/dist/pageobjects/login/kubernetes/DexLoginPage.js +5 -5
  61. package/dist/pageobjects/login/kubernetes/DexLoginPage.js.map +1 -1
  62. package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js +5 -5
  63. package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js.map +1 -1
  64. package/dist/pageobjects/login/openshift/OcpLoginPage.js +13 -13
  65. package/dist/pageobjects/login/openshift/OcpLoginPage.js.map +1 -1
  66. package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js +5 -5
  67. package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js.map +1 -1
  68. package/dist/pageobjects/login/openshift/OcpUserLoginPage.js +6 -6
  69. package/dist/pageobjects/login/openshift/OcpUserLoginPage.js.map +1 -1
  70. package/dist/pageobjects/login/openshift/RedHatLoginPage.js +5 -5
  71. package/dist/pageobjects/login/openshift/RedHatLoginPage.js.map +1 -1
  72. package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js +8 -8
  73. package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js.map +1 -1
  74. package/dist/pageobjects/openshift/OcpApplicationPage.js +5 -5
  75. package/dist/pageobjects/openshift/OcpApplicationPage.js.map +1 -1
  76. package/dist/pageobjects/openshift/OcpImportFromGitPage.js +4 -4
  77. package/dist/pageobjects/openshift/OcpImportFromGitPage.js.map +1 -1
  78. package/dist/pageobjects/openshift/OcpMainPage.js +6 -6
  79. package/dist/pageobjects/openshift/OcpMainPage.js.map +1 -1
  80. package/dist/specs/MochaHooks.js +26 -23
  81. package/dist/specs/MochaHooks.js.map +1 -1
  82. package/dist/specs/SmokeTest.spec.js +11 -11
  83. package/dist/specs/SmokeTest.spec.js.map +1 -1
  84. package/dist/specs/api/ContainerOverridesAPI.spec.js +10 -1
  85. package/dist/specs/api/ContainerOverridesAPI.spec.js.map +1 -1
  86. package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js +26 -15
  87. package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js.map +1 -1
  88. package/dist/specs/api/EmptyWorkspaceAPI.spec.js +17 -11
  89. package/dist/specs/api/EmptyWorkspaceAPI.spec.js.map +1 -1
  90. package/dist/specs/api/PodOverridesAPI.spec.js +12 -3
  91. package/dist/specs/api/PodOverridesAPI.spec.js.map +1 -1
  92. package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js +5 -5
  93. package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js.map +1 -1
  94. package/dist/specs/dashboard-samples/Quarkus.spec.js +7 -7
  95. package/dist/specs/dashboard-samples/Quarkus.spec.js.map +1 -1
  96. package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js +41 -41
  97. package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js.map +1 -1
  98. package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js +14 -9
  99. package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js.map +1 -1
  100. package/dist/specs/factory/Factory.spec.js +25 -25
  101. package/dist/specs/factory/Factory.spec.js.map +1 -1
  102. package/dist/specs/factory/NoSetupRepoFactory.spec.js +37 -34
  103. package/dist/specs/factory/NoSetupRepoFactory.spec.js.map +1 -1
  104. package/dist/specs/factory/RefusedOAuthFactory.spec.js +33 -33
  105. package/dist/specs/factory/RefusedOAuthFactory.spec.js.map +1 -1
  106. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js +12 -3
  107. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js.map +1 -1
  108. package/dist/tests-library/LoginTests.js +7 -7
  109. package/dist/tests-library/LoginTests.js.map +1 -1
  110. package/dist/tests-library/ProjectAndFileTests.js +7 -5
  111. package/dist/tests-library/ProjectAndFileTests.js.map +1 -1
  112. package/dist/tests-library/WorkspaceHandlingTests.js +16 -13
  113. package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
  114. package/dist/utils/BrowserTabsUtil.js +19 -14
  115. package/dist/utils/BrowserTabsUtil.js.map +1 -1
  116. package/dist/utils/CheReporter.js +44 -44
  117. package/dist/utils/CheReporter.js.map +1 -1
  118. package/dist/utils/DevWorkspaceConfigurationHelper.js +17 -8
  119. package/dist/utils/DevWorkspaceConfigurationHelper.js.map +1 -1
  120. package/dist/utils/DevfilesRegistryHelper.js +19 -13
  121. package/dist/utils/DevfilesRegistryHelper.js.map +1 -1
  122. package/dist/utils/DriverHelper.js +64 -66
  123. package/dist/utils/DriverHelper.js.map +1 -1
  124. package/dist/utils/KubernetesCommandLineToolsExecutor.js +28 -24
  125. package/dist/utils/KubernetesCommandLineToolsExecutor.js.map +1 -1
  126. package/dist/utils/Logger.js +18 -19
  127. package/dist/utils/Logger.js.map +1 -1
  128. package/dist/utils/ScreenCatcher.js +18 -12
  129. package/dist/utils/ScreenCatcher.js.map +1 -1
  130. package/dist/utils/ShellExecutor.js +9 -0
  131. package/dist/utils/ShellExecutor.js.map +1 -1
  132. package/dist/utils/StringUtil.js +15 -7
  133. package/dist/utils/StringUtil.js.map +1 -1
  134. package/dist/utils/request-handlers/CheApiRequestHandler.js +27 -27
  135. package/dist/utils/request-handlers/CheApiRequestHandler.js.map +1 -1
  136. package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js +10 -6
  137. package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js.map +1 -1
  138. package/dist/utils/request-handlers/headers/IAuthorizationHeaderHandler.js +2 -2
  139. package/dist/utils/workspace/ApiUrlResolver.js +3 -3
  140. package/dist/utils/workspace/ApiUrlResolver.js.map +1 -1
  141. package/dist/utils/workspace/ITestWorkspaceUtil.js +2 -2
  142. package/dist/utils/workspace/TestWorkspaceUtil.js +21 -19
  143. package/dist/utils/workspace/TestWorkspaceUtil.js.map +1 -1
  144. package/dist/utils/workspace/WorkspaceStatus.js +2 -2
  145. package/dist/utils/workspace/WorkspaceStatus.js.map +1 -1
  146. package/driver/ChromeDriver.ts +44 -50
  147. package/driver/IDriver.ts +3 -3
  148. package/index.ts +9 -9
  149. package/package.json +59 -49
  150. package/pageobjects/dashboard/CreateWorkspace.ts +64 -55
  151. package/pageobjects/dashboard/Dashboard.ts +101 -100
  152. package/pageobjects/dashboard/Workspaces.ts +196 -164
  153. package/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +150 -125
  154. package/pageobjects/git-providers/OauthPage.ts +177 -166
  155. package/pageobjects/ide/CheCodeLocatorLoader.ts +49 -46
  156. package/pageobjects/login/interfaces/ICheLoginPage.ts +3 -3
  157. package/pageobjects/login/interfaces/IOcpLoginPage.ts +3 -3
  158. package/pageobjects/login/kubernetes/DexLoginPage.ts +31 -30
  159. package/pageobjects/login/kubernetes/KubernetesLoginPage.ts +15 -14
  160. package/pageobjects/login/openshift/OcpLoginPage.ts +61 -54
  161. package/pageobjects/login/openshift/OcpRedHatLoginPage.ts +29 -24
  162. package/pageobjects/login/openshift/OcpUserLoginPage.ts +15 -18
  163. package/pageobjects/login/openshift/RedHatLoginPage.ts +48 -46
  164. package/pageobjects/login/openshift/RegularUserOcpCheLoginPage.ts +38 -34
  165. package/pageobjects/openshift/OcpApplicationPage.ts +21 -20
  166. package/pageobjects/openshift/OcpImportFromGitPage.ts +70 -68
  167. package/pageobjects/openshift/OcpMainPage.ts +69 -68
  168. package/specs/MochaHooks.ts +59 -50
  169. package/specs/SmokeTest.spec.ts +43 -40
  170. package/specs/api/ContainerOverridesAPI.spec.ts +33 -26
  171. package/specs/api/DevfileAcceptanceTestAPI.spec.ts +106 -95
  172. package/specs/api/EmptyWorkspaceAPI.spec.ts +62 -57
  173. package/specs/api/PodOverridesAPI.spec.ts +42 -33
  174. package/specs/dashboard-samples/EmptyWorkspace.spec.ts +31 -31
  175. package/specs/dashboard-samples/Quarkus.spec.ts +34 -34
  176. package/specs/dashboard-samples/RecommendedExtensions.spec.ts +192 -174
  177. package/specs/devconsole-intergration/DevConsoleIntegration.spec.ts +61 -52
  178. package/specs/factory/Factory.spec.ts +178 -168
  179. package/specs/factory/NoSetupRepoFactory.spec.ts +226 -211
  180. package/specs/factory/RefusedOAuthFactory.spec.ts +218 -204
  181. package/specs/miscellaneous/PredefinedNamespace.spec.ts +64 -54
  182. package/tests-library/LoginTests.ts +34 -32
  183. package/tests-library/ProjectAndFileTests.ts +21 -18
  184. package/tests-library/WorkspaceHandlingTests.ts +98 -89
  185. package/tsconfig.json +15 -15
  186. package/utils/BrowserTabsUtil.ts +103 -97
  187. package/utils/CheReporter.ts +141 -145
  188. package/utils/DevWorkspaceConfigurationHelper.ts +70 -61
  189. package/utils/DevfilesRegistryHelper.ts +67 -58
  190. package/utils/DriverHelper.ts +726 -700
  191. package/utils/KubernetesCommandLineToolsExecutor.ts +196 -180
  192. package/utils/Logger.ts +102 -125
  193. package/utils/ScreenCatcher.ts +57 -46
  194. package/utils/ShellExecutor.ts +19 -11
  195. package/utils/StringUtil.ts +40 -32
  196. package/utils/request-handlers/CheApiRequestHandler.ts +91 -88
  197. package/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.ts +32 -21
  198. package/utils/request-handlers/headers/IAuthorizationHeaderHandler.ts +3 -3
  199. package/utils/workspace/ApiUrlResolver.ts +31 -26
  200. package/utils/workspace/ITestWorkspaceUtil.ts +31 -31
  201. package/utils/workspace/TestWorkspaceUtil.ts +152 -145
  202. package/utils/workspace/WorkspaceStatus.ts +5 -5
  203. package/constants/APITestConstants.ts +0 -57
  204. package/constants/BaseTestConstants.ts +0 -68
  205. package/constants/ChromeDriverConstants.ts +0 -46
  206. package/constants/FactoryTestConstants.ts +0 -51
  207. package/constants/MonacoConstants.ts +0 -22
  208. package/constants/OAuthConstants.ts +0 -57
  209. package/constants/PluginsTestConstants.ts +0 -15
  210. package/constants/ReporterConstants.ts +0 -45
  211. package/constants/TimeoutConstants.ts +0 -113
  212. package/dist/constants/APITestConstants.js.map +0 -1
  213. package/dist/constants/BaseTestConstants.js.map +0 -1
  214. package/dist/constants/ChromeDriverConstants.js.map +0 -1
  215. package/dist/constants/FactoryTestConstants.js.map +0 -1
  216. package/dist/constants/MonacoConstants.js.map +0 -1
  217. package/dist/constants/OAuthConstants.js.map +0 -1
  218. package/dist/constants/PluginsTestConstants.js.map +0 -1
  219. package/dist/constants/ReporterConstants.js.map +0 -1
  220. package/dist/constants/TimeoutConstants.js.map +0 -1
  221. package/tslint.json +0 -126
@@ -1,5 +1,5 @@
1
- /*********************************************************************
2
- * Copyright (c) 2021-2023 Red Hat, Inc.
1
+ /** *******************************************************************
2
+ * copyright (c) 2021-2023 Red Hat, Inc.
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -14,61 +14,72 @@ import { CLASSES } from '../configs/inversify.types';
14
14
  import { DriverHelper } from './DriverHelper';
15
15
  import { error } from 'selenium-webdriver';
16
16
  import { StringUtil } from './StringUtil';
17
- import { ReporterConstants } from '../constants/ReporterConstants';
17
+ import { REPORTER_CONSTANTS } from '../constants/REPORTER_CONSTANTS';
18
18
 
19
19
  @injectable()
20
20
  export class ScreenCatcher {
21
- constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { }
21
+ constructor(
22
+ @inject(CLASSES.DriverHelper)
23
+ private readonly driverHelper: DriverHelper
24
+ ) {}
22
25
 
23
- async catchMethodScreen(methodName: string, methodIndex: number, screenshotIndex: number): Promise<void> {
24
- const executionScreenCastDir: string = `${ReporterConstants.TS_SELENIUM_REPORT_FOLDER}/executionScreencast`;
25
- const executionScreenCastErrorsDir: string = `${ReporterConstants.TS_SELENIUM_REPORT_FOLDER}/executionScreencastErrors`;
26
- const formattedMethodIndex: string = new Intl.NumberFormat('en-us', { minimumIntegerDigits: 3 }).format(methodIndex);
27
- const formattedScreenshotIndex: string = new Intl.NumberFormat('en-us', { minimumIntegerDigits: 5 }).format(screenshotIndex).replace(/,/g, '');
26
+ async catchMethodScreen(methodName: string, methodIndex: number, screenshotIndex: number): Promise<void> {
27
+ const executionScreenCastDir: string = `${REPORTER_CONSTANTS.TS_SELENIUM_REPORT_FOLDER}/executionScreencast`;
28
+ const executionScreenCastErrorsDir: string = `${REPORTER_CONSTANTS.TS_SELENIUM_REPORT_FOLDER}/executionScreencastErrors`;
29
+ const formattedMethodIndex: string = new Intl.NumberFormat('en-us', {
30
+ minimumIntegerDigits: 3
31
+ }).format(methodIndex);
32
+ const formattedScreenshotIndex: string = new Intl.NumberFormat('en-us', { minimumIntegerDigits: 5 })
33
+ .format(screenshotIndex)
34
+ .replace(/,/g, '');
28
35
 
29
- if (!fs.existsSync(ReporterConstants.TS_SELENIUM_REPORT_FOLDER)) {
30
- fs.mkdirSync(ReporterConstants.TS_SELENIUM_REPORT_FOLDER);
31
- }
36
+ if (!fs.existsSync(REPORTER_CONSTANTS.TS_SELENIUM_REPORT_FOLDER)) {
37
+ fs.mkdirSync(REPORTER_CONSTANTS.TS_SELENIUM_REPORT_FOLDER);
38
+ }
32
39
 
33
- if (!fs.existsSync(executionScreenCastDir)) {
34
- fs.mkdirSync(executionScreenCastDir);
35
- }
40
+ if (!fs.existsSync(executionScreenCastDir)) {
41
+ fs.mkdirSync(executionScreenCastDir);
42
+ }
36
43
 
37
- const date: Date = new Date();
38
- const timeStr: string = date.toLocaleTimeString('en-us', { hour12: false }) + '.' + new Intl.NumberFormat('en-us', { minimumIntegerDigits: 3 }).format(date.getMilliseconds());
44
+ const date: Date = new Date();
45
+ const timeStr: string =
46
+ date.toLocaleTimeString('en-us', { hour12: false }) +
47
+ '.' +
48
+ new Intl.NumberFormat('en-us', { minimumIntegerDigits: 3 }).format(date.getMilliseconds());
39
49
 
40
- const screenshotPath: string = `${executionScreenCastDir}/${formattedMethodIndex}-${formattedScreenshotIndex}--(${StringUtil.sanitizeTitle(timeStr)})_${StringUtil.sanitizeTitle(methodName)}.png`;
50
+ const screenshotPath: string = `${executionScreenCastDir}/${formattedMethodIndex}-${formattedScreenshotIndex}--(${StringUtil.sanitizeTitle(
51
+ timeStr
52
+ )})_${StringUtil.sanitizeTitle(methodName)}.png`;
41
53
 
42
- try {
43
- await this.catchScreen(screenshotPath);
44
- } catch (err) {
45
- if (!fs.existsSync(executionScreenCastErrorsDir)) {
46
- fs.mkdirSync(executionScreenCastErrorsDir);
47
- }
54
+ try {
55
+ await this.catchScreen(screenshotPath);
56
+ } catch (err) {
57
+ if (!fs.existsSync(executionScreenCastErrorsDir)) {
58
+ fs.mkdirSync(executionScreenCastErrorsDir);
59
+ }
48
60
 
49
- let errorLogFilePath: string = screenshotPath.replace('.png', '.txt');
50
- errorLogFilePath = errorLogFilePath.replace(executionScreenCastDir, executionScreenCastErrorsDir);
51
- if (err instanceof error.IError) {
52
- await this.writeErrorLog(errorLogFilePath, err);
53
- }
54
- }
55
- }
61
+ let errorLogFilePath: string = screenshotPath.replace('.png', '.txt');
62
+ errorLogFilePath = errorLogFilePath.replace(executionScreenCastDir, executionScreenCastErrorsDir);
63
+ if (err instanceof error.IError) {
64
+ this.writeErrorLog(errorLogFilePath, err);
65
+ }
66
+ }
67
+ }
56
68
 
57
- async catchScreen(screenshotPath: string): Promise<void> {
58
- const screenshot: string = await this.driverHelper.getDriver().takeScreenshot();
59
- const screenshotStream: WriteStream = fs.createWriteStream(screenshotPath);
60
- screenshotStream.write(Buffer.from(screenshot, 'base64'));
61
- screenshotStream.end();
62
- }
69
+ async catchScreen(screenshotPath: string): Promise<void> {
70
+ const screenshot: string = await this.driverHelper.getDriver().takeScreenshot();
71
+ const screenshotStream: WriteStream = fs.createWriteStream(screenshotPath);
72
+ screenshotStream.write(Buffer.from(screenshot, 'base64'));
73
+ screenshotStream.end();
74
+ }
63
75
 
64
- async writeErrorLog(errorLogPath: string, err: error.IError): Promise<void> {
65
- console.log(`Failed to save screenshot, additional information in the ${errorLogPath}`);
66
-
67
- if (err.stack) {
68
- const screenshotStream: WriteStream = fs.createWriteStream(errorLogPath);
69
- screenshotStream.write(Buffer.from(err.stack, 'utf8'));
70
- screenshotStream.end();
71
- }
72
- }
76
+ writeErrorLog(errorLogPath: string, err: error.IError): void {
77
+ console.log(`Failed to save screenshot, additional information in the ${errorLogPath}`);
73
78
 
79
+ if (err.stack) {
80
+ const screenshotStream: WriteStream = fs.createWriteStream(errorLogPath);
81
+ screenshotStream.write(Buffer.from(err.stack, 'utf8'));
82
+ screenshotStream.end();
83
+ }
84
+ }
74
85
  }
@@ -1,17 +1,25 @@
1
+ /** *******************************************************************
2
+ * copyright (c) 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
+ **********************************************************************/
1
10
  import { echo, exec, ShellString } from 'shelljs';
2
11
 
3
12
  export class ShellExecutor {
13
+ static wait(seconds: number): void {
14
+ this.execWithLog(`sleep ${seconds}s`);
15
+ }
4
16
 
5
- static wait(seconds: number): void {
6
- this.execWithLog(`sleep ${seconds}s`);
7
- }
17
+ static curl(link: string): ShellString {
18
+ return this.execWithLog(`curl -k ${link}`);
19
+ }
8
20
 
9
- static curl(link: string): ShellString {
10
- return this.execWithLog(`curl -k ${link}`);
11
- }
12
-
13
- protected static execWithLog(command: string): ShellString {
14
- echo(command);
15
- return exec(command);
16
- }
21
+ protected static execWithLog(command: string): ShellString {
22
+ echo(command);
23
+ return exec(command);
24
+ }
17
25
  }
@@ -1,5 +1,5 @@
1
- /*********************************************************************
2
- * Copyright (c) 2019 Red Hat, Inc.
1
+ /** *******************************************************************
2
+ * copyright (c) 2019 Red Hat, Inc.
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -13,37 +13,45 @@ import { Logger } from './Logger';
13
13
 
14
14
  @injectable()
15
15
  export class StringUtil {
16
- /**
17
- * Method extracts a test repo name from git clone https url;
18
- * it splits the url into string[] by "/" or ".", deletes empty elements and elements that contains just "git", "main" or "tree" word, than returns the last one;
19
- * please, avoid to call the test repo as just "git" or to use dots in the name, like: github.com/user/git.git, github.com/user/name.with.dots.
20
- * @param url git https url (which using for "git clone")
21
- * @return project name
22
- */
23
- static getProjectNameFromGitUrl(url: string): string {
24
- Logger.debug(`${url}`);
25
- if (url.includes('?')) {
26
- url = url.substring(0, url.indexOf('?'));
27
- }
28
- if (url.includes('/tree/')) {
29
- url = url.split('/').slice(0, -2).join('/');
30
- }
31
- const projectName: string = url.split(/[\/.]/).filter((e: string) => !['git', ''].includes(e)).reverse()[0];
32
- Logger.debug(`${projectName}`);
33
- return projectName;
34
- }
16
+ /**
17
+ * method extracts a test repo name from git clone https url;
18
+ * it splits the url into string[] by "/" or ".", deletes empty elements and elements that contains just "git", "main" or "tree" word, than returns the last one;
19
+ * please, avoid to call the test repo as just "git" or to use dots in the name, like: github.com/user/git.git, github.com/user/name.with.dots.
20
+ * @param url git https url (which using for "git clone")
21
+ * @return project name
22
+ */
23
+ static getProjectNameFromGitUrl(url: string): string {
24
+ Logger.debug(`${url}`);
25
+ if (url.includes('?')) {
26
+ url = url.substring(0, url.indexOf('?'));
27
+ }
28
+ if (url.includes('/tree/')) {
29
+ url = url.split('/').slice(0, -2).join('/');
30
+ }
31
+ const projectName: string = url
32
+ .split(/[\/.]/)
33
+ .filter((e: string): boolean => !['git', ''].includes(e))
34
+ .reverse()[0];
35
+ Logger.debug(`${projectName}`);
36
+ return projectName;
37
+ }
35
38
 
36
- static sanitizeTitle(arg: string): string {
37
- return arg.replace(/\//g, '+').replace(/,/g, '.').replace(/:/g, '-').replace(/['"]/g, '').replace(/[^a-z0-9+\-.()\[\]_]/gi, '_');
38
- }
39
+ static sanitizeTitle(arg: string): string {
40
+ return arg
41
+ .replace(/\//g, '+')
42
+ .replace(/,/g, '.')
43
+ .replace(/:/g, '-')
44
+ .replace(/['"]/g, '')
45
+ .replace(/[^a-z0-9+\-.()\[\]_]/gi, '_');
46
+ }
39
47
 
40
- /**
41
- * Replaces ${ENV}, $ENV to "$ENV"
42
- * @param command string command with environmental variables in unsupported format
43
- * @return updated command with environmental variables in supported format
44
- */
48
+ /**
49
+ * replaces ${ENV}, $ENV to "$ENV"
50
+ * @param command string command with environmental variables in unsupported format
51
+ * @return updated command with environmental variables in supported format
52
+ */
45
53
 
46
- static updateCommandEnvsToShStyle(command: string): string {
47
- return command.replace(/[{}]/g, '').replace(/(?<!")\${?[a-zA-Z0-9_+\-\s]+\b}?/gm, `"\$&"`);
48
- }
54
+ static updateCommandEnvsToShStyle(command: string): string {
55
+ return command.replace(/[{}]/g, '').replace(/(?<!")\${?[a-zA-Z0-9_+\-\s]+\b}?/gm, '"$&"');
56
+ }
49
57
  }
@@ -1,5 +1,5 @@
1
- /*********************************************************************
2
- * Copyright (c) 2019-2023 Red Hat, Inc.
1
+ /** *******************************************************************
2
+ * copyright (c) 2019-2023 Red Hat, Inc.
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -13,100 +13,103 @@ import { TYPES } from '../../configs/inversify.types';
13
13
  import { inject, injectable } from 'inversify';
14
14
  import { IAuthorizationHeaderHandler } from './headers/IAuthorizationHeaderHandler';
15
15
  import { Logger } from '../Logger';
16
- import { BaseTestConstants } from '../../constants/BaseTestConstants';
16
+ import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
17
17
 
18
18
  @injectable()
19
19
  export class CheApiRequestHandler {
20
+ constructor(
21
+ @inject(TYPES.IAuthorizationHeaderHandler)
22
+ private readonly headerHandler: IAuthorizationHeaderHandler
23
+ ) {}
20
24
 
21
- /**
22
- * This method adds a request interceptor into axios request interceptors list and returns an ID of the interceptor
23
- */
24
- static enableRequestInterceptor(): number {
25
- Logger.debug();
26
- return axios.interceptors.request.use(request => {
27
- try {
28
- let request_censored: AxiosRequestConfig = JSON.parse(JSON.stringify(request));
29
- if (request_censored === undefined) {
30
- Logger.error('JSON.parse returned an undefined object, cannot process request');
31
- return request;
32
- }
33
- if (request_censored.headers === undefined) {
34
- Logger.warn('request does not contain any headers object');
35
- return request;
36
- }
37
- request_censored.headers.Authorization = 'CENSORED';
38
- request_censored.headers.Cookie = 'CENSORED';
39
- Logger.info(`request:\n` + request_censored);
40
- } catch (err) {
41
- Logger.error(`request: Failed to deep clone AxiosRequestConfig:` + err);
42
- }
43
- return request;
44
- });
45
- }
25
+ /**
26
+ * this method adds a request interceptor into axios request interceptors list and returns an ID of the interceptor
27
+ */
28
+ static enableRequestInterceptor(): number {
29
+ Logger.debug();
30
+ return axios.interceptors.request.use((request: AxiosRequestConfig): AxiosRequestConfig => {
31
+ try {
32
+ const REQUEST_CENSORED: AxiosRequestConfig = JSON.parse(JSON.stringify(request));
33
+ if (REQUEST_CENSORED === undefined) {
34
+ Logger.error('JSON.parse returned an undefined object, cannot process request');
35
+ return request;
36
+ }
37
+ if (REQUEST_CENSORED.headers === undefined) {
38
+ Logger.warn('request does not contain any headers object');
39
+ return request;
40
+ }
41
+ REQUEST_CENSORED.headers.Authorization = 'CENSORED';
42
+ REQUEST_CENSORED.headers.Cookie = 'CENSORED';
43
+ Logger.info('request:\n' + JSON.stringify(REQUEST_CENSORED));
44
+ } catch (err) {
45
+ Logger.error('request: Failed to deep clone AxiosRequestConfig:' + err);
46
+ }
47
+ return request;
48
+ });
49
+ }
46
50
 
47
- /**
48
- * This method adds a response interceptor into axios response interceptors list and returns an ID of the interceptor
49
- */
50
- static enableResponseInterceptor(): number {
51
- Logger.debug();
52
- return axios.interceptors.response.use(response => {
53
- try {
54
- let response_censored: AxiosResponse = JSON.parse(JSON.stringify(response, (key, value) => {
55
- switch (key) {
56
- case 'request':
57
- return 'CENSORED';
58
- default:
59
- return value;
60
- }
61
- }));
62
- if (response_censored === undefined) {
63
- Logger.error('JSON.parse returned an undefined object, cannot process response');
64
- return response;
65
- }
66
- if (response_censored.config === undefined) {
67
- Logger.warn('response does not contain any config object');
68
- return response;
69
- }
70
- if (response_censored.config.headers === undefined) {
71
- Logger.warn('response does not contain any config.headers object');
72
- return response;
73
- }
74
- response_censored.config.headers.Authorization = 'CENSORED';
75
- response_censored.config.headers.Cookie = 'CENSORED';
76
- if (response_censored.data.access_token !== null) {
77
- response_censored.data.access_token = 'CENSORED';
78
- }
79
- if (response_censored.data.refresh_token !== null) {
80
- response_censored.data.refresh_token = 'CENSORED';
81
- }
82
- Logger.info(`response:\n` + response_censored);
83
- } catch (err) {
84
- Logger.error(`response: Failed to deep clone AxiosResponse:` + err);
85
- }
86
- return response;
87
- });
88
- }
51
+ /**
52
+ * this method adds a response interceptor into axios response interceptors list and returns an ID of the interceptor
53
+ */
54
+ static enableResponseInterceptor(): number {
55
+ Logger.debug();
56
+ return axios.interceptors.response.use((response: AxiosResponse): AxiosResponse => {
57
+ try {
58
+ const RESPONSE_CENSORED: AxiosResponse = JSON.parse(
59
+ JSON.stringify(response, (key, value: string): string => {
60
+ switch (key) {
61
+ case 'request':
62
+ return 'CENSORED';
63
+ default:
64
+ return value;
65
+ }
66
+ })
67
+ );
68
+ if (RESPONSE_CENSORED === undefined) {
69
+ Logger.error('JSON.parse returned an undefined object, cannot process response');
70
+ return response;
71
+ }
72
+ if (RESPONSE_CENSORED.config === undefined) {
73
+ Logger.warn('response does not contain any config object');
74
+ return response;
75
+ }
76
+ if (RESPONSE_CENSORED.config.headers === undefined) {
77
+ Logger.warn('response does not contain any config.headers object');
78
+ return response;
79
+ }
80
+ RESPONSE_CENSORED.config.headers.Authorization = 'CENSORED';
81
+ RESPONSE_CENSORED.config.headers.Cookie = 'CENSORED';
82
+ if (RESPONSE_CENSORED.data.access_token !== null) {
83
+ RESPONSE_CENSORED.data.access_token = 'CENSORED';
84
+ }
85
+ if (RESPONSE_CENSORED.data.refresh_token !== null) {
86
+ RESPONSE_CENSORED.data.refresh_token = 'CENSORED';
87
+ }
88
+ Logger.info('response:\n' + JSON.stringify(RESPONSE_CENSORED));
89
+ } catch (err) {
90
+ Logger.error('response: Failed to deep clone AxiosResponse:' + err);
91
+ }
92
+ return response;
93
+ });
94
+ }
89
95
 
90
- constructor(@inject(TYPES.IAuthorizationHeaderHandler) private readonly headerHandler: IAuthorizationHeaderHandler) { }
96
+ async get(relativeUrl: string): Promise<AxiosResponse> {
97
+ return await axios.get(this.assembleUrl(relativeUrl), await this.headerHandler.get());
98
+ }
91
99
 
92
- async get(relativeUrl: string): Promise<AxiosResponse> {
93
- return await axios.get(this.assembleUrl(relativeUrl), await this.headerHandler.get());
94
- }
100
+ async post(relativeUrl: string, data?: string): Promise<AxiosResponse> {
101
+ return await axios.post(this.assembleUrl(relativeUrl), data, await this.headerHandler.get());
102
+ }
95
103
 
96
- async post(relativeUrl: string, data?: string | any): Promise<AxiosResponse> {
97
- return await axios.post(this.assembleUrl(relativeUrl), data, await this.headerHandler.get());
98
- }
104
+ async delete(relativeUrl: string): Promise<AxiosResponse> {
105
+ return await axios.delete(this.assembleUrl(relativeUrl), await this.headerHandler.get());
106
+ }
99
107
 
100
- async delete(relativeUrl: string): Promise<AxiosResponse> {
101
- return await axios.delete(this.assembleUrl(relativeUrl), await this.headerHandler.get());
102
- }
103
-
104
- async patch(relativeUrl: string, patchParams: object): Promise<AxiosResponse> {
105
- return await axios.patch(this.assembleUrl(relativeUrl), patchParams, await this.headerHandler.get());
106
- }
107
-
108
- private assembleUrl(relativeUrl: string): string {
109
- return `${BaseTestConstants.TS_SELENIUM_BASE_URL}/${relativeUrl}`;
110
- }
108
+ async patch(relativeUrl: string, patchParams: object): Promise<AxiosResponse> {
109
+ return await axios.patch(this.assembleUrl(relativeUrl), patchParams, await this.headerHandler.get());
110
+ }
111
111
 
112
+ private assembleUrl(relativeUrl: string): string {
113
+ return `${BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL}/${relativeUrl}`;
114
+ }
112
115
  }
@@ -1,5 +1,5 @@
1
- /*********************************************************************
2
- * Copyright (c) 2019-2023 Red Hat, Inc.
1
+ /** *******************************************************************
2
+ * copyright (c) 2019-2023 Red Hat, Inc.
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -14,29 +14,40 @@ import { DriverHelper } from '../../DriverHelper';
14
14
  import { CLASSES } from '../../../configs/inversify.types';
15
15
  import { Logger } from '../../Logger';
16
16
  import { IWebDriverCookie } from 'selenium-webdriver';
17
- import { BaseTestConstants, Platform } from '../../../constants/BaseTestConstants';
17
+ import { BASE_TEST_CONSTANTS, Platform } from '../../../constants/BASE_TEST_CONSTANTS';
18
18
 
19
19
  @injectable()
20
20
  export class CheMultiuserAuthorizationHeaderHandler implements IAuthorizationHeaderHandler {
21
- private authorizationToken: string = '';
22
- private readonly cookiesType: string = BaseTestConstants.TS_PLATFORM === Platform.OPENSHIFT ? '_oauth_proxy' : '_oauth2_proxy';
21
+ private authorizationToken: string = '';
22
+ private readonly cookiesType: string = BASE_TEST_CONSTANTS.TS_PLATFORM === Platform.OPENSHIFT ? '_oauth_proxy' : '_oauth2_proxy';
23
23
 
24
- constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { }
24
+ constructor(
25
+ @inject(CLASSES.DriverHelper)
26
+ private readonly driverHelper: DriverHelper
27
+ ) {}
25
28
 
26
- async get(): Promise<AxiosRequestConfig> {
27
- try {
28
- let token: IWebDriverCookie = await this.driverHelper.getDriver().manage().getCookie(this.cookiesType);
29
- if (this.authorizationToken !== token.value) {
30
- this.authorizationToken = token.value;
31
- }
32
- } catch (err) {
33
- if (this.authorizationToken.length > 0) {
34
- Logger.warn(`could not obtain _oauth_proxy cookie from chromedriver, browser session may have been killed. Using stored value.`);
35
- } else {
36
- throw new Error(`Could not obtain _oauth_proxy cookie from chromedriver, browser session may have been killed. No stored token present!`);
37
- }
38
- }
29
+ async get(): Promise<AxiosRequestConfig> {
30
+ try {
31
+ const token: IWebDriverCookie = await this.driverHelper.getDriver().manage().getCookie(this.cookiesType);
32
+ if (this.authorizationToken !== token.value) {
33
+ this.authorizationToken = token.value;
34
+ }
35
+ } catch (err) {
36
+ if (this.authorizationToken.length > 0) {
37
+ Logger.warn(
38
+ 'could not obtain _oauth_proxy cookie from chromedriver, browser session may have been killed. Using stored value.'
39
+ );
40
+ } else {
41
+ throw new Error(
42
+ 'Could not obtain _oauth_proxy cookie from chromedriver, browser session may have been killed. No stored token present!'
43
+ );
44
+ }
45
+ }
39
46
 
40
- return { headers: { 'cookie': `${this.cookiesType}=${this.authorizationToken}` } };
41
- }
47
+ return {
48
+ headers: {
49
+ cookie: `${this.cookiesType}=${this.authorizationToken}`
50
+ }
51
+ };
52
+ }
42
53
  }
@@ -1,5 +1,5 @@
1
- /*********************************************************************
2
- * Copyright (c) 2019-2023 Red Hat, Inc.
1
+ /** *******************************************************************
2
+ * copyright (c) 2019-2023 Red Hat, Inc.
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -11,5 +11,5 @@
11
11
  import { AxiosRequestConfig } from 'axios';
12
12
 
13
13
  export interface IAuthorizationHeaderHandler {
14
- get(): Promise<AxiosRequestConfig>;
14
+ get(): Promise<AxiosRequestConfig>;
15
15
  }
@@ -1,5 +1,5 @@
1
- /*********************************************************************
2
- * Copyright (c) 2019-2023 Red Hat, Inc.
1
+ /** *******************************************************************
2
+ * copyright (c) 2019-2023 Red Hat, Inc.
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -15,33 +15,38 @@ import { AxiosResponse } from 'axios';
15
15
 
16
16
  @injectable()
17
17
  export class ApiUrlResolver {
18
- private static readonly DASHBOARD_API_URL: string = 'dashboard/api/namespace';
19
- private static readonly KUBERNETES_API_URL: string = 'api/kubernetes/namespace';
18
+ private static readonly DASHBOARD_API_URL: string = 'dashboard/api/namespace';
19
+ private static readonly KUBERNETES_API_URL: string = 'api/kubernetes/namespace';
20
20
 
21
- private userNamespace: string = '';
21
+ private userNamespace: string = '';
22
22
 
23
- constructor(@inject(CLASSES.CheApiRequestHandler) private readonly processRequestHandler: CheApiRequestHandler) {}
23
+ constructor(
24
+ @inject(CLASSES.CheApiRequestHandler)
25
+ private readonly processRequestHandler: CheApiRequestHandler
26
+ ) {}
24
27
 
25
- async getWorkspaceApiUrl(workspaceName: string): Promise<string> {
26
- return `${await this.getWorkspacesApiUrl()}/${workspaceName}`;
27
- }
28
+ async getWorkspaceApiUrl(workspaceName: string): Promise<string> {
29
+ return `${await this.getWorkspacesApiUrl()}/${workspaceName}`;
30
+ }
28
31
 
29
- async getWorkspacesApiUrl(): Promise<string> {
30
- const namespace: string = await this.obtainUserNamespace();
31
- return `${ApiUrlResolver.DASHBOARD_API_URL}/${namespace}/devworkspaces`;
32
- }
32
+ async getWorkspacesApiUrl(): Promise<string> {
33
+ const namespace: string = await this.obtainUserNamespace();
34
+ return `${ApiUrlResolver.DASHBOARD_API_URL}/${namespace}/devworkspaces`;
35
+ }
33
36
 
34
- private async obtainUserNamespace(): Promise<string> {
35
- Logger.debug(`${this.userNamespace}`);
36
- if (this.userNamespace.length === 0) {
37
- Logger.trace(`USER_NAMESPACE.length = 0, calling kubernetes API`);
38
- const kubernetesResponse: AxiosResponse = await this.processRequestHandler.get(ApiUrlResolver.KUBERNETES_API_URL);
39
- if (kubernetesResponse.status !== 200) {
40
- throw new Error(`Cannot get user namespace from kubernetes API. Code: ${kubernetesResponse.status} Data: ${kubernetesResponse.data}`);
41
- }
42
- this.userNamespace = kubernetesResponse.data[0].name;
43
- Logger.debug(`kubeapi success: ${this.userNamespace}`);
44
- }
45
- return this.userNamespace;
46
- }
37
+ private async obtainUserNamespace(): Promise<string> {
38
+ Logger.debug(`${this.userNamespace}`);
39
+ if (this.userNamespace.length === 0) {
40
+ Logger.trace('USER_NAMESPACE.length = 0, calling kubernetes API');
41
+ const kubernetesResponse: AxiosResponse = await this.processRequestHandler.get(ApiUrlResolver.KUBERNETES_API_URL);
42
+ if (kubernetesResponse.status !== 200) {
43
+ throw new Error(
44
+ `Cannot get user namespace from kubernetes API. Code: ${kubernetesResponse.status} Data: ${kubernetesResponse.data}`
45
+ );
46
+ }
47
+ this.userNamespace = kubernetesResponse.data[0].name;
48
+ Logger.debug(`kubeapi success: ${this.userNamespace}`);
49
+ }
50
+ return this.userNamespace;
51
+ }
47
52
  }