@@ -57,3 +57,101 @@ test('user can see cannot click solve on lessons without solution files', async
5757 // reset-button should be immediately visible
5858 await expect ( page . getByRole ( 'button' , { name : 'Reset' } ) ) . toBeVisible ( ) ;
5959} ) ;
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