@theia/playwright 1.45.1 → 1.46.0-next.72

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 (164) hide show
  1. package/README.md +54 -54
  2. package/lib/index.d.ts +30 -30
  3. package/lib/index.js +57 -57
  4. package/lib/tests/fixtures/theia-fixture.d.ts +4 -0
  5. package/lib/tests/fixtures/theia-fixture.d.ts.map +1 -0
  6. package/lib/tests/fixtures/theia-fixture.js +24 -0
  7. package/lib/tests/fixtures/theia-fixture.js.map +1 -0
  8. package/lib/tests/theia-app.test.d.ts +1 -1
  9. package/lib/tests/theia-app.test.js +29 -29
  10. package/lib/tests/theia-application-shell.test.d.ts +2 -0
  11. package/lib/tests/theia-application-shell.test.d.ts.map +1 -0
  12. package/lib/tests/theia-application-shell.test.js +58 -0
  13. package/lib/tests/theia-application-shell.test.js.map +1 -0
  14. package/lib/tests/theia-explorer-view.test.d.ts +1 -1
  15. package/lib/tests/theia-explorer-view.test.js +183 -183
  16. package/lib/tests/theia-main-menu.test.d.ts +1 -1
  17. package/lib/tests/theia-main-menu.test.js +92 -92
  18. package/lib/tests/theia-output-view.test.d.ts +1 -1
  19. package/lib/tests/theia-output-view.test.js +78 -78
  20. package/lib/tests/theia-preference-view.test.d.ts +1 -1
  21. package/lib/tests/theia-preference-view.test.js +101 -101
  22. package/lib/tests/theia-problems-view.test.d.ts +1 -1
  23. package/lib/tests/theia-problems-view.test.js +54 -54
  24. package/lib/tests/theia-quick-command.test.d.ts +1 -1
  25. package/lib/tests/theia-quick-command.test.js +69 -69
  26. package/lib/tests/theia-sample-app.test.d.ts +1 -1
  27. package/lib/tests/theia-sample-app.test.js +57 -57
  28. package/lib/tests/theia-status-bar.test.d.ts +1 -1
  29. package/lib/tests/theia-status-bar.test.js +44 -44
  30. package/lib/tests/theia-terminal-view.test.d.ts +1 -1
  31. package/lib/tests/theia-terminal-view.test.js +78 -78
  32. package/lib/tests/theia-text-editor.test.d.ts +1 -1
  33. package/lib/tests/theia-text-editor.test.js +155 -155
  34. package/lib/tests/theia-toolbar.test.d.ts +1 -1
  35. package/lib/tests/theia-toolbar.test.js +61 -61
  36. package/lib/tests/theia-workspace.test.d.ts +1 -1
  37. package/lib/tests/theia-workspace.test.js +72 -72
  38. package/lib/theia-about-dialog.d.ts +4 -4
  39. package/lib/theia-about-dialog.js +26 -26
  40. package/lib/theia-app-loader.d.ts +19 -19
  41. package/lib/theia-app-loader.js +129 -129
  42. package/lib/theia-app.d.ts +50 -50
  43. package/lib/theia-app.js +153 -153
  44. package/lib/theia-context-menu.d.ts +8 -8
  45. package/lib/theia-context-menu.js +37 -37
  46. package/lib/theia-dialog.d.ts +28 -28
  47. package/lib/theia-dialog.js +99 -99
  48. package/lib/theia-editor.d.ts +9 -9
  49. package/lib/theia-editor.js +68 -68
  50. package/lib/theia-explorer-view.d.ts +47 -47
  51. package/lib/theia-explorer-view.js +273 -273
  52. package/lib/theia-main-menu.d.ts +12 -12
  53. package/lib/theia-main-menu.js +53 -53
  54. package/lib/theia-menu-item.d.ts +14 -14
  55. package/lib/theia-menu-item.js +66 -66
  56. package/lib/theia-menu.d.ts +16 -16
  57. package/lib/theia-menu.js +86 -86
  58. package/lib/theia-monaco-editor.d.ts +15 -15
  59. package/lib/theia-monaco-editor.js +75 -75
  60. package/lib/theia-notification-indicator.d.ts +7 -7
  61. package/lib/theia-notification-indicator.js +44 -44
  62. package/lib/theia-notification-overlay.d.ts +22 -22
  63. package/lib/theia-notification-overlay.js +79 -79
  64. package/lib/theia-output-channel.d.ts +24 -24
  65. package/lib/theia-output-channel.js +71 -71
  66. package/lib/theia-output-view.d.ts +9 -9
  67. package/lib/theia-output-view.js +81 -81
  68. package/lib/theia-page-object.d.ts +7 -7
  69. package/lib/theia-page-object.js +27 -27
  70. package/lib/theia-preference-view.d.ts +84 -84
  71. package/lib/theia-preference-view.js +209 -209
  72. package/lib/theia-problem-indicator.d.ts +8 -8
  73. package/lib/theia-problem-indicator.js +38 -38
  74. package/lib/theia-problem-view.d.ts +5 -5
  75. package/lib/theia-problem-view.js +30 -30
  76. package/lib/theia-quick-command-palette.d.ts +12 -12
  77. package/lib/theia-quick-command-palette.js +80 -80
  78. package/lib/theia-rename-dialog.d.ts +5 -5
  79. package/lib/theia-rename-dialog.js +35 -35
  80. package/lib/theia-status-bar.d.ts +13 -13
  81. package/lib/theia-status-bar.js +39 -39
  82. package/lib/theia-status-indicator.d.ts +10 -10
  83. package/lib/theia-status-indicator.js +48 -48
  84. package/lib/theia-terminal.d.ts +13 -13
  85. package/lib/theia-terminal.js +59 -59
  86. package/lib/theia-text-editor.d.ts +26 -26
  87. package/lib/theia-text-editor.js +120 -120
  88. package/lib/theia-toggle-bottom-indicator.d.ts +4 -4
  89. package/lib/theia-toggle-bottom-indicator.js +26 -26
  90. package/lib/theia-toolbar-item.d.ts +10 -10
  91. package/lib/theia-toolbar-item.js +39 -39
  92. package/lib/theia-toolbar.d.ts +19 -19
  93. package/lib/theia-toolbar.js +90 -90
  94. package/lib/theia-tree-node.d.ts +19 -19
  95. package/lib/theia-tree-node.js +72 -72
  96. package/lib/theia-view.d.ts +32 -32
  97. package/lib/theia-view.js +149 -149
  98. package/lib/theia-welcome-view.d.ts +6 -0
  99. package/lib/theia-welcome-view.d.ts.map +1 -0
  100. package/lib/theia-welcome-view.js +31 -0
  101. package/lib/theia-welcome-view.js.map +1 -0
  102. package/lib/theia-workspace.d.ts +18 -18
  103. package/lib/theia-workspace.js +69 -69
  104. package/lib/util.d.ts +19 -19
  105. package/lib/util.js +93 -93
  106. package/package.json +2 -2
  107. package/src/index.ts +46 -46
  108. package/src/tests/resources/sample-files1/sample.txt +4 -4
  109. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt +1 -1
  110. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-2.txt +1 -1
  111. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-1.txt +1 -1
  112. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-2.txt +1 -1
  113. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-1.txt +1 -1
  114. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-2.txt +1 -1
  115. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-1.txt +1 -1
  116. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-2.txt +1 -1
  117. package/src/tests/resources/sample-files2/another-sample.txt +1 -1
  118. package/src/tests/theia-app.test.ts +33 -33
  119. package/src/tests/theia-application-shell.test.ts +67 -0
  120. package/src/tests/theia-explorer-view.test.ts +211 -211
  121. package/src/tests/theia-main-menu.test.ts +112 -112
  122. package/src/tests/theia-output-view.test.ts +85 -85
  123. package/src/tests/theia-preference-view.test.ts +122 -122
  124. package/src/tests/theia-problems-view.test.ts +64 -64
  125. package/src/tests/theia-quick-command.test.ts +80 -80
  126. package/src/tests/theia-sample-app.test.ts +66 -66
  127. package/src/tests/theia-status-bar.test.ts +52 -52
  128. package/src/tests/theia-terminal-view.test.ts +90 -90
  129. package/src/tests/theia-text-editor.test.ts +187 -187
  130. package/src/tests/theia-toolbar.test.ts +69 -69
  131. package/src/tests/theia-workspace.test.ts +80 -80
  132. package/src/theia-about-dialog.ts +26 -26
  133. package/src/theia-app-loader.ts +167 -167
  134. package/src/theia-app.ts +188 -188
  135. package/src/theia-context-menu.ts +42 -42
  136. package/src/theia-dialog.ts +114 -114
  137. package/src/theia-editor.ts +73 -73
  138. package/src/theia-explorer-view.ts +311 -311
  139. package/src/theia-main-menu.ts +54 -54
  140. package/src/theia-menu-item.ts +75 -75
  141. package/src/theia-menu.ts +96 -96
  142. package/src/theia-monaco-editor.ts +83 -83
  143. package/src/theia-notification-indicator.ts +44 -44
  144. package/src/theia-notification-overlay.ts +94 -94
  145. package/src/theia-output-channel.ts +88 -88
  146. package/src/theia-output-view.ts +87 -87
  147. package/src/theia-page-object.ts +29 -29
  148. package/src/theia-preference-view.ts +240 -240
  149. package/src/theia-problem-indicator.ts +37 -37
  150. package/src/theia-problem-view.ts +30 -30
  151. package/src/theia-quick-command-palette.ts +83 -83
  152. package/src/theia-rename-dialog.ts +36 -36
  153. package/src/theia-status-bar.ts +44 -44
  154. package/src/theia-status-indicator.ts +50 -50
  155. package/src/theia-terminal.ts +69 -69
  156. package/src/theia-text-editor.ts +141 -141
  157. package/src/theia-toggle-bottom-indicator.ts +21 -21
  158. package/src/theia-toolbar-item.ts +41 -41
  159. package/src/theia-toolbar.ts +99 -99
  160. package/src/theia-tree-node.ts +81 -81
  161. package/src/theia-view.ts +177 -177
  162. package/src/theia-welcome-view.ts +31 -0
  163. package/src/theia-workspace.ts +76 -76
  164. package/src/util.ts +91 -91
@@ -1,211 +1,211 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
3
- //
4
- // This program and the accompanying materials are made available under the
5
- // terms of the Eclipse Public License v. 2.0 which is available at
6
- // http://www.eclipse.org/legal/epl-2.0.
7
- //
8
- // This Source Code may also be made available under the following Secondary
9
- // Licenses when the conditions for such availability set forth in the Eclipse
10
- // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
- // with the GNU Classpath Exception which is available at
12
- // https://www.gnu.org/software/classpath/license.html.
13
- //
14
- // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
- // *****************************************************************************
16
-
17
- import { expect, test } from '@playwright/test';
18
- import { TheiaAppLoader } from '../theia-app-loader';
19
- import { TheiaApp } from '../theia-app';
20
- import { PreferenceIds, TheiaPreferenceView } from '../theia-preference-view';
21
- import { DOT_FILES_FILTER, TheiaExplorerView } from '../theia-explorer-view';
22
- import { TheiaWorkspace } from '../theia-workspace';
23
-
24
- test.describe('Theia Explorer View', () => {
25
-
26
- let app: TheiaApp;
27
- let explorer: TheiaExplorerView;
28
-
29
- test.beforeAll(async ({ playwright, browser }) => {
30
- const ws = new TheiaWorkspace(['src/tests/resources/sample-files1']);
31
- app = await TheiaAppLoader.load({ playwright, browser }, ws);
32
-
33
- if (app.isElectron) {
34
- // set trash preference to off
35
- const preferenceView = await app.openPreferences(TheiaPreferenceView);
36
- await preferenceView.setBooleanPreferenceById(PreferenceIds.Files.EnableTrash, false);
37
- await preferenceView.close();
38
- }
39
-
40
- explorer = await app.openView(TheiaExplorerView);
41
- await explorer.waitForVisibleFileNodes();
42
- });
43
-
44
- test.afterAll(async () => {
45
- await app.page.close();
46
- });
47
-
48
- test('should be visible and active after being opened', async () => {
49
- expect(await explorer.isTabVisible()).toBe(true);
50
- expect(await explorer.isDisplayed()).toBe(true);
51
- expect(await explorer.isActive()).toBe(true);
52
- });
53
-
54
- test("should be opened at the left and have the title 'Explorer'", async () => {
55
- expect(await explorer.isInSidePanel()).toBe(true);
56
- expect(await explorer.side()).toBe('left');
57
- expect(await explorer.title()).toBe('Explorer');
58
- });
59
-
60
- test('should be possible to close and reopen it', async () => {
61
- await explorer.close();
62
- expect(await explorer.isTabVisible()).toBe(false);
63
-
64
- explorer = await app.openView(TheiaExplorerView);
65
- expect(await explorer.isTabVisible()).toBe(true);
66
- expect(await explorer.isDisplayed()).toBe(true);
67
- expect(await explorer.isActive()).toBe(true);
68
- });
69
-
70
- test('should show one folder named "sampleFolder", one named "sampleFolderCompact" and one file named "sample.txt"', async () => {
71
- await explorer.selectTreeNode('sampleFolder');
72
- expect(await explorer.isTreeNodeSelected('sampleFolder')).toBe(true);
73
- const fileStatElements = await explorer.visibleFileStatNodes(DOT_FILES_FILTER);
74
- expect(fileStatElements.length).toBe(3);
75
-
76
- let file; let folder; let compactFolder;
77
- if (await fileStatElements[0].isFolder()) {
78
- folder = fileStatElements[0];
79
- compactFolder = fileStatElements[1];
80
- file = fileStatElements[2];
81
- } else {
82
- folder = fileStatElements[2];
83
- compactFolder = fileStatElements[1];
84
- file = fileStatElements[0];
85
- }
86
-
87
- expect(await folder.label()).toBe('sampleFolder');
88
- expect(await folder.isFile()).toBe(false);
89
- expect(await folder.isFolder()).toBe(true);
90
- expect(await compactFolder.label()).toBe('sampleFolderCompact');
91
- expect(await compactFolder.isFile()).toBe(false);
92
- expect(await compactFolder.isFolder()).toBe(true);
93
- expect(await file.label()).toBe('sample.txt');
94
- expect(await file.isFolder()).toBe(false);
95
- expect(await file.isFile()).toBe(true);
96
- });
97
-
98
- test('should provide file stat node by single path fragment "sample.txt"', async () => {
99
- const file = await explorer.getFileStatNodeByLabel('sample.txt');
100
- expect(await file.label()).toBe('sample.txt');
101
- expect(await file.isFolder()).toBe(false);
102
- expect(await file.isFile()).toBe(true);
103
- });
104
-
105
- test('should provide file stat nodes that can define whether they are collapsed or not and that can be expanded and collapsed', async () => {
106
- const file = await explorer.getFileStatNodeByLabel('sample.txt');
107
- expect(await file.isCollapsed()).toBe(false);
108
-
109
- const folder = await explorer.getFileStatNodeByLabel('sampleFolder');
110
- expect(await folder.isCollapsed()).toBe(true);
111
-
112
- await folder.expand();
113
- expect(await folder.isCollapsed()).toBe(false);
114
-
115
- await folder.collapse();
116
- expect(await folder.isCollapsed()).toBe(true);
117
- });
118
-
119
- test('should provide file stat node by path "sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt"', async () => {
120
- const file = await explorer.fileStatNode('sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt');
121
- if (!file) { throw Error('File stat node could not be retrieved by path'); }
122
- expect(await file.label()).toBe('sampleFile1-1-1.txt');
123
- });
124
-
125
- test('should be able to check if compact folder "sampleFolderCompact/nestedFolder1/nestedFolder2" exists', async () => {
126
- const fileStatElements = await explorer.visibleFileStatNodes();
127
- // default setting `explorer.compactFolders=true` renders folders in a compact form - single child folders will be compressed in a combined tree element
128
- expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
129
- // the `existsDirectoryNode` function will expand the folder, hence we wait for the file nodes to increase as we expect a txt child file node
130
- await explorer.waitForFileNodesToIncrease(fileStatElements.length);
131
- });
132
-
133
- test('should provide file stat node by path of compact folder "sampleFolderCompact/nestedFolder1/nestedFolder2/sampleFile1-1.txt"', async () => {
134
- const file = await explorer.fileStatNode('sampleFolderCompact/nestedFolder1/nestedFolder2/sampleFile1-1.txt', true /* compact */);
135
- if (!file) { throw Error('File stat node could not be retrieved by path'); }
136
- expect(await file.label()).toBe('sampleFile1-1.txt');
137
- });
138
-
139
- test('should open context menu on "sample.txt"', async () => {
140
- const file = await explorer.getFileStatNodeByLabel('sample.txt');
141
- const menu = await file.openContextMenu();
142
- expect(await menu.isOpen()).toBe(true);
143
-
144
- const menuItems = await menu.visibleMenuItems();
145
- expect(menuItems).toContain('Open');
146
- expect(menuItems).toContain('Delete');
147
- if (!app.isElectron) {
148
- expect(menuItems).toContain('Download');
149
- }
150
-
151
- await menu.close();
152
- expect(await menu.isOpen()).toBe(false);
153
- });
154
-
155
- test('should rename "sample.txt"', async () => {
156
- await explorer.renameNode('sample.txt', 'sample-new.txt');
157
- expect(await explorer.existsFileNode('sample-new.txt')).toBe(true);
158
- await explorer.renameNode('sample-new.txt', 'sample.txt');
159
- expect(await explorer.existsFileNode('sample.txt')).toBe(true);
160
- });
161
-
162
- test('should open context menu on nested folder segment "nestedFolder1"', async () => {
163
- expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
164
- const folder = await explorer.getFileStatNodeByLabel('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */);
165
- const menu = await folder.openContextMenuOnSegment('nestedFolder1');
166
- expect(await menu.isOpen()).toBe(true);
167
-
168
- const menuItems = await menu.visibleMenuItems();
169
- expect(menuItems).toContain('New File...');
170
- expect(menuItems).toContain('New Folder...');
171
- expect(menuItems).toContain('Open in Integrated Terminal');
172
- expect(menuItems).toContain('Find in Folder...');
173
-
174
- await menu.close();
175
- expect(await menu.isOpen()).toBe(false);
176
- });
177
-
178
- test('should rename compact folder "sampleFolderCompact" to "sampleDirectoryCompact', async () => {
179
- expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
180
- await explorer.renameNode(
181
- 'sampleFolderCompact/nestedFolder1/nestedFolder2', 'sampleDirectoryCompact',
182
- true /* confirm */, 'sampleFolderCompact' /* nodeSegmentLabel */);
183
- expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
184
- });
185
-
186
- test('should delete nested folder "sampleDirectoryCompact/nestedFolder1/nestedFolder2"', async () => {
187
- const fileStatElements = await explorer.visibleFileStatNodes();
188
- expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
189
- await explorer.deleteNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* confirm */, 'nestedFolder2' /* nodeSegmentLabel */);
190
- await explorer.waitForFileNodesToDecrease(fileStatElements.length);
191
- const updatedFileStatElements = await explorer.visibleFileStatNodes();
192
- expect(updatedFileStatElements.length).toBe(fileStatElements.length - 1);
193
- });
194
-
195
- test('should delete compact folder "sampleDirectoryCompact/nestedFolder1"', async () => {
196
- const fileStatElements = await explorer.visibleFileStatNodes();
197
- expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1', true /* compact */)).toBe(true);
198
- await explorer.deleteNode('sampleDirectoryCompact/nestedFolder1', true /* confirm */, 'sampleDirectoryCompact' /* nodeSegmentLabel */);
199
- await explorer.waitForFileNodesToDecrease(fileStatElements.length);
200
- const updatedFileStatElements = await explorer.visibleFileStatNodes();
201
- expect(updatedFileStatElements.length).toBe(fileStatElements.length - 1);
202
- });
203
-
204
- test('open "sample.txt" via the context menu', async () => {
205
- expect(await explorer.existsFileNode('sample.txt')).toBe(true);
206
- await explorer.clickContextMenuItem('sample.txt', ['Open']);
207
- const span = await app.page.waitForSelector('span:has-text("content line 2")');
208
- expect(await span.isVisible()).toBe(true);
209
- });
210
-
211
- });
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { expect, test } from '@playwright/test';
18
+ import { TheiaAppLoader } from '../theia-app-loader';
19
+ import { TheiaApp } from '../theia-app';
20
+ import { PreferenceIds, TheiaPreferenceView } from '../theia-preference-view';
21
+ import { DOT_FILES_FILTER, TheiaExplorerView } from '../theia-explorer-view';
22
+ import { TheiaWorkspace } from '../theia-workspace';
23
+
24
+ test.describe('Theia Explorer View', () => {
25
+
26
+ let app: TheiaApp;
27
+ let explorer: TheiaExplorerView;
28
+
29
+ test.beforeAll(async ({ playwright, browser }) => {
30
+ const ws = new TheiaWorkspace(['src/tests/resources/sample-files1']);
31
+ app = await TheiaAppLoader.load({ playwright, browser }, ws);
32
+
33
+ if (app.isElectron) {
34
+ // set trash preference to off
35
+ const preferenceView = await app.openPreferences(TheiaPreferenceView);
36
+ await preferenceView.setBooleanPreferenceById(PreferenceIds.Files.EnableTrash, false);
37
+ await preferenceView.close();
38
+ }
39
+
40
+ explorer = await app.openView(TheiaExplorerView);
41
+ await explorer.waitForVisibleFileNodes();
42
+ });
43
+
44
+ test.afterAll(async () => {
45
+ await app.page.close();
46
+ });
47
+
48
+ test('should be visible and active after being opened', async () => {
49
+ expect(await explorer.isTabVisible()).toBe(true);
50
+ expect(await explorer.isDisplayed()).toBe(true);
51
+ expect(await explorer.isActive()).toBe(true);
52
+ });
53
+
54
+ test("should be opened at the left and have the title 'Explorer'", async () => {
55
+ expect(await explorer.isInSidePanel()).toBe(true);
56
+ expect(await explorer.side()).toBe('left');
57
+ expect(await explorer.title()).toBe('Explorer');
58
+ });
59
+
60
+ test('should be possible to close and reopen it', async () => {
61
+ await explorer.close();
62
+ expect(await explorer.isTabVisible()).toBe(false);
63
+
64
+ explorer = await app.openView(TheiaExplorerView);
65
+ expect(await explorer.isTabVisible()).toBe(true);
66
+ expect(await explorer.isDisplayed()).toBe(true);
67
+ expect(await explorer.isActive()).toBe(true);
68
+ });
69
+
70
+ test('should show one folder named "sampleFolder", one named "sampleFolderCompact" and one file named "sample.txt"', async () => {
71
+ await explorer.selectTreeNode('sampleFolder');
72
+ expect(await explorer.isTreeNodeSelected('sampleFolder')).toBe(true);
73
+ const fileStatElements = await explorer.visibleFileStatNodes(DOT_FILES_FILTER);
74
+ expect(fileStatElements.length).toBe(3);
75
+
76
+ let file; let folder; let compactFolder;
77
+ if (await fileStatElements[0].isFolder()) {
78
+ folder = fileStatElements[0];
79
+ compactFolder = fileStatElements[1];
80
+ file = fileStatElements[2];
81
+ } else {
82
+ folder = fileStatElements[2];
83
+ compactFolder = fileStatElements[1];
84
+ file = fileStatElements[0];
85
+ }
86
+
87
+ expect(await folder.label()).toBe('sampleFolder');
88
+ expect(await folder.isFile()).toBe(false);
89
+ expect(await folder.isFolder()).toBe(true);
90
+ expect(await compactFolder.label()).toBe('sampleFolderCompact');
91
+ expect(await compactFolder.isFile()).toBe(false);
92
+ expect(await compactFolder.isFolder()).toBe(true);
93
+ expect(await file.label()).toBe('sample.txt');
94
+ expect(await file.isFolder()).toBe(false);
95
+ expect(await file.isFile()).toBe(true);
96
+ });
97
+
98
+ test('should provide file stat node by single path fragment "sample.txt"', async () => {
99
+ const file = await explorer.getFileStatNodeByLabel('sample.txt');
100
+ expect(await file.label()).toBe('sample.txt');
101
+ expect(await file.isFolder()).toBe(false);
102
+ expect(await file.isFile()).toBe(true);
103
+ });
104
+
105
+ test('should provide file stat nodes that can define whether they are collapsed or not and that can be expanded and collapsed', async () => {
106
+ const file = await explorer.getFileStatNodeByLabel('sample.txt');
107
+ expect(await file.isCollapsed()).toBe(false);
108
+
109
+ const folder = await explorer.getFileStatNodeByLabel('sampleFolder');
110
+ expect(await folder.isCollapsed()).toBe(true);
111
+
112
+ await folder.expand();
113
+ expect(await folder.isCollapsed()).toBe(false);
114
+
115
+ await folder.collapse();
116
+ expect(await folder.isCollapsed()).toBe(true);
117
+ });
118
+
119
+ test('should provide file stat node by path "sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt"', async () => {
120
+ const file = await explorer.fileStatNode('sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt');
121
+ if (!file) { throw Error('File stat node could not be retrieved by path'); }
122
+ expect(await file.label()).toBe('sampleFile1-1-1.txt');
123
+ });
124
+
125
+ test('should be able to check if compact folder "sampleFolderCompact/nestedFolder1/nestedFolder2" exists', async () => {
126
+ const fileStatElements = await explorer.visibleFileStatNodes();
127
+ // default setting `explorer.compactFolders=true` renders folders in a compact form - single child folders will be compressed in a combined tree element
128
+ expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
129
+ // the `existsDirectoryNode` function will expand the folder, hence we wait for the file nodes to increase as we expect a txt child file node
130
+ await explorer.waitForFileNodesToIncrease(fileStatElements.length);
131
+ });
132
+
133
+ test('should provide file stat node by path of compact folder "sampleFolderCompact/nestedFolder1/nestedFolder2/sampleFile1-1.txt"', async () => {
134
+ const file = await explorer.fileStatNode('sampleFolderCompact/nestedFolder1/nestedFolder2/sampleFile1-1.txt', true /* compact */);
135
+ if (!file) { throw Error('File stat node could not be retrieved by path'); }
136
+ expect(await file.label()).toBe('sampleFile1-1.txt');
137
+ });
138
+
139
+ test('should open context menu on "sample.txt"', async () => {
140
+ const file = await explorer.getFileStatNodeByLabel('sample.txt');
141
+ const menu = await file.openContextMenu();
142
+ expect(await menu.isOpen()).toBe(true);
143
+
144
+ const menuItems = await menu.visibleMenuItems();
145
+ expect(menuItems).toContain('Open');
146
+ expect(menuItems).toContain('Delete');
147
+ if (!app.isElectron) {
148
+ expect(menuItems).toContain('Download');
149
+ }
150
+
151
+ await menu.close();
152
+ expect(await menu.isOpen()).toBe(false);
153
+ });
154
+
155
+ test('should rename "sample.txt"', async () => {
156
+ await explorer.renameNode('sample.txt', 'sample-new.txt');
157
+ expect(await explorer.existsFileNode('sample-new.txt')).toBe(true);
158
+ await explorer.renameNode('sample-new.txt', 'sample.txt');
159
+ expect(await explorer.existsFileNode('sample.txt')).toBe(true);
160
+ });
161
+
162
+ test('should open context menu on nested folder segment "nestedFolder1"', async () => {
163
+ expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
164
+ const folder = await explorer.getFileStatNodeByLabel('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */);
165
+ const menu = await folder.openContextMenuOnSegment('nestedFolder1');
166
+ expect(await menu.isOpen()).toBe(true);
167
+
168
+ const menuItems = await menu.visibleMenuItems();
169
+ expect(menuItems).toContain('New File...');
170
+ expect(menuItems).toContain('New Folder...');
171
+ expect(menuItems).toContain('Open in Integrated Terminal');
172
+ expect(menuItems).toContain('Find in Folder...');
173
+
174
+ await menu.close();
175
+ expect(await menu.isOpen()).toBe(false);
176
+ });
177
+
178
+ test('should rename compact folder "sampleFolderCompact" to "sampleDirectoryCompact', async () => {
179
+ expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
180
+ await explorer.renameNode(
181
+ 'sampleFolderCompact/nestedFolder1/nestedFolder2', 'sampleDirectoryCompact',
182
+ true /* confirm */, 'sampleFolderCompact' /* nodeSegmentLabel */);
183
+ expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
184
+ });
185
+
186
+ test('should delete nested folder "sampleDirectoryCompact/nestedFolder1/nestedFolder2"', async () => {
187
+ const fileStatElements = await explorer.visibleFileStatNodes();
188
+ expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true);
189
+ await explorer.deleteNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* confirm */, 'nestedFolder2' /* nodeSegmentLabel */);
190
+ await explorer.waitForFileNodesToDecrease(fileStatElements.length);
191
+ const updatedFileStatElements = await explorer.visibleFileStatNodes();
192
+ expect(updatedFileStatElements.length).toBe(fileStatElements.length - 1);
193
+ });
194
+
195
+ test('should delete compact folder "sampleDirectoryCompact/nestedFolder1"', async () => {
196
+ const fileStatElements = await explorer.visibleFileStatNodes();
197
+ expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1', true /* compact */)).toBe(true);
198
+ await explorer.deleteNode('sampleDirectoryCompact/nestedFolder1', true /* confirm */, 'sampleDirectoryCompact' /* nodeSegmentLabel */);
199
+ await explorer.waitForFileNodesToDecrease(fileStatElements.length);
200
+ const updatedFileStatElements = await explorer.visibleFileStatNodes();
201
+ expect(updatedFileStatElements.length).toBe(fileStatElements.length - 1);
202
+ });
203
+
204
+ test('open "sample.txt" via the context menu', async () => {
205
+ expect(await explorer.existsFileNode('sample.txt')).toBe(true);
206
+ await explorer.clickContextMenuItem('sample.txt', ['Open']);
207
+ const span = await app.page.waitForSelector('span:has-text("content line 2")');
208
+ expect(await span.isVisible()).toBe(true);
209
+ });
210
+
211
+ });