1
- import type { Page } from '@playwright/test'
1
+ import type { BrowserContext , Page } from '@playwright/test'
2
2
3
3
import { expect , test } from '@playwright/test'
4
+ import { addBlock } from 'helpers/e2e/addBlock.js'
5
+ import { openBlocksDrawer } from 'helpers/e2e/openBlocksDrawer.js'
4
6
import path from 'path'
5
7
import { fileURLToPath } from 'url'
6
8
@@ -24,6 +26,8 @@ const { beforeAll, beforeEach, describe } = test
24
26
let client : RESTClient
25
27
let page : Page
26
28
let serverURL : string
29
+ let context : BrowserContext
30
+
27
31
// If we want to make this run in parallel: test.describe.configure({ mode: 'parallel' })
28
32
29
33
describe ( 'Block fields' , ( ) => {
@@ -35,12 +39,13 @@ describe('Block fields', () => {
35
39
dirname,
36
40
} ) )
37
41
38
- const context = await browser . newContext ( )
42
+ context = await browser . newContext ( )
39
43
page = await context . newPage ( )
40
44
initPageConsoleErrorCatch ( page )
41
45
42
46
await ensureCompilationIsDone ( { page, serverURL } )
43
47
} )
48
+
44
49
beforeEach ( async ( ) => {
45
50
await reInitializeDB ( {
46
51
serverURL,
@@ -58,25 +63,19 @@ describe('Block fields', () => {
58
63
} )
59
64
60
65
let url : AdminUrlUtil
66
+
61
67
beforeAll ( ( ) => {
62
68
url = new AdminUrlUtil ( serverURL , 'block-fields' )
63
69
} )
64
70
65
71
test ( 'should open blocks drawer and select first block' , async ( ) => {
66
72
await page . goto ( url . create )
67
- const addButton = page . locator ( '#field-blocks > .blocks-field__drawer-toggler' )
68
- await expect ( addButton ) . toContainText ( 'Add Block' )
69
- await addButton . click ( )
70
-
71
- const blocksDrawer = page . locator ( '[id^=drawer_1_blocks-drawer-]' )
72
- await expect ( blocksDrawer ) . toBeVisible ( )
73
73
74
- // select the first block in the drawer
75
- const firstBlockSelector = blocksDrawer
76
- . locator ( '.blocks-drawer__blocks .blocks-drawer__block' )
77
- . first ( )
78
- await expect ( firstBlockSelector ) . toContainText ( 'Content' )
79
- await firstBlockSelector . click ( )
74
+ await addBlock ( {
75
+ page,
76
+ fieldName : 'blocks' ,
77
+ blockLabel : 'Content' ,
78
+ } )
80
79
81
80
// ensure the block was appended to the rows
82
81
const addedRow = page . locator ( '#field-blocks .blocks-field__row' ) . last ( )
@@ -88,24 +87,25 @@ describe('Block fields', () => {
88
87
89
88
test ( 'should reset search state in blocks drawer on re-open' , async ( ) => {
90
89
await page . goto ( url . create )
91
- const addButton = page . locator ( '#field-blocks > .blocks-field__drawer-toggler' )
92
- await expect ( addButton ) . toContainText ( 'Add Block' )
93
- await addButton . click ( )
94
90
95
- const blocksDrawer = page . locator ( '[id^=drawer_1_blocks-drawer-]' )
96
- await expect ( blocksDrawer ) . toBeVisible ( )
91
+ const blocksDrawer = await openBlocksDrawer ( {
92
+ page,
93
+ fieldName : 'blocks' ,
94
+ } )
97
95
98
96
const searchInput = page . locator ( '.block-search__input' )
99
97
await searchInput . fill ( 'Number' )
100
98
101
99
// select the first block in the drawer
100
+
102
101
const firstBlockSelector = blocksDrawer
103
102
. locator ( '.blocks-drawer__blocks .blocks-drawer__block' )
104
103
. first ( )
105
104
106
105
await expect ( firstBlockSelector ) . toContainText ( 'Number' )
107
106
108
107
await page . locator ( '.drawer__header__close' ) . click ( )
108
+ const addButton = page . locator ( '#field-blocks > .blocks-field__drawer-toggler' )
109
109
await addButton . click ( )
110
110
111
111
await expect ( blocksDrawer ) . toBeVisible ( )
@@ -131,6 +131,7 @@ describe('Block fields', () => {
131
131
const firstBlockSelector = blocksDrawer
132
132
. locator ( '.blocks-drawer__blocks .blocks-drawer__block' )
133
133
. first ( )
134
+
134
135
await expect ( firstBlockSelector ) . toContainText ( 'Content' )
135
136
await firstBlockSelector . click ( )
136
137
@@ -179,19 +180,11 @@ describe('Block fields', () => {
179
180
await page . goto ( url . create )
180
181
await expect ( page . locator ( '#field-i18nBlocks .blocks-field__header' ) ) . toContainText ( 'Block en' )
181
182
182
- const addButton = page . locator ( '#field-i18nBlocks > .blocks-field__drawer-toggler' )
183
- await expect ( addButton ) . toContainText ( 'Add Block en' )
184
- await addButton . click ( )
185
-
186
- const blocksDrawer = page . locator ( '[id^=drawer_1_blocks-drawer-]' )
187
- await expect ( blocksDrawer ) . toBeVisible ( )
188
-
189
- // select the first block in the drawer
190
- const firstBlockSelector = blocksDrawer
191
- . locator ( '.blocks-drawer__blocks .blocks-drawer__block' )
192
- . first ( )
193
- await expect ( firstBlockSelector ) . toContainText ( 'Text en' )
194
- await firstBlockSelector . click ( )
183
+ await addBlock ( {
184
+ page,
185
+ fieldName : 'i18nBlocks' ,
186
+ blockLabel : 'Text en' ,
187
+ } )
195
188
196
189
// ensure the block was appended to the rows
197
190
const firstRow = page . locator ( '#field-i18nBlocks .blocks-field__row' ) . first ( )
@@ -203,15 +196,12 @@ describe('Block fields', () => {
203
196
204
197
test ( 'should render custom block row label' , async ( ) => {
205
198
await page . goto ( url . create )
206
- const addButton = page . locator ( '#field-blocks > .blocks-field__drawer-toggler' )
207
- await addButton . click ( )
208
- const blocksDrawer = page . locator ( '[id^=drawer_1_blocks-drawer-]' )
209
199
210
- await blocksDrawer
211
- . locator ( '.blocks-drawer__block .thumbnail-card__label' , {
212
- hasText : 'Content ' ,
213
- } )
214
- . click ( )
200
+ await addBlock ( {
201
+ page ,
202
+ fieldName : 'blocks ' ,
203
+ blockLabel : 'Content' ,
204
+ } )
215
205
216
206
await expect (
217
207
page . locator ( '#field-blocks .blocks-field__row .blocks-field__block-header' , {
@@ -223,20 +213,17 @@ describe('Block fields', () => {
223
213
test ( 'should add different blocks with similar field configs' , async ( ) => {
224
214
await page . goto ( url . create )
225
215
226
- async function addBlock ( name : 'Block A' | 'Block B' ) {
227
- await page
228
- . locator ( '#field-blocksWithSimilarConfigs' )
229
- . getByRole ( 'button' , { name : 'Add Blocks With Similar Config' } )
230
- . click ( )
231
- await page . getByRole ( 'button' , { name } ) . click ( )
232
- }
233
-
234
- await addBlock ( 'Block A' )
216
+ await addBlock ( {
217
+ page,
218
+ fieldName : 'blocksWithSimilarConfigs' ,
219
+ blockLabel : 'Block A' ,
220
+ } )
235
221
236
222
await page
237
223
. locator ( '#blocksWithSimilarConfigs-row-0' )
238
224
. getByRole ( 'button' , { name : 'Add Item' } )
239
225
. click ( )
226
+
240
227
await page
241
228
. locator ( 'input[name="blocksWithSimilarConfigs.0.items.0.title"]' )
242
229
. fill ( 'items>0>title' )
@@ -245,12 +232,17 @@ describe('Block fields', () => {
245
232
page . locator ( 'input[name="blocksWithSimilarConfigs.0.items.0.title"]' ) ,
246
233
) . toHaveValue ( 'items>0>title' )
247
234
248
- await addBlock ( 'Block B' )
235
+ await addBlock ( {
236
+ page,
237
+ fieldName : 'blocksWithSimilarConfigs' ,
238
+ blockLabel : 'Block B' ,
239
+ } )
249
240
250
241
await page
251
242
. locator ( '#blocksWithSimilarConfigs-row-1' )
252
243
. getByRole ( 'button' , { name : 'Add Item' } )
253
244
. click ( )
245
+
254
246
await page
255
247
. locator ( 'input[name="blocksWithSimilarConfigs.1.items.0.title2"]' )
256
248
. fill ( 'items>1>title' )
@@ -269,19 +261,11 @@ describe('Block fields', () => {
269
261
test ( 'should fail min rows validation when rows are present' , async ( ) => {
270
262
await page . goto ( url . create )
271
263
272
- await page
273
- . locator ( '#field-blocksWithMinRows' )
274
- . getByRole ( 'button' , { name : 'Add Blocks With Min Row' } )
275
- . click ( )
276
-
277
- const blocksDrawer = page . locator ( '[id^=drawer_1_blocks-drawer-]' )
278
- await expect ( blocksDrawer ) . toBeVisible ( )
279
-
280
- const firstBlockSelector = blocksDrawer
281
- . locator ( '.blocks-drawer__blocks .blocks-drawer__block' )
282
- . first ( )
283
-
284
- await firstBlockSelector . click ( )
264
+ await addBlock ( {
265
+ page,
266
+ fieldName : 'blocksWithMinRows' ,
267
+ blockLabel : 'Block With Min Row' ,
268
+ } )
285
269
286
270
const firstRow = page . locator ( 'input[name="blocksWithMinRows.0.blockTitle"]' )
287
271
await expect ( firstRow ) . toBeVisible ( )
@@ -328,6 +312,7 @@ describe('Block fields', () => {
328
312
. locator ( '.custom-blocks-field-management' )
329
313
. getByRole ( 'button' , { name : 'Add Block 2' } )
330
314
. click ( )
315
+
331
316
await expect (
332
317
page . locator ( '#field-customBlocks input[name="customBlocks.1.block2Title"]' ) ,
333
318
) . toHaveValue ( 'Block 2: Prefilled Title' )
@@ -336,6 +321,7 @@ describe('Block fields', () => {
336
321
. locator ( '.custom-blocks-field-management' )
337
322
. getByRole ( 'button' , { name : 'Replace Block 2' } )
338
323
. click ( )
324
+
339
325
await expect (
340
326
page . locator ( '#field-customBlocks input[name="customBlocks.1.block1Title"]' ) ,
341
327
) . toHaveValue ( 'REPLACED BLOCK' )
@@ -344,13 +330,13 @@ describe('Block fields', () => {
344
330
} )
345
331
346
332
describe ( 'sortable blocks' , ( ) => {
347
- test ( 'should have disabled admin sorting' , async ( ) => {
333
+ test ( 'should not render sort controls when sorting is disabled ' , async ( ) => {
348
334
await page . goto ( url . create )
349
335
const field = page . locator ( '#field-disableSort > div > div > .array-actions__action-chevron' )
350
336
expect ( await field . count ( ) ) . toEqual ( 0 )
351
337
} )
352
338
353
- test ( 'the drag handle should be hidden ' , async ( ) => {
339
+ test ( 'should not render drag handle when sorting is disabled ' , async ( ) => {
354
340
await page . goto ( url . create )
355
341
const field = page . locator (
356
342
'#field-disableSort > .blocks-field__rows > div > div > .collapsible__drag' ,
0 commit comments