@eclipse-che/che-e2e 7.87.0-next-b640f5c → 7.87.0
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.
|
@@ -20,6 +20,42 @@ const TIMEOUT_CONSTANTS_1 = require("../../constants/TIMEOUT_CONSTANTS");
|
|
|
20
20
|
const PLUGIN_TEST_CONSTANTS_1 = require("../../constants/PLUGIN_TEST_CONSTANTS");
|
|
21
21
|
const BASE_TEST_CONSTANTS_1 = require("../../constants/BASE_TEST_CONSTANTS");
|
|
22
22
|
const samples = PLUGIN_TEST_CONSTANTS_1.PLUGIN_TEST_CONSTANTS.TS_SAMPLE_LIST.split(',');
|
|
23
|
+
// get visible items from Extension view, transform this from array to sorted string and compares it with existed recommended extensions
|
|
24
|
+
async function getVisibleFilteredItemsAndCompareWithRecommended(recommendations) {
|
|
25
|
+
const extensionsView = await (await new monaco_page_objects_1.ActivityBar().getViewControl('Extensions'))?.openView();
|
|
26
|
+
const [marketplaceSection] = (await extensionsView?.getContent().getSections());
|
|
27
|
+
const sections = await extensionsView?.getContent().getSections();
|
|
28
|
+
// if we have a big recommender extension list it can be overlapped by other recommendations panel,
|
|
29
|
+
// in this case we need to collapse it for instance: it is actual for Quarkus example
|
|
30
|
+
if (sections !== undefined) {
|
|
31
|
+
for (let i = 0; i < sections.length; i++) {
|
|
32
|
+
const currentSection = sections[i];
|
|
33
|
+
const isOtherRecommendedSectionPresent = (await currentSection.getTitle()) === 'Other Recommendations';
|
|
34
|
+
const isOtherRecommendationExpanded = await sections[i].isExpanded();
|
|
35
|
+
if (isOtherRecommendedSectionPresent && isOtherRecommendationExpanded) {
|
|
36
|
+
await currentSection.collapse();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
Logger_1.Logger.debug('marketplaceSection.getVisibleItems()');
|
|
41
|
+
const allFoundRecommendedItems = await marketplaceSection.getVisibleItems();
|
|
42
|
+
const allFoundRecommendedAuthors = await Promise.all(allFoundRecommendedItems.map(async (item) => await item.getAuthor()));
|
|
43
|
+
const allFoundAuthorsAsSortedString = allFoundRecommendedAuthors.sort().toString();
|
|
44
|
+
const allPublisherNamesAsSorString = recommendations.sort().toString();
|
|
45
|
+
return allFoundAuthorsAsSortedString === allPublisherNamesAsSorString;
|
|
46
|
+
}
|
|
47
|
+
// get visible items from Extension view, transform this from array to sorted string and compares it with existed installed extensions
|
|
48
|
+
async function getVisibleFilteredItemsAndCompareWithInstalled(recommendations) {
|
|
49
|
+
const extensionsView = await (await new monaco_page_objects_1.ActivityBar().getViewControl('Extensions'))?.openView();
|
|
50
|
+
const [marketplaceSection] = (await extensionsView?.getContent().getSections());
|
|
51
|
+
Logger_1.Logger.debug('marketplaceSection.getVisibleItems()');
|
|
52
|
+
const allFoundRecommendedItems = await marketplaceSection.getVisibleItems();
|
|
53
|
+
const allFoundRecommendedAuthors = await Promise.all(allFoundRecommendedItems.map(async (item) => await item.getAuthor()));
|
|
54
|
+
const allFoundAuthorsAsSortedString = allFoundRecommendedAuthors.sort().toString();
|
|
55
|
+
const allPublisherNamesAsSortString = recommendations.sort().toString();
|
|
56
|
+
// in some cases we can have installed not only recommended extensions with some samples (for example .Net)
|
|
57
|
+
return allFoundAuthorsAsSortedString.includes(allPublisherNamesAsSortString);
|
|
58
|
+
}
|
|
23
59
|
for (const sample of samples) {
|
|
24
60
|
suite(`Check if recommended extensions installed for ${sample} ${BASE_TEST_CONSTANTS_1.BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function () {
|
|
25
61
|
const projectAndFileTests = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.ProjectAndFileTests);
|
|
@@ -34,10 +70,12 @@ for (const sample of samples) {
|
|
|
34
70
|
let projectSection;
|
|
35
71
|
let extensionSection;
|
|
36
72
|
let extensionsView;
|
|
73
|
+
let publisherNames;
|
|
37
74
|
const [pathToExtensionsListFileName, extensionsListFileName] = ['.vscode', 'extensions.json'];
|
|
38
75
|
let recommendedExtensions = {
|
|
39
76
|
recommendations: []
|
|
40
77
|
};
|
|
78
|
+
let parsedRecommendations;
|
|
41
79
|
suiteSetup('Login', async function () {
|
|
42
80
|
await loginTests.loginIntoChe();
|
|
43
81
|
});
|
|
@@ -55,6 +93,9 @@ for (const sample of samples) {
|
|
|
55
93
|
await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
|
|
56
94
|
});
|
|
57
95
|
test('Check the project files were imported', async function () {
|
|
96
|
+
// add TS_IDE_LOAD_TIMEOUT timeout for waiting for finishing animation of all IDE parts (Welcome parts. bottom widgets. etc.)
|
|
97
|
+
// using TS_IDE_LOAD_TIMEOUT easier than performing of finishing animation all elements
|
|
98
|
+
await driverHelper.wait(TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_IDE_LOAD_TIMEOUT);
|
|
58
99
|
projectSection = await projectAndFileTests.getProjectViewSession();
|
|
59
100
|
(0, chai_1.expect)(await projectAndFileTests.getProjectTreeItem(projectSection, pathToExtensionsListFileName), 'Files not imported').not
|
|
60
101
|
.undefined;
|
|
@@ -63,7 +104,14 @@ for (const sample of samples) {
|
|
|
63
104
|
await projectAndFileTests.performTrustAuthorDialog();
|
|
64
105
|
});
|
|
65
106
|
test(`Get recommended extensions list from ${extensionsListFileName}`, async function () {
|
|
66
|
-
|
|
107
|
+
// sometimes the Trust Dialog does not appear as expected - as result we need to execute "projectAndFileTests.performManageWorkspaceTrustBox()" method. In this case.
|
|
108
|
+
try {
|
|
109
|
+
await (await projectAndFileTests.getProjectTreeItem(projectSection, pathToExtensionsListFileName))?.select();
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
await projectAndFileTests.performManageWorkspaceTrustBox();
|
|
113
|
+
await (await projectAndFileTests.getProjectTreeItem(projectSection, pathToExtensionsListFileName))?.select();
|
|
114
|
+
}
|
|
67
115
|
await (await projectAndFileTests.getProjectTreeItem(projectSection, extensionsListFileName, 3))?.select();
|
|
68
116
|
Logger_1.Logger.debug(`EditorView().openEditor(${extensionsListFileName})`);
|
|
69
117
|
const editor = (await new monaco_page_objects_1.EditorView().openEditor(extensionsListFileName));
|
|
@@ -71,16 +119,24 @@ for (const sample of samples) {
|
|
|
71
119
|
Logger_1.Logger.debug('editor.getText(): get recommended extensions as text from editor, delete comments and parse to object.');
|
|
72
120
|
recommendedExtensions = JSON.parse((await editor.getText()).replace(/\/\*[\s\S]*?\*\/|(?<=[^:])\/\/.*|^\/\/.*/g, '').trim());
|
|
73
121
|
Logger_1.Logger.debug('recommendedExtensions.recommendations: Get recommendations clear names using map().');
|
|
74
|
-
|
|
75
|
-
const [publisher, name] =
|
|
122
|
+
parsedRecommendations = recommendedExtensions.recommendations.map((rec) => {
|
|
123
|
+
const [publisher, name] = rec.split('.');
|
|
76
124
|
return { publisher, name };
|
|
77
125
|
});
|
|
78
|
-
Logger_1.Logger.debug(`Recommended extension for this workspace:\n${JSON.stringify(
|
|
79
|
-
|
|
126
|
+
Logger_1.Logger.debug(`Recommended extension for this workspace:\n${JSON.stringify(parsedRecommendations)}.`);
|
|
127
|
+
publisherNames = parsedRecommendations.map((rec) => rec.publisher);
|
|
128
|
+
(0, chai_1.expect)(parsedRecommendations, 'Recommendations not found').not.empty;
|
|
80
129
|
});
|
|
81
130
|
test('Open "Extensions" view section', async function () {
|
|
82
131
|
Logger_1.Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): open Extensions view.');
|
|
83
|
-
|
|
132
|
+
// sometimes the Trust Dialog does not appear as expected - as result we need to execute "projectAndFileTests.performManageWorkspaceTrustBox()" method. In this case.
|
|
133
|
+
try {
|
|
134
|
+
extensionsView = await (await new monaco_page_objects_1.ActivityBar().getViewControl('Extensions'))?.openView();
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
await projectAndFileTests.performManageWorkspaceTrustBox();
|
|
138
|
+
extensionsView = await (await new monaco_page_objects_1.ActivityBar().getViewControl('Extensions'))?.openView();
|
|
139
|
+
}
|
|
84
140
|
(0, chai_1.expect)(extensionsView, 'Can`t find Extension section').not.undefined;
|
|
85
141
|
});
|
|
86
142
|
test('Let extensions complete installation', async function () {
|
|
@@ -90,65 +146,49 @@ for (const sample of samples) {
|
|
|
90
146
|
});
|
|
91
147
|
test('Check if extensions are installed and enabled', async function () {
|
|
92
148
|
// timeout 15 seconds per extensions
|
|
93
|
-
this.timeout(TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_FIND_EXTENSION_TEST_TIMEOUT *
|
|
149
|
+
this.timeout(TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_FIND_EXTENSION_TEST_TIMEOUT * parsedRecommendations.length);
|
|
94
150
|
Logger_1.Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): open Extensions view.');
|
|
95
151
|
extensionsView = await (await new monaco_page_objects_1.ActivityBar().getViewControl('Extensions'))?.openView();
|
|
96
152
|
Logger_1.Logger.debug('extensionsView?.getContent().getSections(): get current section.');
|
|
97
153
|
[extensionSection] = (await extensionsView?.getContent().getSections());
|
|
98
154
|
(0, chai_1.expect)(extensionSection, 'Can`t find Extension section').not.undefined;
|
|
99
155
|
await driverHelper.waitVisibility(webCheCodeLocators.ExtensionsViewSection.itemTitle, TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
await extensionSection.findItem(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
(0, chai_1.expect)(itemWithRightNameAndPublisher, `Extension ${extension.name} not found`).not.undefined;
|
|
135
|
-
}
|
|
136
|
-
Logger_1.Logger.debug('itemWithRightNameAndPublisher?.isInstalled()');
|
|
137
|
-
const isInstalled = (await itemWithRightNameAndPublisher?.isInstalled());
|
|
138
|
-
Logger_1.Logger.debug(`itemWithRightNameAndPublisher?.isInstalled(): ${isInstalled}.`);
|
|
139
|
-
(0, chai_1.expect)(isInstalled, `Extension ${extension.name} not installed`).to.be.true;
|
|
140
|
-
Logger_1.Logger.debug('itemWithRightNameAndPublisher.manage(): get context menu.');
|
|
141
|
-
const extensionManageMenu = await itemWithRightNameAndPublisher.manage();
|
|
142
|
-
Logger_1.Logger.debug('extensionManageMenu.getItems(): get menu items.');
|
|
143
|
-
const extensionMenuItems = await extensionManageMenu.getItems();
|
|
144
|
-
let extensionMenuItemLabels = '';
|
|
145
|
-
Logger_1.Logger.trace('extensionMenuItems -> item.getLabel(): get menu items names.');
|
|
146
|
-
for (const item of extensionMenuItems) {
|
|
147
|
-
extensionMenuItemLabels += (await item.getLabel()) + ' ';
|
|
148
|
-
}
|
|
149
|
-
Logger_1.Logger.debug(`extensionMenuItemLabels: ${extensionMenuItemLabels}.`);
|
|
150
|
-
(0, chai_1.expect)(extensionMenuItemLabels, `Extension ${extension.name} not enabled`).contains('Disable').and.not.contains('Enable');
|
|
156
|
+
Logger_1.Logger.debug('extensionSection.findItem by @recommended filter');
|
|
157
|
+
try {
|
|
158
|
+
await extensionSection.findItem('@recommended');
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
await driverHelper.wait(TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_EXPAND_PROJECT_TREE_ITEM_TIMEOUT);
|
|
162
|
+
await extensionSection.findItem('@recommended');
|
|
163
|
+
}
|
|
164
|
+
const isReloadRequired = await driverHelper.isVisible(webCheCodeLocators.ExtensionsViewSection.requireReloadButton);
|
|
165
|
+
Logger_1.Logger.debug(`Is extensions require reload the editor: ${isReloadRequired}`);
|
|
166
|
+
if (isReloadRequired) {
|
|
167
|
+
Logger_1.Logger.debug('Refreshing the page..');
|
|
168
|
+
await browserTabsUtil.refreshPage();
|
|
169
|
+
await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
|
|
170
|
+
await driverHelper.waitVisibility(webCheCodeLocators.ActivityBar.viewContainer, TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT);
|
|
171
|
+
Logger_1.Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): reopen Extensions view.');
|
|
172
|
+
extensionsView = await (await new monaco_page_objects_1.ActivityBar().getViewControl('Extensions'))?.openView();
|
|
173
|
+
await driverHelper.waitVisibility(webCheCodeLocators.ExtensionsViewSection.itemTitle, TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT);
|
|
174
|
+
(0, chai_1.expect)(extensionsView, 'Can`t find Extension View section').not.undefined;
|
|
175
|
+
[extensionSection] = (await extensionsView?.getContent().getSections());
|
|
176
|
+
(0, chai_1.expect)(extensionSection, 'Can`t find Extension section').not.undefined;
|
|
177
|
+
await extensionSection.findItem('@recommended ');
|
|
178
|
+
}
|
|
179
|
+
Logger_1.Logger.debug('extensionSection.findItem by @recommended filter');
|
|
180
|
+
(0, chai_1.expect)(await getVisibleFilteredItemsAndCompareWithRecommended(publisherNames)).to.be.true;
|
|
181
|
+
Logger_1.Logger.debug(`All recommended extensions were found by @recommended filter: ---- ${publisherNames} ----`);
|
|
182
|
+
Logger_1.Logger.debug('extensionSection.findItem by @installed filter');
|
|
183
|
+
try {
|
|
184
|
+
await extensionSection.findItem('@installed ');
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
await driverHelper.wait(TIMEOUT_CONSTANTS_1.TIMEOUT_CONSTANTS.TS_EXPAND_PROJECT_TREE_ITEM_TIMEOUT);
|
|
188
|
+
await extensionSection.findItem('@installed ');
|
|
151
189
|
}
|
|
190
|
+
(0, chai_1.expect)(await getVisibleFilteredItemsAndCompareWithInstalled(publisherNames)).to.be.true;
|
|
191
|
+
Logger_1.Logger.debug(`All recommended extensions were found by @installed filter: ---- ${publisherNames} ----`);
|
|
152
192
|
});
|
|
153
193
|
suiteTeardown('Open dashboard and close all other tabs', async function () {
|
|
154
194
|
await dashboard.openDashboard();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecommendedExtensions.spec.js","sourceRoot":"","sources":["../../../specs/dashboard-samples/RecommendedExtensions.spec.ts"],"names":[],"mappings":";AAAA;;;;;;;;wEAQwE;;AAExE,
|
|
1
|
+
{"version":3,"file":"RecommendedExtensions.spec.js","sourceRoot":"","sources":["../../../specs/dashboard-samples/RecommendedExtensions.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eclipse-che/che-e2e",
|
|
3
|
-
"version": "7.87.0
|
|
3
|
+
"version": "7.87.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -65,7 +65,8 @@
|
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@eclipse-che/api": "latest",
|
|
67
67
|
"inversify": "6.0.1",
|
|
68
|
-
"reflect-metadata": "0.1.13"
|
|
68
|
+
"reflect-metadata": "0.1.13",
|
|
69
|
+
"@eclipse-che/che-devworkspace-generator": "7.87.0"
|
|
69
70
|
},
|
|
70
71
|
"resolutions": {
|
|
71
72
|
"minimist": "^1.2.5"
|
|
@@ -10,8 +10,6 @@
|
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
12
|
ActivityBar,
|
|
13
|
-
ContextMenu,
|
|
14
|
-
ContextMenuItem,
|
|
15
13
|
EditorView,
|
|
16
14
|
ExtensionsViewItem,
|
|
17
15
|
ExtensionsViewSection,
|
|
@@ -39,6 +37,49 @@ import { Dashboard } from '../../pageobjects/dashboard/Dashboard';
|
|
|
39
37
|
|
|
40
38
|
const samples: string[] = PLUGIN_TEST_CONSTANTS.TS_SAMPLE_LIST.split(',');
|
|
41
39
|
|
|
40
|
+
// get visible items from Extension view, transform this from array to sorted string and compares it with existed recommended extensions
|
|
41
|
+
async function getVisibleFilteredItemsAndCompareWithRecommended(recommendations: string[]): Promise<boolean> {
|
|
42
|
+
const extensionsView: SideBarView | undefined = await (await new ActivityBar().getViewControl('Extensions'))?.openView();
|
|
43
|
+
const [marketplaceSection]: ExtensionsViewSection[] = (await extensionsView?.getContent().getSections()) as ExtensionsViewSection[];
|
|
44
|
+
const sections: ViewSection[] | undefined = await extensionsView?.getContent().getSections();
|
|
45
|
+
|
|
46
|
+
// if we have a big recommender extension list it can be overlapped by other recommendations panel,
|
|
47
|
+
// in this case we need to collapse it for instance: it is actual for Quarkus example
|
|
48
|
+
if (sections !== undefined) {
|
|
49
|
+
for (let i: number = 0; i < sections.length; i++) {
|
|
50
|
+
const currentSection: ViewSection = sections[i];
|
|
51
|
+
const isOtherRecommendedSectionPresent: boolean = (await currentSection.getTitle()) === 'Other Recommendations';
|
|
52
|
+
const isOtherRecommendationExpanded: boolean = await sections[i].isExpanded();
|
|
53
|
+
if (isOtherRecommendedSectionPresent && isOtherRecommendationExpanded) {
|
|
54
|
+
await currentSection.collapse();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
Logger.debug('marketplaceSection.getVisibleItems()');
|
|
59
|
+
const allFoundRecommendedItems: ExtensionsViewItem[] = await marketplaceSection.getVisibleItems();
|
|
60
|
+
const allFoundRecommendedAuthors: string[] = await Promise.all(
|
|
61
|
+
allFoundRecommendedItems.map(async (item: ExtensionsViewItem): Promise<string> => await item.getAuthor())
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const allFoundAuthorsAsSortedString: string = allFoundRecommendedAuthors.sort().toString();
|
|
65
|
+
const allPublisherNamesAsSorString: string = recommendations.sort().toString();
|
|
66
|
+
return allFoundAuthorsAsSortedString === allPublisherNamesAsSorString;
|
|
67
|
+
}
|
|
68
|
+
// get visible items from Extension view, transform this from array to sorted string and compares it with existed installed extensions
|
|
69
|
+
async function getVisibleFilteredItemsAndCompareWithInstalled(recommendations: string[]): Promise<boolean> {
|
|
70
|
+
const extensionsView: SideBarView | undefined = await (await new ActivityBar().getViewControl('Extensions'))?.openView();
|
|
71
|
+
const [marketplaceSection]: ExtensionsViewSection[] = (await extensionsView?.getContent().getSections()) as ExtensionsViewSection[];
|
|
72
|
+
Logger.debug('marketplaceSection.getVisibleItems()');
|
|
73
|
+
const allFoundRecommendedItems: ExtensionsViewItem[] = await marketplaceSection.getVisibleItems();
|
|
74
|
+
const allFoundRecommendedAuthors: string[] = await Promise.all(
|
|
75
|
+
allFoundRecommendedItems.map(async (item: ExtensionsViewItem): Promise<string> => await item.getAuthor())
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const allFoundAuthorsAsSortedString: string = allFoundRecommendedAuthors.sort().toString();
|
|
79
|
+
const allPublisherNamesAsSortString: string = recommendations.sort().toString();
|
|
80
|
+
// in some cases we can have installed not only recommended extensions with some samples (for example .Net)
|
|
81
|
+
return allFoundAuthorsAsSortedString.includes(allPublisherNamesAsSortString);
|
|
82
|
+
}
|
|
42
83
|
for (const sample of samples) {
|
|
43
84
|
suite(`Check if recommended extensions installed for ${sample} ${BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function (): void {
|
|
44
85
|
const projectAndFileTests: ProjectAndFileTests = e2eContainer.get(CLASSES.ProjectAndFileTests);
|
|
@@ -50,16 +91,18 @@ for (const sample of samples) {
|
|
|
50
91
|
const webCheCodeLocators: Locators = cheCodeLocatorLoader.webCheCodeLocators;
|
|
51
92
|
const testWorkspaceUtil: ITestWorkspaceUtil = e2eContainer.get(TYPES.WorkspaceUtil);
|
|
52
93
|
const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard);
|
|
53
|
-
|
|
54
94
|
let projectSection: ViewSection;
|
|
55
95
|
let extensionSection: ExtensionsViewSection;
|
|
56
96
|
let extensionsView: SideBarView | undefined;
|
|
97
|
+
let publisherNames: string[];
|
|
57
98
|
|
|
58
99
|
const [pathToExtensionsListFileName, extensionsListFileName]: string[] = ['.vscode', 'extensions.json'];
|
|
100
|
+
|
|
59
101
|
let recommendedExtensions: any = {
|
|
60
102
|
recommendations: []
|
|
61
103
|
};
|
|
62
104
|
|
|
105
|
+
let parsedRecommendations: Array<{ name: string; publisher: string }>;
|
|
63
106
|
suiteSetup('Login', async function (): Promise<void> {
|
|
64
107
|
await loginTests.loginIntoChe();
|
|
65
108
|
});
|
|
@@ -81,6 +124,9 @@ for (const sample of samples) {
|
|
|
81
124
|
});
|
|
82
125
|
|
|
83
126
|
test('Check the project files were imported', async function (): Promise<void> {
|
|
127
|
+
// add TS_IDE_LOAD_TIMEOUT timeout for waiting for finishing animation of all IDE parts (Welcome parts. bottom widgets. etc.)
|
|
128
|
+
// using TS_IDE_LOAD_TIMEOUT easier than performing of finishing animation all elements
|
|
129
|
+
await driverHelper.wait(TIMEOUT_CONSTANTS.TS_IDE_LOAD_TIMEOUT);
|
|
84
130
|
projectSection = await projectAndFileTests.getProjectViewSession();
|
|
85
131
|
expect(await projectAndFileTests.getProjectTreeItem(projectSection, pathToExtensionsListFileName), 'Files not imported').not
|
|
86
132
|
.undefined;
|
|
@@ -91,7 +137,13 @@ for (const sample of samples) {
|
|
|
91
137
|
});
|
|
92
138
|
|
|
93
139
|
test(`Get recommended extensions list from ${extensionsListFileName}`, async function (): Promise<void> {
|
|
94
|
-
|
|
140
|
+
// sometimes the Trust Dialog does not appear as expected - as result we need to execute "projectAndFileTests.performManageWorkspaceTrustBox()" method. In this case.
|
|
141
|
+
try {
|
|
142
|
+
await (await projectAndFileTests.getProjectTreeItem(projectSection, pathToExtensionsListFileName))?.select();
|
|
143
|
+
} catch (err) {
|
|
144
|
+
await projectAndFileTests.performManageWorkspaceTrustBox();
|
|
145
|
+
await (await projectAndFileTests.getProjectTreeItem(projectSection, pathToExtensionsListFileName))?.select();
|
|
146
|
+
}
|
|
95
147
|
await (await projectAndFileTests.getProjectTreeItem(projectSection, extensionsListFileName, 3))?.select();
|
|
96
148
|
Logger.debug(`EditorView().openEditor(${extensionsListFileName})`);
|
|
97
149
|
const editor: TextEditor = (await new EditorView().openEditor(extensionsListFileName)) as TextEditor;
|
|
@@ -99,19 +151,25 @@ for (const sample of samples) {
|
|
|
99
151
|
Logger.debug('editor.getText(): get recommended extensions as text from editor, delete comments and parse to object.');
|
|
100
152
|
recommendedExtensions = JSON.parse((await editor.getText()).replace(/\/\*[\s\S]*?\*\/|(?<=[^:])\/\/.*|^\/\/.*/g, '').trim());
|
|
101
153
|
Logger.debug('recommendedExtensions.recommendations: Get recommendations clear names using map().');
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
expect(
|
|
154
|
+
parsedRecommendations = recommendedExtensions.recommendations.map((rec: string): { name: string; publisher: string } => {
|
|
155
|
+
const [publisher, name] = rec.split('.');
|
|
156
|
+
return { publisher, name };
|
|
157
|
+
});
|
|
158
|
+
Logger.debug(`Recommended extension for this workspace:\n${JSON.stringify(parsedRecommendations)}.`);
|
|
159
|
+
|
|
160
|
+
publisherNames = parsedRecommendations.map((rec: { name: string; publisher: string }): string => rec.publisher);
|
|
161
|
+
expect(parsedRecommendations, 'Recommendations not found').not.empty;
|
|
110
162
|
});
|
|
111
163
|
|
|
112
164
|
test('Open "Extensions" view section', async function (): Promise<void> {
|
|
113
165
|
Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): open Extensions view.');
|
|
114
|
-
|
|
166
|
+
// sometimes the Trust Dialog does not appear as expected - as result we need to execute "projectAndFileTests.performManageWorkspaceTrustBox()" method. In this case.
|
|
167
|
+
try {
|
|
168
|
+
extensionsView = await (await new ActivityBar().getViewControl('Extensions'))?.openView();
|
|
169
|
+
} catch (err) {
|
|
170
|
+
await projectAndFileTests.performManageWorkspaceTrustBox();
|
|
171
|
+
extensionsView = await (await new ActivityBar().getViewControl('Extensions'))?.openView();
|
|
172
|
+
}
|
|
115
173
|
expect(extensionsView, 'Can`t find Extension section').not.undefined;
|
|
116
174
|
});
|
|
117
175
|
|
|
@@ -125,7 +183,7 @@ for (const sample of samples) {
|
|
|
125
183
|
|
|
126
184
|
test('Check if extensions are installed and enabled', async function (): Promise<void> {
|
|
127
185
|
// timeout 15 seconds per extensions
|
|
128
|
-
this.timeout(TIMEOUT_CONSTANTS.TS_FIND_EXTENSION_TEST_TIMEOUT *
|
|
186
|
+
this.timeout(TIMEOUT_CONSTANTS.TS_FIND_EXTENSION_TEST_TIMEOUT * parsedRecommendations.length);
|
|
129
187
|
Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): open Extensions view.');
|
|
130
188
|
extensionsView = await (await new ActivityBar().getViewControl('Extensions'))?.openView();
|
|
131
189
|
|
|
@@ -137,75 +195,51 @@ for (const sample of samples) {
|
|
|
137
195
|
TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT
|
|
138
196
|
);
|
|
139
197
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
await extensionSection.findItem(
|
|
198
|
+
Logger.debug('extensionSection.findItem by @recommended filter');
|
|
199
|
+
try {
|
|
200
|
+
await extensionSection.findItem('@recommended');
|
|
201
|
+
} catch (err) {
|
|
202
|
+
await driverHelper.wait(TIMEOUT_CONSTANTS.TS_EXPAND_PROJECT_TREE_ITEM_TIMEOUT);
|
|
203
|
+
await extensionSection.findItem('@recommended');
|
|
204
|
+
}
|
|
205
|
+
const isReloadRequired: boolean = await driverHelper.isVisible(
|
|
206
|
+
(webCheCodeLocators.ExtensionsViewSection as any).requireReloadButton
|
|
207
|
+
);
|
|
208
|
+
Logger.debug(`Is extensions require reload the editor: ${isReloadRequired}`);
|
|
143
209
|
|
|
144
|
-
|
|
145
|
-
|
|
210
|
+
if (isReloadRequired) {
|
|
211
|
+
Logger.debug('Refreshing the page..');
|
|
212
|
+
await browserTabsUtil.refreshPage();
|
|
213
|
+
await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
|
|
214
|
+
await driverHelper.waitVisibility(
|
|
215
|
+
webCheCodeLocators.ActivityBar.viewContainer,
|
|
216
|
+
TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT
|
|
146
217
|
);
|
|
147
|
-
Logger.debug(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
Logger.debug('extensionsView.getContent().getSections(): switch to marketplace section.');
|
|
171
|
-
const [marketplaceSection]: ExtensionsViewSection[] = (await extensionsView
|
|
172
|
-
?.getContent()
|
|
173
|
-
.getSections()) as ExtensionsViewSection[];
|
|
174
|
-
|
|
175
|
-
Logger.debug('marketplaceSection.getVisibleItems()');
|
|
176
|
-
const allFinedItems: ExtensionsViewItem[] = await marketplaceSection.getVisibleItems();
|
|
177
|
-
expect(allFinedItems, 'Extensions not found').not.empty;
|
|
178
|
-
let itemWithRightNameAndPublisher: ExtensionsViewItem | undefined = undefined;
|
|
179
|
-
for (const item of allFinedItems) {
|
|
180
|
-
Logger.debug(`Try to find extension published by ${extension.publisher}.`);
|
|
181
|
-
if ((await item.getAuthor()) === extension.publisher) {
|
|
182
|
-
itemWithRightNameAndPublisher = item;
|
|
183
|
-
Logger.debug(`Extension was found: ${await itemWithRightNameAndPublisher?.getTitle()}`);
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
186
|
-
expect(itemWithRightNameAndPublisher, `Extension ${extension.name} not found`).not.undefined;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
Logger.debug('itemWithRightNameAndPublisher?.isInstalled()');
|
|
190
|
-
const isInstalled: boolean = (await itemWithRightNameAndPublisher?.isInstalled()) as boolean;
|
|
191
|
-
|
|
192
|
-
Logger.debug(`itemWithRightNameAndPublisher?.isInstalled(): ${isInstalled}.`);
|
|
193
|
-
expect(isInstalled, `Extension ${extension.name} not installed`).to.be.true;
|
|
194
|
-
|
|
195
|
-
Logger.debug('itemWithRightNameAndPublisher.manage(): get context menu.');
|
|
196
|
-
const extensionManageMenu: ContextMenu = await (itemWithRightNameAndPublisher as ExtensionsViewItem).manage();
|
|
197
|
-
|
|
198
|
-
Logger.debug('extensionManageMenu.getItems(): get menu items.');
|
|
199
|
-
const extensionMenuItems: ContextMenuItem[] = await extensionManageMenu.getItems();
|
|
200
|
-
let extensionMenuItemLabels: string = '';
|
|
201
|
-
Logger.trace('extensionMenuItems -> item.getLabel(): get menu items names.');
|
|
202
|
-
for (const item of extensionMenuItems) {
|
|
203
|
-
extensionMenuItemLabels += (await item.getLabel()) + ' ';
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
Logger.debug(`extensionMenuItemLabels: ${extensionMenuItemLabels}.`);
|
|
207
|
-
expect(extensionMenuItemLabels, `Extension ${extension.name} not enabled`).contains('Disable').and.not.contains('Enable');
|
|
218
|
+
Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): reopen Extensions view.');
|
|
219
|
+
extensionsView = await (await new ActivityBar().getViewControl('Extensions'))?.openView();
|
|
220
|
+
await driverHelper.waitVisibility(
|
|
221
|
+
webCheCodeLocators.ExtensionsViewSection.itemTitle,
|
|
222
|
+
TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT
|
|
223
|
+
);
|
|
224
|
+
expect(extensionsView, 'Can`t find Extension View section').not.undefined;
|
|
225
|
+
[extensionSection] = (await extensionsView?.getContent().getSections()) as ExtensionsViewSection[];
|
|
226
|
+
expect(extensionSection, 'Can`t find Extension section').not.undefined;
|
|
227
|
+
await extensionSection.findItem('@recommended ');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
Logger.debug('extensionSection.findItem by @recommended filter');
|
|
231
|
+
expect(await getVisibleFilteredItemsAndCompareWithRecommended(publisherNames)).to.be.true;
|
|
232
|
+
Logger.debug(`All recommended extensions were found by @recommended filter: ---- ${publisherNames} ----`);
|
|
233
|
+
|
|
234
|
+
Logger.debug('extensionSection.findItem by @installed filter');
|
|
235
|
+
try {
|
|
236
|
+
await extensionSection.findItem('@installed ');
|
|
237
|
+
} catch (err) {
|
|
238
|
+
await driverHelper.wait(TIMEOUT_CONSTANTS.TS_EXPAND_PROJECT_TREE_ITEM_TIMEOUT);
|
|
239
|
+
await extensionSection.findItem('@installed ');
|
|
208
240
|
}
|
|
241
|
+
expect(await getVisibleFilteredItemsAndCompareWithInstalled(publisherNames)).to.be.true;
|
|
242
|
+
Logger.debug(`All recommended extensions were found by @installed filter: ---- ${publisherNames} ----`);
|
|
209
243
|
});
|
|
210
244
|
|
|
211
245
|
suiteTeardown('Open dashboard and close all other tabs', async function (): Promise<void> {
|