@eclipse-che/che-e2e 7.105.0 → 7.106.0-next-2338445

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 (37) hide show
  1. package/configs/inversify.config.ts +8 -0
  2. package/configs/inversify.types.ts +5 -1
  3. package/constants/TIMEOUT_CONSTANTS.ts +6 -0
  4. package/dist/configs/inversify.config.js +8 -0
  5. package/dist/configs/inversify.config.js.map +1 -1
  6. package/dist/configs/inversify.types.js +5 -1
  7. package/dist/configs/inversify.types.js.map +1 -1
  8. package/dist/constants/TIMEOUT_CONSTANTS.js +4 -0
  9. package/dist/constants/TIMEOUT_CONSTANTS.js.map +1 -1
  10. package/dist/driver/ChromeDriver.js +5 -1
  11. package/dist/driver/ChromeDriver.js.map +1 -1
  12. package/dist/index.js +4 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/pageobjects/ide/CommandPalette.js +117 -0
  15. package/dist/pageobjects/ide/CommandPalette.js.map +1 -0
  16. package/dist/pageobjects/ide/ExplorerView.js +108 -0
  17. package/dist/pageobjects/ide/ExplorerView.js.map +1 -0
  18. package/dist/pageobjects/ide/ExtensionsView.js +162 -0
  19. package/dist/pageobjects/ide/ExtensionsView.js.map +1 -0
  20. package/dist/pageobjects/ide/NotificationHandler.js +83 -0
  21. package/dist/pageobjects/ide/NotificationHandler.js.map +1 -0
  22. package/dist/pageobjects/ide/ViewsMoreActionsButton.js +9 -0
  23. package/dist/pageobjects/ide/ViewsMoreActionsButton.js.map +1 -1
  24. package/dist/specs/miscellaneous/VsixInstallationDisableTest.spec.js +205 -0
  25. package/dist/specs/miscellaneous/VsixInstallationDisableTest.spec.js.map +1 -0
  26. package/driver/ChromeDriver.ts +5 -1
  27. package/index.ts +4 -0
  28. package/package.json +2 -3
  29. package/pageobjects/ide/CommandPalette.ts +114 -0
  30. package/pageobjects/ide/ExplorerView.ts +106 -0
  31. package/pageobjects/ide/ExtensionsView.ts +167 -0
  32. package/pageobjects/ide/NotificationHandler.ts +70 -0
  33. package/pageobjects/ide/ViewsMoreActionsButton.ts +11 -0
  34. package/resources/configmap-disable-vsix-installation.yaml +22 -0
  35. package/resources/configmap-enable-vsix-installation.yaml +22 -0
  36. package/resources/default-extensions-configmap.yaml +12 -0
  37. package/specs/miscellaneous/VsixInstallationDisableTest.spec.ts +243 -0
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var NotificationHandler_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.NotificationHandler = void 0;
17
+ /** *******************************************************************
18
+ * copyright (c) 2025 Red Hat, Inc.
19
+ *
20
+ * This program and the accompanying materials are made
21
+ * available under the terms of the Eclipse Public License 2.0
22
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
23
+ *
24
+ * SPDX-License-Identifier: EPL-2.0
25
+ **********************************************************************/
26
+ const inversify_1 = require("inversify");
27
+ const inversify_types_1 = require("../../configs/inversify.types");
28
+ const selenium_webdriver_1 = require("selenium-webdriver");
29
+ const DriverHelper_1 = require("../../utils/DriverHelper");
30
+ const Logger_1 = require("../../utils/Logger");
31
+ const TIMEOUT_CONSTANTS_1 = require("../../constants/TIMEOUT_CONSTANTS");
32
+ let NotificationHandler = NotificationHandler_1 = class NotificationHandler {
33
+ constructor(driverHelper) {
34
+ this.driverHelper = driverHelper;
35
+ }
36
+ /**
37
+ * check for notifications containing specific text
38
+ */
39
+ async checkForNotification(expectedText, timeoutMs = TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_NOTIFICATION_WAIT_TIMEOUT) {
40
+ Logger_1.Logger.debug(`Checking for notification containing: "${expectedText}"`);
41
+ const startTime = Date.now();
42
+ if (await this.findInExistingNotifications(expectedText)) {
43
+ return true;
44
+ }
45
+ while (Date.now() - startTime < timeoutMs) {
46
+ if (await this.findInExistingNotifications(expectedText)) {
47
+ return true;
48
+ }
49
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
50
+ }
51
+ Logger_1.Logger.debug(`Notification containing "${expectedText}" not found after ${timeoutMs}ms`);
52
+ return false;
53
+ }
54
+ async findInExistingNotifications(expectedText) {
55
+ try {
56
+ const elements = await this.driverHelper.getDriver().findElements(NotificationHandler_1.NOTIFICATION_MESSAGE);
57
+ for (const element of elements) {
58
+ try {
59
+ const text = await element.getText();
60
+ if (text && text.toLowerCase().includes(expectedText.toLowerCase())) {
61
+ Logger_1.Logger.debug(`Found matching notification: "${text}"`);
62
+ return true;
63
+ }
64
+ }
65
+ catch (err) {
66
+ // continue to next element
67
+ }
68
+ }
69
+ }
70
+ catch (err) {
71
+ // no notifications found
72
+ }
73
+ return false;
74
+ }
75
+ };
76
+ NotificationHandler.NOTIFICATION_MESSAGE = selenium_webdriver_1.By.css('.notification-list-item-message');
77
+ NotificationHandler = NotificationHandler_1 = __decorate([
78
+ (0, inversify_1.injectable)(),
79
+ __param(0, (0, inversify_1.inject)(inversify_types_1.CLASSES.DriverHelper)),
80
+ __metadata("design:paramtypes", [DriverHelper_1.DriverHelper])
81
+ ], NotificationHandler);
82
+ exports.NotificationHandler = NotificationHandler;
83
+ //# sourceMappingURL=NotificationHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationHandler.js","sourceRoot":"","sources":["../../../pageobjects/ide/NotificationHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;wEAQwE;AACxE,yCAA+C;AAC/C,mEAAwD;AACxD,2DAAwC;AACxC,2DAAwD;AACxD,+CAA4C;AAC5C,yEAAsE;AAI/D,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAG/B,YAEkB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IACzC,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,YAAoB,EAAE,YAAoB,qCAAiB,CAAC,4BAA4B;QAClH,eAAM,CAAC,KAAK,CAAC,0CAA0C,YAAY,GAAG,CAAC,CAAC;QAExE,MAAM,SAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAErC,IAAI,MAAM,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE;YACzD,OAAO,IAAI,CAAC;SACZ;QAED,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE;YAC1C,IAAI,MAAM,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE;gBACzD,OAAO,IAAI,CAAC;aACZ;YACD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,qCAAiB,CAAC,2BAA2B,CAAC,CAAC;SAC5E;QAED,eAAM,CAAC,KAAK,CAAC,4BAA4B,YAAY,qBAAqB,SAAS,IAAI,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,2BAA2B,CAAC,YAAoB;QAC7D,IAAI;YACH,MAAM,QAAQ,GAAiB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,qBAAmB,CAAC,oBAAoB,CAAC,CAAC;YAE1H,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC/B,IAAI;oBACH,MAAM,IAAI,GAAW,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,EAAE;wBACpE,eAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,GAAG,CAAC,CAAC;wBACvD,OAAO,IAAI,CAAC;qBACZ;iBACD;gBAAC,OAAO,GAAG,EAAE;oBACb,2BAA2B;iBAC3B;aACD;SACD;QAAC,OAAO,GAAG,EAAE;YACb,yBAAyB;SACzB;QACD,OAAO,KAAK,CAAC;IACd,CAAC;;AAjDuB,wCAAoB,GAAO,uBAAE,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AADjF,mBAAmB;IAD/B,IAAA,sBAAU,GAAE;IAKV,WAAA,IAAA,kBAAM,EAAC,yBAAO,CAAC,YAAY,CAAC,CAAA;qCACE,2BAAY;GALhC,mBAAmB,CAmD/B;AAnDY,kDAAmB"}
@@ -53,6 +53,15 @@ let ViewsMoreActionsButton = ViewsMoreActionsButton_1 = class ViewsMoreActionsBu
53
53
  const viewsActionsButton = await this.driverHelper.waitVisibilityBoolean(ViewsMoreActionsButton_1.VIEWS_AND_MORE_ACTIONS_BUTTON, timeout);
54
54
  return viewsActionsButton;
55
55
  }
56
+ async clickViewsMoreActionsButton() {
57
+ Logger_1.Logger.debug();
58
+ await this.driverHelper.waitAndClick(ViewsMoreActionsButton_1.VIEWS_AND_MORE_ACTIONS_BUTTON);
59
+ }
60
+ async waitForContextMenu() {
61
+ const cheCodeLocatorLoader = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.CheCodeLocatorLoader);
62
+ const webCheCodeLocators = cheCodeLocatorLoader.webCheCodeLocators;
63
+ await this.driverHelper.waitVisibility(webCheCodeLocators.ContextMenu.contextView);
64
+ }
56
65
  };
57
66
  ViewsMoreActionsButton.VIEWS_AND_MORE_ACTIONS_BUTTON = selenium_webdriver_1.By.xpath('//a[@aria-label="Views and More Actions..."]');
58
67
  ViewsMoreActionsButton = ViewsMoreActionsButton_1 = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsMoreActionsButton.js","sourceRoot":"","sources":["../../../pageobjects/ide/ViewsMoreActionsButton.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;wEAQwE;AACxE,yCAA+C;AAC/C,4BAA0B;AAC1B,qEAA8D;AAC9D,mEAAwD;AACxD,2DAAwC;AACxC,2DAAwD;AACxD,+CAA4C;AAC5C,yEAAsE;AAEtE,6DAA2F;AAGpF,IAAM,sBAAsB,8BAA5B,MAAM,sBAAsB;IAGlC,YAEU,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IACjC,CAAC;IAEJ,KAAK,CAAC,uBAAuB;QAC5B,eAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,oBAAoB,GAAyB,+BAAY,CAAC,GAAG,CAAC,yBAAO,CAAC,oBAAoB,CAAC,CAAC;QAClG,MAAM,kBAAkB,GAAa,oBAAoB,CAAC,kBAAkB,CAAC;QAE7E,MAAM,OAAO,GAAe,IAAI,gCAAU,EAAE,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,GAAwB,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAExE,eAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAgB,MAAM,WAAW,CAAC,eAAe,EAAE,CAAC;QACxE,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACnF,eAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC/C,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,kCAAkC,CAAC,UAAkB,qCAAiB,CAAC,iCAAiC;QAC7G,eAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,kBAAkB,GAAY,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAChF,wBAAsB,CAAC,6BAA6B,EACpD,OAAO,CACP,CAAC;QAEF,OAAO,kBAAkB,CAAC;IAC3B,CAAC;;AAhCuB,oDAA6B,GAAO,uBAAE,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AADzG,sBAAsB;IADlC,IAAA,sBAAU,GAAE;IAKV,WAAA,IAAA,kBAAM,EAAC,yBAAO,CAAC,YAAY,CAAC,CAAA;qCACN,2BAAY;GALxB,sBAAsB,CAkClC;AAlCY,wDAAsB"}
1
+ {"version":3,"file":"ViewsMoreActionsButton.js","sourceRoot":"","sources":["../../../pageobjects/ide/ViewsMoreActionsButton.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;wEAQwE;AACxE,yCAA+C;AAC/C,4BAA0B;AAC1B,qEAA8D;AAC9D,mEAAwD;AACxD,2DAAwC;AACxC,2DAAwD;AACxD,+CAA4C;AAC5C,yEAAsE;AAEtE,6DAA2F;AAGpF,IAAM,sBAAsB,8BAA5B,MAAM,sBAAsB;IAGlC,YAEU,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IACjC,CAAC;IAEJ,KAAK,CAAC,uBAAuB;QAC5B,eAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,oBAAoB,GAAyB,+BAAY,CAAC,GAAG,CAAC,yBAAO,CAAC,oBAAoB,CAAC,CAAC;QAClG,MAAM,kBAAkB,GAAa,oBAAoB,CAAC,kBAAkB,CAAC;QAE7E,MAAM,OAAO,GAAe,IAAI,gCAAU,EAAE,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,GAAwB,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAExE,eAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAgB,MAAM,WAAW,CAAC,eAAe,EAAE,CAAC;QACxE,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACnF,eAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC/C,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,kCAAkC,CAAC,UAAkB,qCAAiB,CAAC,iCAAiC;QAC7G,eAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,kBAAkB,GAAY,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAChF,wBAAsB,CAAC,6BAA6B,EACpD,OAAO,CACP,CAAC;QAEF,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,2BAA2B;QAChC,eAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,wBAAsB,CAAC,6BAA6B,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,kBAAkB;QACvB,MAAM,oBAAoB,GAAyB,+BAAY,CAAC,GAAG,CAAC,yBAAO,CAAC,oBAAoB,CAAC,CAAC;QAClG,MAAM,kBAAkB,GAAa,oBAAoB,CAAC,kBAAkB,CAAC;QAC7E,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACpF,CAAC;;AA3CuB,oDAA6B,GAAO,uBAAE,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AADzG,sBAAsB;IADlC,IAAA,sBAAU,GAAE;IAKV,WAAA,IAAA,kBAAM,EAAC,yBAAO,CAAC,YAAY,CAAC,CAAA;qCACN,2BAAY;GALxB,sBAAsB,CA6ClC;AA7CY,wDAAsB"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /** *******************************************************************
3
+ * copyright (c) 2025 Red Hat, Inc.
4
+ *
5
+ * This program and the accompanying materials are made
6
+ * available under the terms of the Eclipse Public License 2.0
7
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
8
+ *
9
+ * SPDX-License-Identifier: EPL-2.0
10
+ **********************************************************************/
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ require("reflect-metadata");
36
+ const inversify_config_1 = require("../../configs/inversify.config");
37
+ const inversify_types_1 = require("../../configs/inversify.types");
38
+ const chai_1 = require("chai");
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const WorkspaceHandlingTests_1 = require("../../tests-library/WorkspaceHandlingTests");
42
+ const MochaHooks_1 = require("../MochaHooks");
43
+ const BASE_TEST_CONSTANTS_1 = require("../../constants/BASE_TEST_CONSTANTS");
44
+ const Logger_1 = require("../../utils/Logger");
45
+ suite(`Verify VSIX installation can be disabled via configuration ${BASE_TEST_CONSTANTS_1.BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function () {
46
+ const workspaceHandlingTests = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.WorkspaceHandlingTests);
47
+ const projectAndFileTests = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.ProjectAndFileTests);
48
+ const loginTests = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.LoginTests);
49
+ const kubernetesCommandLineToolsExecutor = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.KubernetesCommandLineToolsExecutor);
50
+ const shellExecutor = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.ShellExecutor);
51
+ const testWorkspaceUtil = inversify_config_1.e2eContainer.get(inversify_types_1.TYPES.WorkspaceUtil);
52
+ const dashboard = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.Dashboard);
53
+ const driverHelper = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.DriverHelper);
54
+ const browserTabsUtil = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.BrowserTabsUtil);
55
+ const notificationHandler = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.NotificationHandler);
56
+ const commandPalette = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.CommandPalette);
57
+ const extensionsView = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.ExtensionsView);
58
+ const explorerView = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.ExplorerView);
59
+ const TEST_REPO_URL = 'https://github.com/crw-qe/web-nodejs-sample-with-disabled-vsix/tree/install-from-vsix-disabled-7-100';
60
+ const RESOURCES_PATH = path.join(__dirname, '../../../resources');
61
+ const DEFAULT_EXTENSIONS = ['YAML'];
62
+ const VSIX_FILE_NAME = 'redhat.vscode-yaml-1.17.0.vsix';
63
+ const CONFIG_MAP_NAMES = {
64
+ VSIX_CONFIG: 'vscode-editor-configurations',
65
+ DEFAULT_EXTENSIONS: 'default-extensions'
66
+ };
67
+ const CONFIG_MAP_NAMESPACES = {
68
+ VSIX_CONFIG: 'openshift-devspaces',
69
+ DEFAULT_EXTENSIONS: 'admin-devspaces'
70
+ };
71
+ const CONFIG_FILES = {
72
+ DISABLE_VSIX: 'configmap-disable-vsix-installation.yaml',
73
+ ENABLE_VSIX: 'configmap-enable-vsix-installation.yaml',
74
+ DEFAULT_EXTENSIONS: 'default-extensions-configmap.yaml'
75
+ };
76
+ let workspaceName = '';
77
+ function applyConfigMap(configFileName) {
78
+ const configPath = path.join(RESOURCES_PATH, configFileName);
79
+ const configContent = fs.readFileSync(configPath, 'utf8');
80
+ shellExecutor.executeCommand(`oc apply -f - <<EOF\n${configContent}\nEOF`);
81
+ }
82
+ function cleanupConfigMaps() {
83
+ Logger_1.Logger.debug(`Deleting ConfigMap ${CONFIG_MAP_NAMES.VSIX_CONFIG} from namespace ${CONFIG_MAP_NAMESPACES.VSIX_CONFIG}`);
84
+ shellExecutor.executeCommand(`oc delete configmap ${CONFIG_MAP_NAMES.VSIX_CONFIG} -n ${CONFIG_MAP_NAMESPACES.VSIX_CONFIG} --ignore-not-found=true`);
85
+ Logger_1.Logger.debug(`Deleting ConfigMap ${CONFIG_MAP_NAMES.DEFAULT_EXTENSIONS} from namespace ${CONFIG_MAP_NAMESPACES.DEFAULT_EXTENSIONS}`);
86
+ shellExecutor.executeCommand(`oc delete configmap ${CONFIG_MAP_NAMES.DEFAULT_EXTENSIONS} -n ${CONFIG_MAP_NAMESPACES.DEFAULT_EXTENSIONS} --ignore-not-found=true`);
87
+ }
88
+ // ========== Test Execution ==========
89
+ suiteSetup('Login to cluster and setup initial state', function () {
90
+ kubernetesCommandLineToolsExecutor.loginToOcp();
91
+ cleanupConfigMaps();
92
+ });
93
+ suiteSetup('Login to application', async function () {
94
+ await loginTests.loginIntoChe();
95
+ });
96
+ test('Apply ConfigMaps that disable VSIX and set default extensions', function () {
97
+ applyConfigMap(CONFIG_FILES.DISABLE_VSIX);
98
+ applyConfigMap(CONFIG_FILES.DEFAULT_EXTENSIONS);
99
+ });
100
+ test('Create and open workspace from Git repository', async function () {
101
+ await workspaceHandlingTests.createAndOpenWorkspaceFromGitRepository(TEST_REPO_URL);
102
+ await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage();
103
+ workspaceName = WorkspaceHandlingTests_1.WorkspaceHandlingTests.getWorkspaceName();
104
+ (0, MochaHooks_1.registerRunningWorkspace)(workspaceName);
105
+ });
106
+ test('Wait workspace readiness', async function () {
107
+ await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
108
+ });
109
+ test('Verify VSIX disabled notifications', async function () {
110
+ const hasDisableNotification = await notificationHandler.checkForNotification('install from vsix command is disabled');
111
+ (0, chai_1.expect)(hasDisableNotification).to.be.true;
112
+ });
113
+ test('Perform trust author dialog', async function () {
114
+ await projectAndFileTests.performTrustAuthorDialog();
115
+ });
116
+ test('Verify VSIX installation is disabled in UI and extensions are not installed', async function () {
117
+ // check Command Palette
118
+ await commandPalette.openCommandPalette();
119
+ await commandPalette.searchCommand('Install from VSIX');
120
+ const commandAvailable = await commandPalette.isCommandVisible('Extensions: Install from VSIX...');
121
+ await commandPalette.closeCommandPalette();
122
+ (0, chai_1.expect)(commandAvailable).to.equal(false, 'Command Palette should not contain Install from VSIX command');
123
+ // check Extensions view menu
124
+ await extensionsView.openExtensionsView();
125
+ await extensionsView.openMoreActionsMenu();
126
+ const extensionMenuAvailable = await extensionsView.isMoreActionsMenuItemVisible('Install from VSIX');
127
+ await extensionsView.closeMoreActionsMenu();
128
+ (0, chai_1.expect)(extensionMenuAvailable).to.equal(false, 'Extensions view should not contain Install from VSIX action');
129
+ // check Explorer context menu
130
+ await explorerView.openFileContextMenu(VSIX_FILE_NAME);
131
+ const contextMenuAvailable = await explorerView.isContextMenuItemVisible('Install Extension VSIX');
132
+ await explorerView.closeContextMenu();
133
+ (0, chai_1.expect)(contextMenuAvailable).to.equal(false, 'Explorer context menu should not contain Install Extension VSIX action');
134
+ // verify default extensions are not auto-installed
135
+ await extensionsView.openExtensionsView();
136
+ const installedExtensions = await extensionsView.getInstalledExtensionNames();
137
+ Logger_1.Logger.debug(`Found installed extensions: ${installedExtensions.join(', ')}`);
138
+ for (const extensionName of DEFAULT_EXTENSIONS) {
139
+ const isInstalled = installedExtensions.some((installed) => installed.toLowerCase().includes(extensionName.toLowerCase()));
140
+ (0, chai_1.expect)(isInstalled).to.equal(false, `Default VSIX extension "${extensionName}" should not be auto-installed`);
141
+ }
142
+ });
143
+ test('Enable VSIX installation and create new workspace', async function () {
144
+ // clean up current workspace
145
+ await dashboard.openDashboard();
146
+ await testWorkspaceUtil.deleteWorkspaceByName(workspaceName);
147
+ (0, MochaHooks_1.registerRunningWorkspace)('');
148
+ // apply ConfigMaps that enable VSIX and set default extensions
149
+ applyConfigMap(CONFIG_FILES.ENABLE_VSIX);
150
+ applyConfigMap(CONFIG_FILES.DEFAULT_EXTENSIONS);
151
+ Logger_1.Logger.info('Waiting for new ConfigMap settings to take effect...');
152
+ await driverHelper.wait(30000);
153
+ // create new workspace
154
+ await workspaceHandlingTests.createAndOpenWorkspaceFromGitRepository(TEST_REPO_URL);
155
+ await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage();
156
+ workspaceName = WorkspaceHandlingTests_1.WorkspaceHandlingTests.getWorkspaceName();
157
+ (0, MochaHooks_1.registerRunningWorkspace)(workspaceName);
158
+ });
159
+ test('Wait workspace readiness', async function () {
160
+ await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
161
+ });
162
+ test('Verify default extension installation success notifications', async function () {
163
+ const hasSuccessNotification = await notificationHandler.checkForNotification('Completed installing extension');
164
+ (0, chai_1.expect)(hasSuccessNotification).to.be.true;
165
+ });
166
+ test('Perform trust author dialog', async function () {
167
+ await projectAndFileTests.performTrustAuthorDialog();
168
+ });
169
+ test('Verify VSIX installation is enabled in UI and extensions are installed', async function () {
170
+ // check Command Palette
171
+ await commandPalette.openCommandPalette();
172
+ await commandPalette.searchCommand('Install from VSIX');
173
+ const commandAvailable = await commandPalette.isCommandVisible('Extensions: Install from VSIX...');
174
+ await commandPalette.closeCommandPalette();
175
+ (0, chai_1.expect)(commandAvailable).to.equal(true, 'Command Palette should contain Install from VSIX command');
176
+ // check Extensions view menu
177
+ await extensionsView.openExtensionsView();
178
+ await extensionsView.openMoreActionsMenu();
179
+ const extensionMenuAvailable = await extensionsView.isMoreActionsMenuItemVisible('Install from VSIX');
180
+ await extensionsView.closeMoreActionsMenu();
181
+ (0, chai_1.expect)(extensionMenuAvailable).to.equal(true, 'Extensions view should contain Install from VSIX action');
182
+ // check Explorer context menu
183
+ await explorerView.openFileContextMenu(VSIX_FILE_NAME);
184
+ const contextMenuAvailable = await explorerView.isContextMenuItemVisible('Install Extension VSIX');
185
+ await explorerView.closeContextMenu();
186
+ (0, chai_1.expect)(contextMenuAvailable).to.equal(true, 'Explorer context menu should contain Install Extension VSIX action');
187
+ // verify default extensions are auto-installed when VSIX enabled
188
+ await extensionsView.openExtensionsView();
189
+ const installedExtensions = await extensionsView.getInstalledExtensionNames();
190
+ Logger_1.Logger.debug(`Found installed extensions: ${installedExtensions.join(', ')}`);
191
+ for (const extensionName of DEFAULT_EXTENSIONS) {
192
+ const isInstalled = installedExtensions.some((installed) => installed.toLowerCase().includes(extensionName.toLowerCase()));
193
+ (0, chai_1.expect)(isInstalled).to.equal(true, `Default VSIX extension "${extensionName}" should be auto-installed`);
194
+ }
195
+ });
196
+ suiteTeardown('Clean up ConfigMaps and workspace', async function () {
197
+ cleanupConfigMaps();
198
+ await dashboard.openDashboard();
199
+ await browserTabsUtil.closeAllTabsExceptCurrent();
200
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(workspaceName);
201
+ (0, MochaHooks_1.registerRunningWorkspace)('');
202
+ Logger_1.Logger.info('Cleanup completed');
203
+ });
204
+ });
205
+ //# sourceMappingURL=VsixInstallationDisableTest.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VsixInstallationDisableTest.spec.js","sourceRoot":"","sources":["../../../specs/miscellaneous/VsixInstallationDisableTest.spec.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,11 @@ export class ChromeDriver implements IDriver {
36
36
  .addArguments('--no-sandbox')
37
37
  .addArguments('--disable-web-security')
38
38
  .addArguments('--allow-running-insecure-content')
39
- .addArguments('--ignore-certificate-errors');
39
+ .addArguments('--ignore-certificate-errors')
40
+ .addArguments('--enable-clipboard-read')
41
+ .addArguments('--enable-clipboard-write')
42
+ .addArguments('--deny-permission-prompts')
43
+ .addArguments('--disable-popup-blocking');
40
44
 
41
45
  // if 'true' run in 'headless' mode
42
46
  if (CHROME_DRIVER_CONSTANTS.TS_SELENIUM_HEADLESS) {
package/index.ts CHANGED
@@ -30,6 +30,10 @@ export * from './pageobjects/dashboard/Workspaces';
30
30
  export * from './pageobjects/dashboard/workspace-details/WorkspaceDetails';
31
31
  export * from './pageobjects/git-providers/OauthPage';
32
32
  export * from './pageobjects/ide/CheCodeLocatorLoader';
33
+ export * from './pageobjects/ide/CommandPalette';
34
+ export * from './pageobjects/ide/ExplorerView';
35
+ export * from './pageobjects/ide/ExtensionsView';
36
+ export * from './pageobjects/ide/NotificationHandler';
33
37
  export * from './pageobjects/ide/RestrictedModeButton';
34
38
  export * from './pageobjects/ide/ViewsMoreActionsButton';
35
39
  export * from './pageobjects/login/interfaces/ICheLoginPage';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-che/che-e2e",
3
- "version": "7.105.0",
3
+ "version": "7.106.0-next-2338445",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -66,8 +66,7 @@
66
66
  "dependencies": {
67
67
  "@eclipse-che/api": "latest",
68
68
  "inversify": "6.0.1",
69
- "reflect-metadata": "0.1.13",
70
- "@eclipse-che/che-devworkspace-generator": "7.105.0"
69
+ "reflect-metadata": "0.1.13"
71
70
  },
72
71
  "resolutions": {
73
72
  "minimist": "^1.2.5"
@@ -0,0 +1,114 @@
1
+ /** *******************************************************************
2
+ * copyright (c) 2025 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 { inject, injectable } from 'inversify';
11
+ import { CLASSES } from '../../configs/inversify.types';
12
+ import { By, Key, WebElement } from 'selenium-webdriver';
13
+ import { DriverHelper } from '../../utils/DriverHelper';
14
+ import { Logger } from '../../utils/Logger';
15
+ import { TIMEOUT_CONSTANTS } from '../../constants/TIMEOUT_CONSTANTS';
16
+
17
+ @injectable()
18
+ export class CommandPalette {
19
+ private static readonly COMMAND_PALETTE_CONTAINER: By = By.css('.quick-input-widget');
20
+ private static readonly COMMAND_PALETTE_LIST: By = By.css('#quickInput_list');
21
+ private static readonly COMMAND_PALETTE_ITEMS: By = By.css('#quickInput_list [role="option"]');
22
+
23
+ constructor(
24
+ @inject(CLASSES.DriverHelper)
25
+ private readonly driverHelper: DriverHelper
26
+ ) {}
27
+
28
+ /**
29
+ * open the Command Palette using keyboard shortcut
30
+ * tries F1 first, then Ctrl+Shift+P if needed
31
+ */
32
+ async openCommandPalette(): Promise<void> {
33
+ Logger.debug();
34
+
35
+ await this.driverHelper.getDriver().actions().keyDown(Key.F1).keyUp(Key.F1).perform();
36
+
37
+ const paletteVisible: boolean = await this.driverHelper.waitVisibilityBoolean(CommandPalette.COMMAND_PALETTE_CONTAINER);
38
+
39
+ if (!paletteVisible) {
40
+ await this.driverHelper
41
+ .getDriver()
42
+ .actions()
43
+ .keyDown(Key.CONTROL)
44
+ .keyDown(Key.SHIFT)
45
+ .sendKeys('p')
46
+ .keyUp(Key.SHIFT)
47
+ .keyUp(Key.CONTROL)
48
+ .perform();
49
+ }
50
+
51
+ await this.driverHelper.waitVisibility(CommandPalette.COMMAND_PALETTE_LIST);
52
+ }
53
+
54
+ /**
55
+ * search for a command in the Command Palette
56
+ *
57
+ * @param commandText Text to search for
58
+ */
59
+ async searchCommand(commandText: string): Promise<void> {
60
+ Logger.debug(`"${commandText}"`);
61
+
62
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
63
+ await this.driverHelper.getDriver().actions().sendKeys(commandText).perform();
64
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
65
+ }
66
+
67
+ /**
68
+ * get all visible commands in the Command Palette
69
+ *
70
+ * @returns Array of command texts
71
+ */
72
+ async getVisibleCommands(): Promise<string[]> {
73
+ Logger.debug();
74
+
75
+ const listVisible: boolean = await this.driverHelper.waitVisibilityBoolean(CommandPalette.COMMAND_PALETTE_LIST);
76
+
77
+ if (!listVisible) {
78
+ return [];
79
+ }
80
+
81
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
82
+ const items: WebElement[] = await this.driverHelper.getDriver().findElements(CommandPalette.COMMAND_PALETTE_ITEMS);
83
+ const itemTexts: string[] = [];
84
+
85
+ for (const item of items) {
86
+ try {
87
+ const ariaLabel: string = await item.getAttribute('aria-label');
88
+ if (ariaLabel) {
89
+ itemTexts.push(ariaLabel);
90
+ }
91
+ } catch (err) {
92
+ // skip items that cannot be read
93
+ }
94
+ }
95
+
96
+ return itemTexts;
97
+ }
98
+
99
+ async isCommandVisible(commandText: string): Promise<boolean> {
100
+ Logger.debug(`"${commandText}"`);
101
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
102
+
103
+ const availableCommands: string[] = await this.getVisibleCommands();
104
+ Logger.debug(`Available commands: ${availableCommands.join(', ')}`);
105
+ return availableCommands.some((command: string): boolean => command.toLowerCase().includes(commandText.toLowerCase()));
106
+ }
107
+
108
+ async closeCommandPalette(): Promise<void> {
109
+ Logger.debug();
110
+
111
+ await this.driverHelper.getDriver().actions().sendKeys(Key.ESCAPE).perform();
112
+ await this.driverHelper.waitDisappearance(CommandPalette.COMMAND_PALETTE_CONTAINER);
113
+ }
114
+ }
@@ -0,0 +1,106 @@
1
+ /** *******************************************************************
2
+ * copyright (c) 2025 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 { inject, injectable } from 'inversify';
11
+ import { CLASSES } from '../../configs/inversify.types';
12
+ import { By, Key } from 'selenium-webdriver';
13
+ import { ActivityBar, ViewControl, ViewItem, ViewSection } from 'monaco-page-objects';
14
+ import { DriverHelper } from '../../utils/DriverHelper';
15
+ import { Logger } from '../../utils/Logger';
16
+ import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests';
17
+ import { TIMEOUT_CONSTANTS } from '../../constants/TIMEOUT_CONSTANTS';
18
+
19
+ @injectable()
20
+ export class ExplorerView {
21
+ private static readonly CONTEXT_MENU_CONTAINER: By = By.css('.monaco-menu-container');
22
+ private static readonly CONTEXT_MENU_ITEMS: By = By.css('.monaco-menu-container .action-item');
23
+
24
+ constructor(
25
+ @inject(CLASSES.DriverHelper)
26
+ private readonly driverHelper: DriverHelper,
27
+ @inject(CLASSES.ProjectAndFileTests)
28
+ private readonly projectAndFileTests: ProjectAndFileTests
29
+ ) {}
30
+
31
+ async openExplorerView(): Promise<void> {
32
+ Logger.debug();
33
+
34
+ const explorerCtrl: ViewControl | undefined = await new ActivityBar().getViewControl('Explorer');
35
+ await explorerCtrl?.openView();
36
+ }
37
+
38
+ /**
39
+ * open the context menu for a file in the Explorer view
40
+ *
41
+ * @param fileName Name of the file to open context menu for
42
+ */
43
+ async openFileContextMenu(fileName: string): Promise<void> {
44
+ Logger.debug(`"${fileName}"`);
45
+
46
+ await this.openExplorerView();
47
+
48
+ const projectSection: ViewSection = await this.projectAndFileTests.getProjectViewSession();
49
+ const fileItem: ViewItem | undefined = await this.projectAndFileTests.getProjectTreeItem(projectSection, fileName);
50
+
51
+ if (!fileItem) {
52
+ throw new Error(`Could not find ${fileName} file in explorer`);
53
+ }
54
+
55
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
56
+
57
+ try {
58
+ await fileItem.openContextMenu();
59
+ await this.waitContextMenuVisible();
60
+ } catch (error) {
61
+ Logger.error(`Context menu failed for "${fileName}": ${error instanceof Error ? error.message : 'Unknown error'}`);
62
+ throw new Error(`Context menu failed to open for "${fileName}"`);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * check if a specific item is visible in the context menu
68
+ *
69
+ * @param menuItemAriaLabel Aria label of the menu item to check for
70
+ * @returns True if the item is visible
71
+ */
72
+ async isContextMenuItemVisible(menuItemAriaLabel: string): Promise<boolean> {
73
+ Logger.debug(`"${menuItemAriaLabel}"`);
74
+
75
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
76
+
77
+ const contextMenuItemLocator: By = By.css(`.monaco-menu-container [aria-label="${menuItemAriaLabel}"]`);
78
+ return await this.driverHelper.waitVisibilityBoolean(contextMenuItemLocator);
79
+ }
80
+
81
+ async closeContextMenu(): Promise<void> {
82
+ Logger.debug();
83
+
84
+ await this.driverHelper.getDriver().actions().sendKeys(Key.ESCAPE).perform();
85
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
86
+ await this.driverHelper.waitDisappearance(ExplorerView.CONTEXT_MENU_CONTAINER);
87
+ }
88
+
89
+ private async waitContextMenuVisible(): Promise<void> {
90
+ Logger.debug();
91
+
92
+ const containerVisible: boolean = await this.driverHelper.waitVisibilityBoolean(ExplorerView.CONTEXT_MENU_CONTAINER);
93
+
94
+ if (!containerVisible) {
95
+ throw new Error('Context menu container did not appear');
96
+ }
97
+
98
+ await this.driverHelper.wait(TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING);
99
+
100
+ const menuItemsVisible: boolean = await this.driverHelper.waitVisibilityBoolean(ExplorerView.CONTEXT_MENU_ITEMS);
101
+
102
+ if (!menuItemsVisible) {
103
+ throw new Error('Context menu items did not load properly');
104
+ }
105
+ }
106
+ }