@@ -57,3 +57,101 @@ test('user can see cannot click solve on lessons without solution files', async
57
57
// reset-button should be immediately visible
58
58
await expect ( page . getByRole ( 'button' , { name : 'Reset' } ) ) . toBeVisible ( ) ;
59
59
} ) ;
60
+
61
+ // TODO: Requires #245
62
+ test . skip ( 'user should not see hidden file tree' , async ( { page } ) => {
63
+ await page . goto ( `${ BASE_URL } /hidden` ) ;
64
+ await expect ( page . getByRole ( 'heading' , { level : 1 , name : 'File Tree test - Hidden' } ) ) . toBeVisible ( ) ;
65
+
66
+ await expect ( page . getByText ( 'Files' ) ) . not . toBeVisible ( ) ;
67
+ await expect ( page . getByRole ( 'button' , { name : 'example.js' } ) ) . not . toBeVisible ( ) ;
68
+ } ) ;
69
+
70
+ test ( 'user cannot create files or folders when lesson is not configured via allowEdits' , async ( { page } ) => {
71
+ await page . goto ( `${ BASE_URL } /allow-edits-disabled` ) ;
72
+
73
+ await expect ( page . getByTestId ( 'file-tree-root-context-menu' ) ) . not . toBeVisible ( ) ;
74
+
75
+ await page . getByRole ( 'button' , { name : 'first-level' } ) . click ( { button : 'right' } ) ;
76
+ await expect ( page . getByRole ( 'menuitem' , { name : 'Create file' } ) ) . not . toBeVisible ( ) ;
77
+ } ) ;
78
+
79
+ test ( 'user can create files' , async ( { page } ) => {
80
+ await page . goto ( `${ BASE_URL } /allow-edits-enabled` ) ;
81
+ await expect ( page . getByRole ( 'heading' , { level : 1 , name : 'File Tree test - Allow Edits Enabled' } ) ) . toBeVisible ( ) ;
82
+
83
+ // wait for terminal to start
84
+ const terminal = page . getByRole ( 'textbox' , { name : 'Terminal input' } ) ;
85
+ const terminalOutput = page . getByRole ( 'tabpanel' , { name : 'Terminal' } ) ;
86
+ await expect ( terminalOutput ) . toContainText ( '~/tutorial' , { useInnerText : true } ) ;
87
+
88
+ for ( const [ locator , filename ] of [
89
+ [ page . getByTestId ( 'file-tree-root-context-menu' ) , 'file-in-root.js' ] ,
90
+ [ page . getByRole ( 'button' , { name : 'first-level' } ) , 'file-in-first-level.js' ] ,
91
+ [ page . getByRole ( 'button' , { name : 'second-level' } ) , 'file-in-second-level.js' ] ,
92
+ ] as const ) {
93
+ await locator . click ( { button : 'right' } ) ;
94
+ await page . getByRole ( 'menuitem' , { name : 'Create file' } ) . click ( ) ;
95
+
96
+ await page . locator ( '*:focus' ) . fill ( filename ) ;
97
+ await page . locator ( '*:focus' ) . press ( 'Enter' ) ;
98
+ await expect ( page . getByRole ( 'button' , { name : filename , pressed : true } ) ) . toBeVisible ( ) ;
99
+ }
100
+
101
+ // verify that all files are present on file tree after last creation
102
+ await expect ( page . getByRole ( 'button' , { name : 'file-in-root.js' } ) ) . toBeVisible ( ) ;
103
+ await expect ( page . getByRole ( 'button' , { name : 'file-in-first-level' } ) ) . toBeVisible ( ) ;
104
+ await expect ( page . getByRole ( 'button' , { name : 'file-in-second-level' } ) ) . toBeVisible ( ) ;
105
+
106
+ // verify that files are present on file system via terminal
107
+ for ( const [ directory , filename ] of [
108
+ [ './' , 'file-in-root.js' ] ,
109
+ [ './first-level' , 'file-in-first-level.js' ] ,
110
+ [ './first-level/second-level' , 'file-in-second-level.js' ] ,
111
+ ] ) {
112
+ await terminal . fill ( `clear; ls ${ directory } ` ) ;
113
+ await terminal . press ( 'Enter' ) ;
114
+
115
+ await expect ( terminalOutput ) . toContainText ( filename , { useInnerText : true } ) ;
116
+ }
117
+ } ) ;
118
+
119
+ test ( 'user can create folders' , async ( { page } ) => {
120
+ await page . goto ( `${ BASE_URL } /allow-edits-enabled` ) ;
121
+ await expect ( page . getByRole ( 'heading' , { level : 1 , name : 'File Tree test - Allow Edits Enabled' } ) ) . toBeVisible ( ) ;
122
+
123
+ // wait for terminal to start
124
+ const terminal = page . getByRole ( 'textbox' , { name : 'Terminal input' } ) ;
125
+ const terminalOutput = page . getByRole ( 'tabpanel' , { name : 'Terminal' } ) ;
126
+ await expect ( terminalOutput ) . toContainText ( '~/tutorial' , { useInnerText : true } ) ;
127
+
128
+ for ( const [ locator , folder ] of [
129
+ [ page . getByTestId ( 'file-tree-root-context-menu' ) , 'folder-1' ] ,
130
+ [ page . getByRole ( 'button' , { name : 'folder-1' } ) , 'folder-2' ] ,
131
+ [ page . getByRole ( 'button' , { name : 'folder-2' } ) , 'folder-3' ] ,
132
+ ] as const ) {
133
+ await locator . click ( { button : 'right' } ) ;
134
+ await page . getByRole ( 'menuitem' , { name : 'Create folder' } ) . click ( ) ;
135
+
136
+ await page . locator ( '*:focus' ) . fill ( folder ) ;
137
+ await page . locator ( '*:focus' ) . press ( 'Enter' ) ;
138
+ await expect ( page . getByRole ( 'button' , { name : folder } ) ) . toBeVisible ( ) ;
139
+ }
140
+
141
+ // verify that all folders are present on file tree after last creation
142
+ await expect ( page . getByRole ( 'button' , { name : 'folder-1' } ) ) . toBeVisible ( ) ;
143
+ await expect ( page . getByRole ( 'button' , { name : 'folder-2' } ) ) . toBeVisible ( ) ;
144
+ await expect ( page . getByRole ( 'button' , { name : 'folder-3' } ) ) . toBeVisible ( ) ;
145
+
146
+ // verify that files are present on file system via terminal
147
+ for ( const [ directory , folder ] of [
148
+ [ './' , 'folder-1' ] ,
149
+ [ './folder-1' , 'folder-2' ] ,
150
+ [ './folder-1/folder-2' , 'folder-3' ] ,
151
+ ] ) {
152
+ await terminal . fill ( `clear; ls ${ directory } ` ) ;
153
+ await terminal . press ( 'Enter' ) ;
154
+
155
+ await expect ( terminalOutput ) . toContainText ( folder , { useInnerText : true } ) ;
156
+ }
157
+ } ) ;
0 commit comments