@eclipse-che/che-e2e 7.76.0 → 7.78.0-next-677d4d6

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 (125) hide show
  1. package/configs/mocharc.ts +4 -2
  2. package/configs/reporters.config.js +54 -0
  3. package/configs/sh-scripts/runDevfileAcceptanceTests.sh +81 -0
  4. package/configs/sh-scripts/runFunctionalTests.sh +9 -6
  5. package/constants/BASE_TEST_CONSTANTS.ts +21 -3
  6. package/constants/FACTORY_TEST_CONSTANTS.ts +3 -1
  7. package/constants/MOCHA_CONSTANTS.ts +5 -2
  8. package/constants/REPORTER_CONSTANTS.ts +99 -3
  9. package/constants/TIMEOUT_CONSTANTS.ts +10 -22
  10. package/dist/configs/mocharc.js +4 -2
  11. package/dist/configs/mocharc.js.map +1 -1
  12. package/dist/constants/BASE_TEST_CONSTANTS.js +16 -2
  13. package/dist/constants/BASE_TEST_CONSTANTS.js.map +1 -1
  14. package/dist/constants/FACTORY_TEST_CONSTANTS.js +3 -1
  15. package/dist/constants/FACTORY_TEST_CONSTANTS.js.map +1 -1
  16. package/dist/constants/MOCHA_CONSTANTS.js +3 -2
  17. package/dist/constants/MOCHA_CONSTANTS.js.map +1 -1
  18. package/dist/constants/REPORTER_CONSTANTS.js +71 -2
  19. package/dist/constants/REPORTER_CONSTANTS.js.map +1 -1
  20. package/dist/constants/TIMEOUT_CONSTANTS.js +0 -8
  21. package/dist/constants/TIMEOUT_CONSTANTS.js.map +1 -1
  22. package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js +1 -1
  23. package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js.map +1 -1
  24. package/dist/pageobjects/git-providers/OauthPage.js +22 -3
  25. package/dist/pageobjects/git-providers/OauthPage.js.map +1 -1
  26. package/dist/pageobjects/ide/CheCodeLocatorLoader.js +4 -1
  27. package/dist/pageobjects/ide/CheCodeLocatorLoader.js.map +1 -1
  28. package/dist/pageobjects/openshift/OcpMainPage.js +1 -1
  29. package/dist/pageobjects/openshift/OcpMainPage.js.map +1 -1
  30. package/dist/specs/MochaHooks.js +49 -11
  31. package/dist/specs/MochaHooks.js.map +1 -1
  32. package/dist/specs/SmokeTest.spec.js +9 -5
  33. package/dist/specs/SmokeTest.spec.js.map +1 -1
  34. package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js +3 -1
  35. package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js.map +1 -1
  36. package/dist/specs/api/EmptyWorkspaceAPI.spec.js +0 -3
  37. package/dist/specs/api/EmptyWorkspaceAPI.spec.js.map +1 -1
  38. package/dist/specs/dashboard-samples/Documentation.spec.js +7 -2
  39. package/dist/specs/dashboard-samples/Documentation.spec.js.map +1 -1
  40. package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js +12 -6
  41. package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js.map +1 -1
  42. package/dist/specs/dashboard-samples/Quarkus.spec.js +12 -6
  43. package/dist/specs/dashboard-samples/Quarkus.spec.js.map +1 -1
  44. package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js +12 -6
  45. package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js.map +1 -1
  46. package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js +18 -5
  47. package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js.map +1 -1
  48. package/dist/specs/factory/Factory.spec.js +12 -6
  49. package/dist/specs/factory/Factory.spec.js.map +1 -1
  50. package/dist/specs/factory/NoSetupRepoFactory.spec.js +12 -8
  51. package/dist/specs/factory/NoSetupRepoFactory.spec.js.map +1 -1
  52. package/dist/specs/factory/RefusedOAuthFactory.spec.js +33 -31
  53. package/dist/specs/factory/RefusedOAuthFactory.spec.js.map +1 -1
  54. package/dist/specs/miscellaneous/CreateWorkspaceWithExistedName.spec.js +12 -7
  55. package/dist/specs/miscellaneous/CreateWorkspaceWithExistedName.spec.js.map +1 -1
  56. package/dist/specs/miscellaneous/KubedockPodmanTest.spec.js +12 -6
  57. package/dist/specs/miscellaneous/KubedockPodmanTest.spec.js.map +1 -1
  58. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js +45 -12
  59. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js.map +1 -1
  60. package/dist/specs/miscellaneous/WorkspaceIdleTimeout.spec.js +15 -5
  61. package/dist/specs/miscellaneous/WorkspaceIdleTimeout.spec.js.map +1 -1
  62. package/dist/specs/miscellaneous/WorkspaceWithParent.spec.js +9 -4
  63. package/dist/specs/miscellaneous/WorkspaceWithParent.spec.js.map +1 -1
  64. package/dist/specs/web-terminal/WebTerminalTest.spec.js +22 -0
  65. package/dist/specs/web-terminal/WebTerminalTest.spec.js.map +1 -1
  66. package/dist/suites/devfile-acceptance-test-suite/DynamicallyGeneratingAPITest.suite.js +13 -0
  67. package/dist/suites/devfile-acceptance-test-suite/DynamicallyGeneratingAPITest.suite.js.map +1 -0
  68. package/dist/suites/disconnected-ocp/UITest.suite.js +1 -1
  69. package/dist/suites/online-ocp/UITest.suite.js +1 -1
  70. package/dist/tests-library/LoginTests.js +15 -11
  71. package/dist/tests-library/LoginTests.js.map +1 -1
  72. package/dist/tests-library/ProjectAndFileTests.js +0 -2
  73. package/dist/tests-library/ProjectAndFileTests.js.map +1 -1
  74. package/dist/tests-library/WorkspaceHandlingTests.js +2 -5
  75. package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
  76. package/dist/utils/BrowserTabsUtil.js +8 -1
  77. package/dist/utils/BrowserTabsUtil.js.map +1 -1
  78. package/dist/utils/DevWorkspaceConfigurationHelper.js +2 -1
  79. package/dist/utils/DevWorkspaceConfigurationHelper.js.map +1 -1
  80. package/dist/utils/DevfilesRegistryHelper.js +40 -37
  81. package/dist/utils/DevfilesRegistryHelper.js.map +1 -1
  82. package/dist/utils/DriverHelper.js +4 -0
  83. package/dist/utils/DriverHelper.js.map +1 -1
  84. package/dist/utils/KubernetesCommandLineToolsExecutor.js +9 -8
  85. package/dist/utils/KubernetesCommandLineToolsExecutor.js.map +1 -1
  86. package/dist/utils/Logger.js +45 -11
  87. package/dist/utils/Logger.js.map +1 -1
  88. package/package.json +11 -11
  89. package/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +1 -1
  90. package/pageobjects/git-providers/OauthPage.ts +24 -3
  91. package/pageobjects/ide/CheCodeLocatorLoader.ts +4 -1
  92. package/pageobjects/openshift/OcpMainPage.ts +1 -1
  93. package/specs/MochaHooks.ts +51 -10
  94. package/specs/SmokeTest.spec.ts +9 -5
  95. package/specs/api/DevfileAcceptanceTestAPI.spec.ts +5 -1
  96. package/specs/api/EmptyWorkspaceAPI.spec.ts +0 -4
  97. package/specs/dashboard-samples/Documentation.spec.ts +8 -3
  98. package/specs/dashboard-samples/EmptyWorkspace.spec.ts +15 -8
  99. package/specs/dashboard-samples/Quarkus.spec.ts +15 -7
  100. package/specs/dashboard-samples/RecommendedExtensions.spec.ts +15 -7
  101. package/specs/devconsole-intergration/DevConsoleIntegration.spec.ts +20 -8
  102. package/specs/factory/Factory.spec.ts +15 -7
  103. package/specs/factory/NoSetupRepoFactory.spec.ts +15 -11
  104. package/specs/factory/RefusedOAuthFactory.spec.ts +42 -35
  105. package/specs/miscellaneous/CreateWorkspaceWithExistedName.spec.ts +15 -8
  106. package/specs/miscellaneous/KubedockPodmanTest.spec.ts +16 -7
  107. package/specs/miscellaneous/PredefinedNamespace.spec.ts +51 -14
  108. package/specs/miscellaneous/WorkspaceIdleTimeout.spec.ts +19 -6
  109. package/specs/miscellaneous/WorkspaceWithParent.spec.ts +9 -4
  110. package/specs/web-terminal/WebTerminalTest.spec.ts +33 -0
  111. package/suites/devfile-acceptance-test-suite/DynamicallyGeneratingAPITest.suite.ts +10 -0
  112. package/suites/disconnected-ocp/UITest.suite.ts +1 -1
  113. package/suites/online-ocp/UITest.suite.ts +1 -1
  114. package/tests-library/LoginTests.ts +21 -11
  115. package/tests-library/ProjectAndFileTests.ts +0 -6
  116. package/tests-library/WorkspaceHandlingTests.ts +2 -6
  117. package/tsconfig.json +1 -1
  118. package/utils/BrowserTabsUtil.ts +8 -1
  119. package/utils/DevWorkspaceConfigurationHelper.ts +4 -1
  120. package/utils/DevfilesRegistryHelper.ts +41 -39
  121. package/utils/DriverHelper.ts +6 -0
  122. package/utils/KubernetesCommandLineToolsExecutor.ts +8 -8
  123. package/utils/Logger.ts +50 -12
  124. package/utils/workspace/ITestWorkspaceUtil.ts +7 -7
  125. package/configs/reporters-config.json +0 -6
@@ -16,7 +16,6 @@ import {
16
16
  EditorView,
17
17
  InputBox,
18
18
  Locators,
19
- ModalDialog,
20
19
  NewScmView,
21
20
  SingleScmProvider,
22
21
  TextEditor,
@@ -26,7 +25,7 @@ import {
26
25
  import { expect } from 'chai';
27
26
  import { registerRunningWorkspace } from '../MochaHooks';
28
27
  import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil';
29
- import { CLASSES } from '../../configs/inversify.types';
28
+ import { CLASSES, TYPES } from '../../configs/inversify.types';
30
29
  import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests';
31
30
  import { CheCodeLocatorLoader } from '../../pageobjects/ide/CheCodeLocatorLoader';
32
31
  import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests';
@@ -38,6 +37,8 @@ import { LoginTests } from '../../tests-library/LoginTests';
38
37
  import { OAUTH_CONSTANTS } from '../../constants/OAUTH_CONSTANTS';
39
38
  import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
40
39
  import { FACTORY_TEST_CONSTANTS, GitProviderType } from '../../constants/FACTORY_TEST_CONSTANTS';
40
+ import { ITestWorkspaceUtil } from '../../utils/workspace/ITestWorkspaceUtil';
41
+ import { Dashboard } from '../../pageobjects/dashboard/Dashboard';
41
42
 
42
43
  suite(
43
44
  `Create a workspace via launching a factory from the ${FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_PROVIDER} repository and deny the access ${BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`,
@@ -50,9 +51,12 @@ suite(
50
51
  const driverHelper: DriverHelper = e2eContainer.get(CLASSES.DriverHelper);
51
52
  const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests);
52
53
  const oauthPage: OauthPage = e2eContainer.get(CLASSES.OauthPage);
54
+ const testWorkspaceUtil: ITestWorkspaceUtil = e2eContainer.get(TYPES.WorkspaceUtil);
55
+ const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard);
53
56
 
54
57
  let projectSection: ViewSection;
55
58
  let scmProvider: SingleScmProvider;
59
+ let rest: SingleScmProvider[];
56
60
  let scmContextMenu: ContextMenu;
57
61
 
58
62
  // test specific data
@@ -66,19 +70,19 @@ suite(
66
70
  let testRepoProjectName: string;
67
71
  const isPrivateRepo: string = FACTORY_TEST_CONSTANTS.TS_SELENIUM_IS_PRIVATE_FACTORY_GIT_REPO ? 'private' : 'public';
68
72
 
69
- loginTests.loginIntoChe();
73
+ suiteSetup('Login', async function (): Promise<void> {
74
+ await loginTests.loginIntoChe();
75
+ });
70
76
 
71
77
  test(`Navigate to the ${isPrivateRepo} repository factory URL`, async function (): Promise<void> {
72
78
  await browserTabsUtil.navigateTo(FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_URL());
73
79
  });
74
80
 
75
- if (OAUTH_CONSTANTS.TS_SELENIUM_GIT_PROVIDER_OAUTH) {
76
- test(`Authorize with a ${FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_PROVIDER} OAuth and deny access`, async function (): Promise<void> {
77
- await oauthPage.login();
78
- await oauthPage.waitOauthPage();
79
- await oauthPage.denyAccess();
80
- });
81
- }
81
+ test(`Authorize with a ${FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_PROVIDER} OAuth and deny access`, async function (): Promise<void> {
82
+ await oauthPage.login();
83
+ await oauthPage.waitOauthPage();
84
+ await oauthPage.denyAccess();
85
+ });
82
86
 
83
87
  test('Obtain workspace name from workspace loader page', async function (): Promise<void> {
84
88
  await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage();
@@ -96,29 +100,31 @@ suite(
96
100
  await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
97
101
  });
98
102
 
99
- test('Check if a project folder has been created', async function (): Promise<void> {
100
- testRepoProjectName = StringUtil.getProjectNameFromGitUrl(FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_REPO_URL);
101
- projectSection = await projectAndFileTests.getProjectViewSession();
102
- expect(await projectAndFileTests.getProjectTreeItem(projectSection, testRepoProjectName), 'Project folder was not imported').not
103
- .undefined;
104
- });
105
-
106
- test('Accept the project as a trusted one', async function (): Promise<void> {
107
- await projectAndFileTests.performTrustAuthorDialog();
108
- });
109
-
110
103
  if (FACTORY_TEST_CONSTANTS.TS_SELENIUM_IS_PRIVATE_FACTORY_GIT_REPO) {
111
- test('Check that project can not be cloned', async function (): Promise<void> {
112
- await driverHelper.waitVisibility(webCheCodeLocators.Dialog.message);
113
- const workspaceDoesNotExistDialog: ModalDialog = new ModalDialog();
114
- const message: string = await workspaceDoesNotExistDialog.getMessage();
115
- expect(message).contains('space does not exist');
104
+ test('Check that a project folder has not been cloned', async function (): Promise<void> {
105
+ testRepoProjectName = StringUtil.getProjectNameFromGitUrl(FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_REPO_URL);
106
+ await driverHelper.waitVisibility(webCheCodeLocators.ScmView.multiProviderItem);
107
+ await projectAndFileTests.performTrustAuthorDialog();
108
+ const isProjectFolderUnable: string = await driverHelper.waitAndGetElementAttribute(
109
+ (webCheCodeLocators.TreeItem as any).projectFolderItem,
110
+ 'aria-label'
111
+ );
112
+ expect(isProjectFolderUnable).to.contain(
113
+ '/projects/' + testRepoProjectName + ' • Unable to resolve workspace folder (Unable to resolve nonexistent file'
114
+ );
115
+ });
116
+ } else {
117
+ test('Check if a project folder has been created', async function (): Promise<void> {
118
+ testRepoProjectName = StringUtil.getProjectNameFromGitUrl(FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_REPO_URL);
119
+ projectSection = await projectAndFileTests.getProjectViewSession();
120
+ expect(await projectAndFileTests.getProjectTreeItem(projectSection, testRepoProjectName), 'Project folder was not imported')
121
+ .not.undefined;
116
122
  });
117
123
 
118
- test('Check that project files were not imported', async function (): Promise<void> {
119
- expect(await projectAndFileTests.getProjectTreeItem(projectSection, label), 'Project files were found').to.be.undefined;
124
+ test('Accept the project as a trusted one', async function (): Promise<void> {
125
+ await projectAndFileTests.performTrustAuthorDialog();
120
126
  });
121
- } else {
127
+
122
128
  test('Check if the project files were imported', async function (): Promise<void> {
123
129
  expect(await projectAndFileTests.getProjectTreeItem(projectSection, label), 'Project files were not imported').not
124
130
  .undefined;
@@ -142,7 +148,6 @@ suite(
142
148
  await sourceControl.openView();
143
149
  const scmView: NewScmView = new NewScmView();
144
150
  await driverHelper.waitVisibility(webCheCodeLocators.ScmView.inputField);
145
- let rest: SingleScmProvider[];
146
151
  [scmProvider, ...rest] = await scmView.getProviders();
147
152
  Logger.debug(`scmView.getProviders: "${JSON.stringify(scmProvider)}, ${rest}"`);
148
153
  });
@@ -232,15 +237,17 @@ suite(
232
237
  });
233
238
  }
234
239
 
235
- test('Stop the workspace', async function (): Promise<void> {
236
- await workspaceHandlingTests.stopWorkspace(WorkspaceHandlingTests.getWorkspaceName());
240
+ suiteTeardown('Open dashboard and close all other tabs', async function (): Promise<void> {
241
+ await dashboard.openDashboard();
237
242
  await browserTabsUtil.closeAllTabsExceptCurrent();
238
243
  });
239
244
 
240
- test('Delete the workspace', async function (): Promise<void> {
241
- await workspaceHandlingTests.removeWorkspace(WorkspaceHandlingTests.getWorkspaceName());
245
+ suiteTeardown('Stop and delete the workspace by API', async function (): Promise<void> {
246
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(WorkspaceHandlingTests.getWorkspaceName());
242
247
  });
243
248
 
244
- loginTests.logoutFromChe();
249
+ suiteTeardown('Unregister running workspace', function (): void {
250
+ registerRunningWorkspace('');
251
+ });
245
252
  }
246
253
  );
@@ -9,7 +9,7 @@
9
9
  **********************************************************************/
10
10
  import { e2eContainer } from '../../configs/inversify.config';
11
11
  import { ViewSection } from 'monaco-page-objects';
12
- import { CLASSES } from '../../configs/inversify.types';
12
+ import { CLASSES, TYPES } from '../../configs/inversify.types';
13
13
  import { expect } from 'chai';
14
14
  import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests';
15
15
  import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests';
@@ -19,6 +19,7 @@ import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil';
19
19
  import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
20
20
  import { Dashboard } from '../../pageobjects/dashboard/Dashboard';
21
21
  import { FACTORY_TEST_CONSTANTS } from '../../constants/FACTORY_TEST_CONSTANTS';
22
+ import { ITestWorkspaceUtil } from '../../utils/workspace/ITestWorkspaceUtil';
22
23
 
23
24
  const stackName: string = BASE_TEST_CONSTANTS.TS_SELENIUM_DASHBOARD_SAMPLE_NAME || 'Python';
24
25
  const projectName: string = FACTORY_TEST_CONSTANTS.TS_SELENIUM_PROJECT_NAME || 'python-hello-world';
@@ -29,10 +30,14 @@ suite(`"Start workspace with existed workspace name" test ${BASE_TEST_CONSTANTS.
29
30
  const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests);
30
31
  const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil);
31
32
  const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard);
33
+ const testWorkspaceUtil: ITestWorkspaceUtil = e2eContainer.get(TYPES.WorkspaceUtil);
34
+
32
35
  let projectSection: ViewSection;
33
36
  let existedWorkspaceName: string;
34
37
 
35
- loginTests.loginIntoChe();
38
+ suiteSetup('Login', async function (): Promise<void> {
39
+ await loginTests.loginIntoChe();
40
+ });
36
41
 
37
42
  test(`Create and open new workspace, stack:${stackName}`, async function (): Promise<void> {
38
43
  await workspaceHandlingTests.createAndOpenWorkspace(stackName);
@@ -76,15 +81,17 @@ suite(`"Start workspace with existed workspace name" test ${BASE_TEST_CONSTANTS.
76
81
  ).not.undefined;
77
82
  });
78
83
 
79
- test(`Stop all created ${stackName} workspaces`, async function (): Promise<void> {
80
- await workspaceHandlingTests.stopWorkspace(WorkspaceHandlingTests.getWorkspaceName());
84
+ suiteTeardown('Open dashboard and close all other tabs', async function (): Promise<void> {
85
+ await dashboard.openDashboard();
81
86
  await browserTabsUtil.closeAllTabsExceptCurrent();
82
87
  });
83
88
 
84
- test(`Delete all created ${stackName} workspaces`, async function (): Promise<void> {
85
- await workspaceHandlingTests.removeWorkspace(WorkspaceHandlingTests.getWorkspaceName());
86
- await workspaceHandlingTests.removeWorkspace(existedWorkspaceName);
89
+ suiteTeardown(`Stop and delete all created ${stackName} workspaces by API`, async function (): Promise<void> {
90
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(WorkspaceHandlingTests.getWorkspaceName());
91
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(existedWorkspaceName);
87
92
  });
88
93
 
89
- loginTests.logoutFromChe();
94
+ suiteTeardown('Unregister running workspace', function (): void {
95
+ registerRunningWorkspace('');
96
+ });
90
97
  });
@@ -9,7 +9,7 @@
9
9
  **********************************************************************/
10
10
  import { ViewSection } from 'monaco-page-objects';
11
11
  import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests';
12
- import { CLASSES } from '../../configs/inversify.types';
12
+ import { CLASSES, TYPES } from '../../configs/inversify.types';
13
13
  import { e2eContainer } from '../../configs/inversify.config';
14
14
  import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests';
15
15
  import { registerRunningWorkspace } from '../MochaHooks';
@@ -19,6 +19,8 @@ import { expect } from 'chai';
19
19
  import { KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor';
20
20
  import { ShellString } from 'shelljs';
21
21
  import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
22
+ import { ITestWorkspaceUtil } from '../../utils/workspace/ITestWorkspaceUtil';
23
+ import { Dashboard } from '../../pageobjects/dashboard/Dashboard';
22
24
 
23
25
  suite(
24
26
  `Check possibility to manage containers within a workspace with kubedock and podman ${BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`,
@@ -27,6 +29,9 @@ suite(
27
29
  const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests);
28
30
  const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests);
29
31
  const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil);
32
+ const testWorkspaceUtil: ITestWorkspaceUtil = e2eContainer.get(TYPES.WorkspaceUtil);
33
+ const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard);
34
+
30
35
  let kubernetesCommandLineToolsExecutor: KubernetesCommandLineToolsExecutor;
31
36
  let workspaceName: string = '';
32
37
 
@@ -48,7 +53,9 @@ suite(
48
53
 
49
54
  const factoryUrl: string = 'https://github.com/l0rd/dockerfile-hello-world';
50
55
 
51
- loginTests.loginIntoChe();
56
+ suiteSetup('Login', async function (): Promise<void> {
57
+ await loginTests.loginIntoChe();
58
+ });
52
59
 
53
60
  test(`Create and open new workspace from factory:${factoryUrl}`, async function (): Promise<void> {
54
61
  await workspaceHandlingTests.createAndOpenWorkspaceFromGitRepository(factoryUrl);
@@ -82,15 +89,17 @@ suite(
82
89
  expect(output, 'Podman test script failed').contains('Hello from Kubedock!');
83
90
  });
84
91
 
85
- test('Stop the workspace', async function (): Promise<void> {
86
- await workspaceHandlingTests.stopWorkspace(workspaceName);
92
+ suiteTeardown('Open dashboard and close all other tabs', async function (): Promise<void> {
93
+ await dashboard.openDashboard();
87
94
  await browserTabsUtil.closeAllTabsExceptCurrent();
88
95
  });
89
96
 
90
- test('Delete the workspace', async function (): Promise<void> {
91
- await workspaceHandlingTests.removeWorkspace(workspaceName);
97
+ suiteTeardown('Stop and delete the workspace by API', async function (): Promise<void> {
98
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(WorkspaceHandlingTests.getWorkspaceName());
92
99
  });
93
100
 
94
- loginTests.logoutFromChe();
101
+ suiteTeardown('Unregister running workspace', function (): void {
102
+ registerRunningWorkspace('');
103
+ });
95
104
  }
96
105
  );
@@ -9,7 +9,7 @@
9
9
  **********************************************************************/
10
10
  import { e2eContainer } from '../../configs/inversify.config';
11
11
  import { expect } from 'chai';
12
- import { CLASSES } from '../../configs/inversify.types';
12
+ import { CLASSES, TYPES } from '../../configs/inversify.types';
13
13
  import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests';
14
14
  import { Logger } from '../../utils/Logger';
15
15
  import { LoginTests } from '../../tests-library/LoginTests';
@@ -17,25 +17,33 @@ import { registerRunningWorkspace } from '../MochaHooks';
17
17
  import { KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor';
18
18
  import { ShellExecutor } from '../../utils/ShellExecutor';
19
19
  import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
20
+ import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil';
21
+ import { Dashboard } from '../../pageobjects/dashboard/Dashboard';
22
+ import { OAUTH_CONSTANTS } from '../../constants/OAUTH_CONSTANTS';
23
+ import { ITestWorkspaceUtil } from '../../utils/workspace/ITestWorkspaceUtil';
20
24
 
21
25
  suite(`Create predefined workspace and check it ${BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function (): void {
22
26
  const predefinedNamespaceName: string = 'predefined-ns';
23
27
  const stackName: string = 'Empty Workspace';
28
+ const userName: string = 'user';
24
29
 
30
+ const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil);
31
+ const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard);
25
32
  const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests);
26
33
  const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests);
27
34
  const kubernetesCommandLineToolsExecutor: KubernetesCommandLineToolsExecutor = e2eContainer.get(
28
35
  CLASSES.KubernetesCommandLineToolsExecutor
29
36
  );
30
37
  const shellExecutor: ShellExecutor = e2eContainer.get(CLASSES.ShellExecutor);
38
+ const testWorkspaceUtil: ITestWorkspaceUtil = e2eContainer.get(TYPES.WorkspaceUtil);
31
39
 
32
40
  suiteSetup(function (): void {
33
41
  // create a predefined namespace for user using shell script and login into user dashboard
34
- Logger.info('Test prerequisites:');
35
- Logger.info(
42
+ Logger.debug('Test prerequisites:');
43
+ Logger.debug(
36
44
  ' (1) there is OCP user with username and user password that have been set in the TS_SELENIUM_OCP_USERNAME and TS_SELENIUM_OCP_PASSWORD variables'
37
45
  );
38
- Logger.info(' (2) "oc" client installed and logged into test OCP cluster with admin rights.');
46
+ Logger.debug(' (2) "oc" client installed and logged into test OCP cluster with admin rights.');
39
47
  kubernetesCommandLineToolsExecutor.loginToOcp('admin');
40
48
  const predefinedProjectConfiguration: string =
41
49
  'kind: Namespace\n' +
@@ -52,17 +60,18 @@ suite(`Create predefined workspace and check it ${BASE_TEST_CONSTANTS.TEST_ENVIR
52
60
  shellExecutor.executeCommand(setEditRightsForUser);
53
61
  });
54
62
 
55
- suiteTeardown(function (): void {
56
- const workspaceName: string = WorkspaceHandlingTests.getWorkspaceName();
57
- try {
58
- kubernetesCommandLineToolsExecutor.deleteDevWorkspace();
59
- kubernetesCommandLineToolsExecutor.deleteProject(predefinedNamespaceName);
60
- } catch (e) {
61
- Logger.error(`Cannot remove the predefined project: ${workspaceName}, please fix it manually: ${e}`);
63
+ suiteSetup('Login', async function (): Promise<void> {
64
+ if (OAUTH_CONSTANTS.TS_SELENIUM_OCP_USERNAME === userName) {
65
+ await loginTests.loginIntoChe();
66
+ } else {
67
+ try {
68
+ await loginTests.logoutFromChe();
69
+ } catch (e) {
70
+ Logger.trace('user was not logged in.');
71
+ }
72
+ await loginTests.loginIntoChe(userName);
62
73
  }
63
74
  });
64
-
65
- loginTests.loginIntoChe('user');
66
75
  // create the Empty workspace using CHE Dashboard
67
76
  test(`Create and open new workspace, stack:${stackName}`, async function (): Promise<void> {
68
77
  await workspaceHandlingTests.createAndOpenWorkspace(stackName);
@@ -81,5 +90,33 @@ suite(`Create predefined workspace and check it ${BASE_TEST_CONSTANTS.TEST_ENVIR
81
90
  expect(ocDevWorkspaceOutput).includes(workspaceName);
82
91
  });
83
92
 
84
- loginTests.logoutFromChe();
93
+ suiteTeardown(function (): void {
94
+ const workspaceName: string = WorkspaceHandlingTests.getWorkspaceName();
95
+ try {
96
+ kubernetesCommandLineToolsExecutor.deleteDevWorkspace();
97
+ kubernetesCommandLineToolsExecutor.deleteProject(predefinedNamespaceName);
98
+ } catch (e) {
99
+ Logger.error(`Cannot remove the predefined project: ${workspaceName}, please fix it manually: ${e}`);
100
+ }
101
+ });
102
+
103
+ suiteTeardown('Re-login with test user', async function (): Promise<void> {
104
+ if (OAUTH_CONSTANTS.TS_SELENIUM_OCP_USERNAME !== userName) {
105
+ await loginTests.logoutFromChe();
106
+ await loginTests.loginIntoChe();
107
+ }
108
+ });
109
+
110
+ suiteTeardown('Open dashboard and close all other tabs', async function (): Promise<void> {
111
+ await dashboard.openDashboard();
112
+ await browserTabsUtil.closeAllTabsExceptCurrent();
113
+ });
114
+
115
+ suiteTeardown('Stop and delete the workspace by API', async function (): Promise<void> {
116
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(WorkspaceHandlingTests.getWorkspaceName());
117
+ });
118
+
119
+ suiteTeardown('Unregister running workspace', function (): void {
120
+ registerRunningWorkspace('');
121
+ });
85
122
  });
@@ -8,7 +8,7 @@
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  **********************************************************************/
10
10
  import { e2eContainer } from '../../configs/inversify.config';
11
- import { CLASSES } from '../../configs/inversify.types';
11
+ import { CLASSES, TYPES } from '../../configs/inversify.types';
12
12
  import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests';
13
13
  import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests';
14
14
  import { LoginTests } from '../../tests-library/LoginTests';
@@ -22,6 +22,8 @@ import { Locators, ModalDialog } from 'monaco-page-objects';
22
22
  import { expect } from 'chai';
23
23
  import { KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor';
24
24
  import { ShellExecutor } from '../../utils/ShellExecutor';
25
+ import { ITestWorkspaceUtil } from '../../utils/workspace/ITestWorkspaceUtil';
26
+ import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil';
25
27
 
26
28
  suite('"Check workspace idle timeout" test', function (): void {
27
29
  const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests);
@@ -36,6 +38,8 @@ suite('"Check workspace idle timeout" test', function (): void {
36
38
  CLASSES.KubernetesCommandLineToolsExecutor
37
39
  );
38
40
  const shellExecutor: ShellExecutor = e2eContainer.get(CLASSES.ShellExecutor);
41
+ const testWorkspaceUtil: ITestWorkspaceUtil = e2eContainer.get(TYPES.WorkspaceUtil);
42
+ const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil);
39
43
 
40
44
  const stackName: string = 'Empty Workspace';
41
45
  const cheClusterName: string = 'devspaces';
@@ -65,7 +69,9 @@ suite('"Check workspace idle timeout" test', function (): void {
65
69
  );
66
70
  });
67
71
 
68
- loginTests.loginIntoChe();
72
+ suiteSetup('Login', async function (): Promise<void> {
73
+ await loginTests.loginIntoChe();
74
+ });
69
75
 
70
76
  test(`Create and open new workspace, stack:${stackName}`, async function (): Promise<void> {
71
77
  await workspaceHandlingTests.createAndOpenWorkspace(stackName);
@@ -85,14 +91,21 @@ suite('"Check workspace idle timeout" test', function (): void {
85
91
  await dialog.pushButton('Return to dashboard');
86
92
  });
87
93
 
88
- test('Check that the workskpace has Stopped state', async function (): Promise<void> {
94
+ test('Check that the workspace has Stopped state', async function (): Promise<void> {
89
95
  await dashboard.waitPage();
90
96
  await workspaces.waitWorkspaceWithStoppedStatus(WorkspaceHandlingTests.getWorkspaceName());
91
97
  });
92
98
 
93
- test('Delete the workspace', async function (): Promise<void> {
94
- await dashboard.deleteStoppedWorkspaceByUI(WorkspaceHandlingTests.getWorkspaceName());
99
+ suiteTeardown('Open dashboard and close all other tabs', async function (): Promise<void> {
100
+ await dashboard.openDashboard();
101
+ await browserTabsUtil.closeAllTabsExceptCurrent();
102
+ });
103
+
104
+ suiteTeardown('Stop and delete the workspace by API', async function (): Promise<void> {
105
+ await testWorkspaceUtil.deleteWorkspaceByName(WorkspaceHandlingTests.getWorkspaceName());
95
106
  });
96
107
 
97
- loginTests.logoutFromChe();
108
+ suiteTeardown('Unregister running workspace', function (): void {
109
+ registerRunningWorkspace('');
110
+ });
98
111
  });
@@ -41,7 +41,9 @@ suite(`Workspace using a parent test suite ${BASE_TEST_CONSTANTS.TEST_ENVIRONMEN
41
41
  kubernetesCommandLineToolsExecutor.loginToOcp();
42
42
  });
43
43
 
44
- loginTests.loginIntoChe();
44
+ suiteSetup('Login', async function (): Promise<void> {
45
+ await loginTests.loginIntoChe();
46
+ });
45
47
 
46
48
  test('Create a workspace using a parent', async function (): Promise<void> {
47
49
  const factoryUrl: string = `${BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL}/dashboard/#https://github.com/testsfactory/parentDevfile`;
@@ -98,10 +100,13 @@ suite(`Workspace using a parent test suite ${BASE_TEST_CONSTANTS.TEST_ENVIRONMEN
98
100
  expect(envList).contains('DEVFILE_ENV_VAR=true').and.contains('PARENT_ENV_VAR=true');
99
101
  });
100
102
 
101
- test('Stop and delete the workspace by API', async function (): Promise<void> {
103
+ suiteTeardown('Stop and delete the workspace by API', async function (): Promise<void> {
104
+ await dashboard.openDashboard();
102
105
  await browserTabsUtil.closeAllTabsExceptCurrent();
103
- testWorkspaceUtil.stopAndDeleteWorkspaceByName(WorkspaceHandlingTests.getWorkspaceName());
106
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(WorkspaceHandlingTests.getWorkspaceName());
104
107
  });
105
108
 
106
- loginTests.logoutFromChe();
109
+ suiteTeardown('Unregister running workspace', function (): void {
110
+ registerRunningWorkspace('');
111
+ });
107
112
  });
@@ -12,10 +12,22 @@ import { e2eContainer } from '../../configs/inversify.config';
12
12
  import { LoginTests } from '../../tests-library/LoginTests';
13
13
  import { OcpMainPage } from '../../pageobjects/openshift/OcpMainPage';
14
14
  import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
15
+ import { KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor';
16
+ import { ShellExecutor } from '../../utils/ShellExecutor';
17
+ import { expect } from 'chai';
15
18
 
16
19
  suite(`Login to Openshift console and start WebTerminal ${BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function (): void {
17
20
  const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests);
18
21
  const ocpMainPage: OcpMainPage = e2eContainer.get(CLASSES.OcpMainPage);
22
+ const kubernetesCommandLineToolsExecutor: KubernetesCommandLineToolsExecutor = e2eContainer.get(
23
+ CLASSES.KubernetesCommandLineToolsExecutor
24
+ );
25
+ const shellExecutor: ShellExecutor = e2eContainer.get(CLASSES.ShellExecutor);
26
+
27
+ suiteSetup(function (): void {
28
+ kubernetesCommandLineToolsExecutor.loginToOcp('admin');
29
+ shellExecutor.executeCommand('oc project openshift-operators');
30
+ });
19
31
 
20
32
  loginTests.loginIntoOcpConsole();
21
33
 
@@ -23,4 +35,25 @@ suite(`Login to Openshift console and start WebTerminal ${BASE_TEST_CONSTANTS.TE
23
35
  await ocpMainPage.waitOpenMainPage();
24
36
  await ocpMainPage.openWebTerminal();
25
37
  });
38
+
39
+ test('Check username is correct', function (): void {
40
+ const userUid: string = shellExecutor.executeCommand('oc get user $(oc whoami) -o jsonpath={.metadata.uid}').replace(/\n/g, '');
41
+
42
+ // label selector for Web Terminal workspaces owned by the currently-logged in user
43
+ const labelSelector: string = 'console.openshift.io/terminal=true,controller.devfile.io/creator=' + userUid;
44
+ // namespace of this users web terminal
45
+ const namespace: string = shellExecutor.executeCommand(
46
+ `oc get dw -A -l ${labelSelector} -o jsonpath='{.items[0].metadata.namespace}'`
47
+ );
48
+ // devWorkspace ID for this users web terminal
49
+ const termDwId: string = shellExecutor.executeCommand(
50
+ `oc get dw -A -l ${labelSelector} -o jsonpath='{.items[0].status.devworkspaceId}'`
51
+ );
52
+ // use oc exec to run oc whoami inside this user's terminal
53
+ const user: string = shellExecutor
54
+ .executeCommand(`oc exec -n ${namespace} deploy/${termDwId} -c web-terminal-tooling -- oc whoami`)
55
+ .replace(/\n/g, '');
56
+ // above should output current user's username:
57
+ expect(user).to.equal(shellExecutor.executeCommand('oc whoami').replace(/\n/g, ''));
58
+ });
26
59
  });
@@ -0,0 +1,10 @@
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
+ **********************************************************************/
10
+ import '../../specs/api/DevfileAcceptanceTestAPI.spec';
@@ -12,5 +12,5 @@ import '../../specs/dashboard-samples/RecommendedExtensions.spec';
12
12
  import '../../specs/dashboard-samples/Documentation.spec';
13
13
  import '../../specs/devconsole-intergration/DevConsoleIntegration.spec';
14
14
  import '../../specs/miscellaneous/CreateWorkspaceWithExistedName.spec';
15
- import '../../specs/miscellaneous/PredefinedNamespace.spec';
16
15
  import '../../specs/miscellaneous/WorkspaceWithParent.spec';
16
+ import '../../specs/miscellaneous/PredefinedNamespace.spec';
@@ -15,5 +15,5 @@ import '../../specs/dashboard-samples/Documentation.spec';
15
15
  import '../../specs/devconsole-intergration/DevConsoleIntegration.spec';
16
16
  import '../../specs/miscellaneous/CreateWorkspaceWithExistedName.spec';
17
17
  import '../../specs/miscellaneous/KubedockPodmanTest.spec';
18
- import '../../specs/miscellaneous/PredefinedNamespace.spec';
19
18
  import '../../specs/miscellaneous/WorkspaceWithParent.spec';
19
+ import '../../specs/miscellaneous/PredefinedNamespace.spec';
@@ -15,7 +15,8 @@ import { inject, injectable } from 'inversify';
15
15
  import { Dashboard } from '../pageobjects/dashboard/Dashboard';
16
16
  import { IOcpLoginPage } from '../pageobjects/login/interfaces/IOcpLoginPage';
17
17
  import { BASE_TEST_CONSTANTS } from '../constants/BASE_TEST_CONSTANTS';
18
- import { registerRunningWorkspace } from '../specs/MochaHooks';
18
+ import { TIMEOUT_CONSTANTS } from '../constants/TIMEOUT_CONSTANTS';
19
+ import { Logger } from '../utils/Logger';
19
20
 
20
21
  @injectable()
21
22
  export class LoginTests {
@@ -28,30 +29,39 @@ export class LoginTests {
28
29
  @inject(CLASSES.Dashboard) private readonly dashboard: Dashboard
29
30
  ) {}
30
31
 
31
- loginIntoChe(userName?: string, password?: string): void {
32
- test('Login', async (): Promise<void> => {
32
+ async loginIntoChe(
33
+ userName?: string,
34
+ password?: string,
35
+ timeout: number = TIMEOUT_CONSTANTS.TS_COMMON_DASHBOARD_WAIT_TIMEOUT
36
+ ): Promise<void> {
37
+ Logger.debug();
38
+ try {
33
39
  if (!(await this.browserTabsUtil.getCurrentUrl()).includes(BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL)) {
34
40
  await this.browserTabsUtil.navigateTo(BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL);
35
41
  }
42
+ await this.dashboard.waitPage(timeout);
43
+ Logger.debug('user already logged in');
44
+ } catch (e) {
45
+ Logger.debug('try to login into application');
36
46
  await this.productLoginPage.login(userName, password);
37
47
  await this.browserTabsUtil.maximize();
38
48
  await this.dashboard.waitStartingPageLoaderDisappearance();
39
- });
49
+ }
40
50
  }
41
51
 
42
52
  loginIntoOcpConsole(): void {
43
- test('Login into ocp console', async (): Promise<void> => {
44
- const openshiftConsoleUrl: string = BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL.replace('devspaces', 'console-openshift-console');
53
+ suiteSetup('Login into ocp console', async (): Promise<void> => {
54
+ const openshiftConsoleUrl: string = BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL.replace(
55
+ BASE_TEST_CONSTANTS.TESTING_APPLICATION_NAME(),
56
+ 'console-openshift-console'
57
+ );
45
58
  await this.browserTabsUtil.navigateTo(openshiftConsoleUrl);
46
59
  await this.ocpLoginPage.login();
47
60
  await this.browserTabsUtil.maximize();
48
61
  });
49
62
  }
50
63
 
51
- logoutFromChe(): void {
52
- test('Logout', async (): Promise<void> => {
53
- await this.dashboard.logout();
54
- registerRunningWorkspace('');
55
- });
64
+ async logoutFromChe(): Promise<void> {
65
+ await this.dashboard.logout();
56
66
  }
57
67
  }
@@ -46,12 +46,6 @@ export class ProjectAndFileTests {
46
46
  Logger.debug();
47
47
  // sometimes the trust dialog does not appear at first time, for avoiding this problem we send click event for activating
48
48
  const workbench: Workbench = new Workbench();
49
- await workbench.click();
50
-
51
- await this.driverHelper.waitAndClick(
52
- this.cheCodeLocatorLoader.webCheCodeLocators.WelcomeContent.button,
53
- TIMEOUT_CONSTANTS.TS_DIALOG_WINDOW_DEFAULT_TIMEOUT
54
- );
55
49
 
56
50
  try {
57
51
  await workbench.click();
@@ -42,12 +42,8 @@ export class WorkspaceHandlingTests {
42
42
  return WorkspaceHandlingTests.workspaceName;
43
43
  }
44
44
 
45
- setWindowHandle(guid: string): void {
46
- WorkspaceHandlingTests.parentGUID = guid;
47
- }
48
-
49
- getWindowHandle(): string {
50
- return WorkspaceHandlingTests.parentGUID;
45
+ static clearWorkspaceName(): void {
46
+ WorkspaceHandlingTests.workspaceName = 'undefined';
51
47
  }
52
48
 
53
49
  async createAndOpenWorkspace(stack: string): Promise<void> {
package/tsconfig.json CHANGED
@@ -13,5 +13,5 @@
13
13
  "noImplicitReturns": false,
14
14
  "sourceMap": true
15
15
  },
16
- "include": [".eslintrc.js", "**/*.ts", "**/**/*.ts"]
16
+ "include": [".eslintrc.js", "**/*.ts", "**/**/*.ts", "**/reporters.config.js"]
17
17
  }