1
+ import { join } from "path" ;
2
+ import { execSync } from "child_process" ;
3
+ import { test , expect } from "@playwright/test" ;
4
+
5
+ //
6
+ // Authentification, accès au tableau de bord et téléversement
7
+ // de plusieurs fichiers avant chaque test.
8
+ //
9
+ test . beforeEach ( async ( { page } ) =>
10
+ {
11
+ // Réinitialisation des comptes utilisateurs factices.
12
+ execSync ( "node scripts/create-fake-accounts.js" ) ;
13
+
14
+ // Accès à la page d'authentification.
15
+ await page . goto ( "/authentication" ) ;
16
+
17
+ // Clic sur l'onglet « Connexion ».
18
+ await page . getByRole ( "tab" , { name : "Login" } ) . click ( ) ;
19
+
20
+ // Remplissage des champs de saisie de l'adresse électronique et du mot de passe.
21
+ await page . getByPlaceholder ( "[email protected] " ) . fill ( "[email protected] " ) ;
22
+ await page . getByPlaceholder ( "@MyPassword123!" ) . fill ( "Florian4016" ) ;
23
+
24
+ // Clic sur le bouton de connexion.
25
+ await page . getByText ( "Log in by password" ) . click ( ) ;
26
+
27
+ // Attente de la redirection vers la page du tableau de bord.
28
+ await expect ( page ) . toHaveURL ( "/dashboard" ) ;
29
+
30
+ // Ouverture de la fenêtre de dialogue pour ajouter un fichier.
31
+ await page . locator ( "button" ) . filter ( { hasText : "Add a file" } ) . click ( ) ;
32
+
33
+ // Téléversement d'un fichier quelconque.
34
+ await page
35
+ . getByRole ( "textbox" , { name : "File Upload" } )
36
+ . setInputFiles ( [
37
+ join ( __dirname , "static/raccoon.jpg" ) ,
38
+ join ( __dirname , "static/duck.jpg" ) ,
39
+ join ( __dirname , "static/seagull.png" )
40
+ ] ) ;
41
+ await page . getByRole ( "button" , { name : "Upload" } ) . click ( ) ;
42
+ await expect (
43
+ page . locator ( "[data-sonner-toast][data-type = success]" )
44
+ ) . toHaveCount ( 1 ) ;
45
+ } ) ;
46
+
47
+ //
48
+ // Publication du premier fichier téléversé.
49
+ //
50
+ test ( "Publication d'un fichier téléversé" , async ( { page } ) =>
51
+ {
52
+ // Ouverture du menu des actions pour rendre public le premier fichier téléversé.
53
+ await page
54
+ . getByRole ( "button" , { name : "Open action menu" } )
55
+ . first ( )
56
+ . click ( ) ;
57
+ await page . getByRole ( "menuitem" , { name : "Make Public" } ) . click ( ) ;
58
+ await page . getByRole ( "button" , { name : "Confirm" } ) . click ( ) ;
59
+
60
+ // Attente de la réponse du serveur et de la notification de succès.
61
+ await expect (
62
+ page . locator ( "[data-sonner-toast][data-type = success]" )
63
+ ) . toHaveCount ( 1 ) ;
64
+
65
+ // Rechargement de la page pour fermer le menu des actions.
66
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
67
+ await page . reload ( ) ;
68
+
69
+ // Vérification de la publication du fichier.
70
+ await expect ( page . getByText ( "public" ) ) . toHaveCount ( 1 ) ;
71
+ await expect ( page . getByText ( "private" ) ) . toHaveCount ( 2 ) ;
72
+ } ) ;
73
+
74
+ //
75
+ // Privatisation du premier fichier téléversé.
76
+ //
77
+ test ( "Privatisation d'un fichier téléversé" , async ( { page } ) =>
78
+ {
79
+ // Ouverture du menu des actions pour rendre privé le premier fichier téléversé.
80
+ await page
81
+ . getByRole ( "button" , { name : "Open action menu" } )
82
+ . first ( )
83
+ . click ( ) ;
84
+ await page . getByRole ( "menuitem" , { name : "Make Private" } ) . click ( ) ;
85
+ await page . getByRole ( "button" , { name : "Confirm" } ) . click ( ) ;
86
+
87
+ // Attente de la réponse du serveur et de la notification de succès.
88
+ await expect (
89
+ page . locator ( "[data-sonner-toast][data-type = success]" )
90
+ ) . toHaveCount ( 1 ) ;
91
+
92
+ // Rechargement de la page pour fermer le menu des actions.
93
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
94
+ await page . reload ( ) ;
95
+
96
+ // Vérification de la privatisation du fichier.
97
+ await expect ( page . getByText ( "private" ) ) . toHaveCount ( 3 ) ;
98
+ } ) ;
99
+
100
+ //
101
+ // Renommage du premier fichier téléversé.
102
+ //
103
+ test ( "Renommage d'un fichier téléversé" , async ( { page } ) =>
104
+ {
105
+ // Ouverture du menu des actions pour renommer le premier fichier téléversé.
106
+ await page
107
+ . getByRole ( "button" , { name : "Open action menu" } )
108
+ . first ( )
109
+ . click ( ) ;
110
+ await page . getByRole ( "menuitem" , { name : "Rename Resource" } ) . click ( ) ;
111
+ await page . getByPlaceholder ( "duck" ) . fill ( "dock" ) ;
112
+ await page . getByRole ( "button" , { name : "Update" } ) . click ( ) ;
113
+
114
+ // Attente de la réponse du serveur et de la notification de succès.
115
+ await expect (
116
+ page . locator ( "[data-sonner-toast][data-type = success]" )
117
+ ) . toHaveCount ( 1 ) ;
118
+
119
+ // Rechargement de la page pour fermer le menu des actions.
120
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
121
+ await page . reload ( ) ;
122
+
123
+ // Vérification du renommage du fichier.
124
+ await expect ( page . getByText ( "dock" ) ) . toHaveCount ( 1 ) ;
125
+ } ) ;
126
+
127
+ //
128
+ // Accès à un fichier téléversé.
129
+ //
130
+ test ( "Accès vers un fichier téléversé" , async ( { page } ) =>
131
+ {
132
+ // Ce test n'est pas possible pour le moment car Playwright ne supporte pas
133
+ // l'écriture/lecture du presse-papiers dans les tests automatisés.
134
+ // https://github.com/microsoft/playwright/issues/15860
135
+ test . skip ( ) ;
136
+
137
+ // Ouverture du menu des actions pour accéder au premier fichier téléversé.
138
+ await page
139
+ . getByRole ( "button" , { name : "Open action menu" } )
140
+ . first ( )
141
+ . click ( ) ;
142
+ await page . getByRole ( "menuitem" , { name : "Copy access link" } ) . click ( ) ;
143
+ await page . getByRole ( "menuitem" , { name : "Access file" } ) . click ( ) ;
144
+ } ) ;
145
+
146
+ //
147
+ // Vérification de la présence d'une extension dans le lien d'accès.
148
+ //
149
+ test ( "Vérification de l'extension dans le lien d'accès" , async ( { page } ) =>
150
+ {
151
+ // Ce test n'est pas possible pour le moment car Playwright ne supporte pas
152
+ // l'écriture/lecture du presse-papiers dans les tests automatisés.
153
+ // https://github.com/microsoft/playwright/issues/15860
154
+ test . skip ( ) ;
155
+
156
+ // Accès aux paramètres utilisateur concernant le stockage.
157
+ await page . goto ( "/settings/storage" ) ;
158
+
159
+ // Activation de l'affichage de l'extension dans le lien d'accès.
160
+ await page . getByLabel ( "File Extension Display" ) . click ( ) ;
161
+ await page . getByRole ( "button" , { name : "Update" } ) . click ( ) ;
162
+
163
+ // Retour à la page du tableau de bord et accès au premier fichier téléversé.
164
+ await page . goto ( "/dashboard" ) ;
165
+ await page
166
+ . getByRole ( "button" , { name : "Open action menu" } )
167
+ . first ( )
168
+ . click ( ) ;
169
+ await page . getByRole ( "menuitem" , { name : "Copy access link" } ) . click ( ) ;
170
+ await page . getByRole ( "menuitem" , { name : "Access file" } ) . click ( ) ;
171
+ } ) ;
172
+
173
+ //
174
+ // Suppression d'un fichier téléversé.
175
+ //
176
+ test ( "Suppression d'un fichier téléversé" , async ( { page } ) =>
177
+ {
178
+ // Ouverture du menu des actions pour supprimer le premier fichier téléversé.
179
+ await page
180
+ . getByRole ( "button" , { name : "Open action menu" } )
181
+ . first ( )
182
+ . click ( ) ;
183
+ await page . getByRole ( "menuitem" , { name : "Permanently Delete" } ) . click ( ) ;
184
+ await page . getByRole ( "button" , { name : "Confirm" } ) . click ( ) ;
185
+
186
+ // Attente de la réponse du serveur et de la notification de succès.
187
+ await expect (
188
+ page . locator ( "[data-sonner-toast][data-type = success]" )
189
+ ) . toHaveCount ( 1 ) ;
190
+
191
+ // Rechargement de la page pour fermer le menu des actions.
192
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
193
+ await page . reload ( ) ;
194
+
195
+ // Vérification de la suppression du fichier.
196
+ await expect ( page . getByText ( "private" ) ) . toHaveCount ( 2 ) ;
197
+ } ) ;
198
+
199
+ //
200
+ // Publication de tous les fichiers sélectionnés.
201
+ //
202
+ test ( "Publication de tous les fichiers sélectionnés" , async ( { page } ) =>
203
+ {
204
+ // Sélection de tous les fichiers téléversés.
205
+ await page . getByLabel ( "Select line" ) . first ( ) . click ( ) ;
206
+ await page . getByLabel ( "Select line" ) . nth ( 1 ) . click ( ) ;
207
+ await page . getByLabel ( "Select line" ) . last ( ) . click ( ) ;
208
+
209
+ // Ouverture du menu des actions pour rendre public l'ensemble
210
+ // des fichiers sélectionnés.
211
+ await page
212
+ . getByRole ( "button" , { name : "Open action menu" } )
213
+ . first ( )
214
+ . click ( ) ;
215
+ await page . getByRole ( "menuitem" , { name : "Make Public" } ) . click ( ) ;
216
+ await page . getByRole ( "button" , { name : "Confirm" } ) . click ( ) ;
217
+
218
+ // Attente de la réponse du serveur et de la notification de succès.
219
+ await expect (
220
+ page . locator ( "[data-sonner-toast][data-type = success]" )
221
+ ) . toHaveCount ( 1 ) ;
222
+
223
+ // Rechargement de la page pour fermer le menu des actions.
224
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
225
+ await page . reload ( ) ;
226
+
227
+ // Vérification de la publication des fichiers.
228
+ await expect ( page . getByText ( "public" ) ) . toHaveCount ( 3 ) ;
229
+ } ) ;
230
+
231
+ //
232
+ // Privatisation de tous les fichiers sélectionnés.
233
+ //
234
+ test ( "Privatisation de tous les fichiers sélectionnés" , async ( { page } ) =>
235
+ {
236
+ // Sélection de tous les fichiers téléversés.
237
+ await page . getByLabel ( "Select line" ) . first ( ) . click ( ) ;
238
+ await page . getByLabel ( "Select line" ) . nth ( 1 ) . click ( ) ;
239
+ await page . getByLabel ( "Select line" ) . last ( ) . click ( ) ;
240
+
241
+ // Ouverture du menu des actions pour rendre public l'ensemble
242
+ // des fichiers sélectionnés.
243
+ await page
244
+ . getByRole ( "button" , { name : "Open action menu" } )
245
+ . first ( )
246
+ . click ( ) ;
247
+ await page . getByRole ( "menuitem" , { name : "Make Public" } ) . click ( ) ;
248
+ await page . getByRole ( "button" , { name : "Confirm" } ) . click ( ) ;
249
+
250
+ // Attente de la réponse du serveur et de la notification de succès.
251
+ await expect (
252
+ page . locator ( "[data-sonner-toast][data-type = success]" )
253
+ ) . toHaveCount ( 1 ) ;
254
+
255
+ // Rechargement de la page pour fermer le menu des actions.
256
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
257
+ await page . reload ( ) ;
258
+
259
+ // Sélection de tous les fichiers téléversés et privatisation.
260
+ // Note : on doit d'abord rendre les fichiers publics pour les privatiser
261
+ // après afin que le serveur refuse de privatiser un fichier déjà privé.
262
+ await page . getByLabel ( "Select line" ) . first ( ) . click ( ) ;
263
+ await page . getByLabel ( "Select line" ) . nth ( 1 ) . click ( ) ;
264
+ await page . getByLabel ( "Select line" ) . last ( ) . click ( ) ;
265
+
266
+ await page
267
+ . getByRole ( "button" , { name : "Open action menu" } )
268
+ . first ( )
269
+ . click ( ) ;
270
+ await page . getByRole ( "menuitem" , { name : "Make Private" } ) . click ( ) ;
271
+ await page . getByRole ( "button" , { name : "Confirm" } ) . click ( ) ;
272
+
273
+ // Attente de la réponse du serveur et de la notification de succès.
274
+ await expect (
275
+ page . locator ( "[data-sonner-toast][data-type = success]" )
276
+ ) . toHaveCount ( 1 ) ;
277
+
278
+ // Rechargement de la page pour fermer le menu des actions.
279
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
280
+ await page . reload ( ) ;
281
+
282
+ // Vérification de la privatisation des fichiers.
283
+ await expect ( page . getByText ( "private" ) ) . toHaveCount ( 3 ) ;
284
+ } ) ;
285
+
286
+ //
287
+ // Renommage de tous les fichiers sélectionnés.
288
+ //
289
+ test ( "Renommage de tous les fichiers sélectionnés" , async ( { page } ) =>
290
+ {
291
+ // Sélection de tous les fichiers téléversés.
292
+ await page . getByLabel ( "Select line" ) . first ( ) . click ( ) ;
293
+ await page . getByLabel ( "Select line" ) . nth ( 1 ) . click ( ) ;
294
+ await page . getByLabel ( "Select line" ) . last ( ) . click ( ) ;
295
+
296
+ // Ouverture du menu des actions pour renommer l'ensemble des
297
+ // fichiers sélectionnés.
298
+ await page
299
+ . getByRole ( "button" , { name : "Open action menu" } )
300
+ . first ( )
301
+ . click ( ) ;
302
+ await page . getByRole ( "menuitem" , { name : "Rename Resource" } ) . click ( ) ;
303
+ await page . getByPlaceholder ( "duck" ) . fill ( "dock" ) ;
304
+ await page . getByRole ( "button" , { name : "Update" } ) . click ( ) ;
305
+
306
+ // Attente de la réponse du serveur et de la notification de succès.
307
+ await expect (
308
+ page . locator ( "[data-sonner-toast][data-type = success]" )
309
+ ) . toHaveCount ( 1 ) ;
310
+
311
+ // Rechargement de la page pour fermer le menu des actions.
312
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
313
+ await page . reload ( ) ;
314
+
315
+ // Vérification du renommage des fichiers.
316
+ await expect ( page . getByText ( "dock" ) ) . toHaveCount ( 3 ) ;
317
+ } ) ;
318
+
319
+ //
320
+ // Suppression de tous les fichiers sélectionnés.
321
+ //
322
+ test ( "Suppression de tous les fichiers sélectionnés" , async ( { page } ) =>
323
+ {
324
+ // Sélection de tous les fichiers téléversés.
325
+ await page . getByLabel ( "Select line" ) . first ( ) . click ( ) ;
326
+ await page . getByLabel ( "Select line" ) . nth ( 1 ) . click ( ) ;
327
+ await page . getByLabel ( "Select line" ) . last ( ) . click ( ) ;
328
+
329
+ // Ouverture du menu des actions pour supprimer l'ensemble des
330
+ // fichiers sélectionnés.
331
+ await page
332
+ . getByRole ( "button" , { name : "Open action menu" } )
333
+ . first ( )
334
+ . click ( ) ;
335
+ await page . getByRole ( "menuitem" , { name : "Permanently Delete" } ) . click ( ) ;
336
+ await page . getByRole ( "button" , { name : "Confirm" } ) . click ( ) ;
337
+
338
+ // Attente de la réponse du serveur et de la notification de succès.
339
+ await expect (
340
+ page . locator ( "[data-sonner-toast][data-type = success]" )
341
+ ) . toHaveCount ( 1 ) ;
342
+
343
+ // Rechargement de la page pour fermer le menu des actions.
344
+ // Source : https://github.com/radix-ui/primitives/issues/1836#issuecomment-1674338372
345
+ await page . reload ( ) ;
346
+
347
+ // Vérification du renommage des fichiers.
348
+ await expect ( page . getByText ( "public" ) ) . toHaveCount ( 0 ) ;
349
+ await expect ( page . getByText ( "private" ) ) . toHaveCount ( 0 ) ;
350
+ } ) ;
0 commit comments