@@ -33,6 +33,7 @@ import {
3333 adminUploadControlSlug ,
3434 animatedTypeMedia ,
3535 audioSlug ,
36+ bulkUploadsHookErrorSlug ,
3637 bulkUploadsSlug ,
3738 constructorOptionsSlug ,
3839 customFileNameMediaSlug ,
@@ -109,6 +110,7 @@ let consoleErrorsFromPage: string[] = []
109110let collectErrorsFromPage : ( ) => boolean
110111let stopCollectingErrorsFromPage : ( ) => boolean
111112let bulkUploadsURL : AdminUrlUtil
113+ let bulkUploadsHookErrorURL : AdminUrlUtil
112114let fileMimeTypeURL : AdminUrlUtil
113115let svgOnlyURL : AdminUrlUtil
114116let mediaWithoutDeleteAccessURL : AdminUrlUtil
@@ -153,6 +155,7 @@ describe('Uploads', () => {
153155 threeDimensionalURL = new AdminUrlUtil ( serverURL , threeDimensionalSlug )
154156 constructorOptionsURL = new AdminUrlUtil ( serverURL , constructorOptionsSlug )
155157 bulkUploadsURL = new AdminUrlUtil ( serverURL , bulkUploadsSlug )
158+ bulkUploadsHookErrorURL = new AdminUrlUtil ( serverURL , bulkUploadsHookErrorSlug )
156159 fileMimeTypeURL = new AdminUrlUtil ( serverURL , fileMimeTypeSlug )
157160 svgOnlyURL = new AdminUrlUtil ( serverURL , svgOnlySlug )
158161 mediaWithoutDeleteAccessURL = new AdminUrlUtil ( serverURL , mediaWithoutDeleteAccessSlug )
@@ -1671,6 +1674,51 @@ describe('Uploads', () => {
16711674 const errorCount = bulkUploadModal . locator ( '.file-selections .error-pill__count' ) . first ( )
16721675 await expect ( errorCount ) . toHaveText ( '1' )
16731676 } )
1677+
1678+ test ( 'should report failure when beforeChange hook throws non-field error' , async ( ) => {
1679+ await page . goto ( bulkUploadsHookErrorURL . list )
1680+
1681+ await expect ( page . locator ( '.list-header__title' ) ) . toBeVisible ( )
1682+
1683+ const bulkUploadButton = page . locator ( '.list-header__title-actions button' , {
1684+ hasText : 'Bulk Upload' ,
1685+ } )
1686+ await expect ( bulkUploadButton ) . toBeEnabled ( )
1687+
1688+ const dropzoneInput = page . locator ( '.dropzone input[type="file"]' )
1689+ await expect ( async ( ) => {
1690+ await bulkUploadButton . click ( )
1691+ await expect ( dropzoneInput ) . toBeAttached ( { timeout : 1500 } )
1692+ } ) . toPass ( { timeout : 5000 , intervals : [ 500 ] } )
1693+
1694+ await page
1695+ . locator ( '.dropzone input[type="file"]' )
1696+ . setInputFiles ( [ path . resolve ( dirname , './image.png' ) , path . resolve ( dirname , './small.png' ) ] )
1697+
1698+ const nextButton = page . locator ( '.bulk-upload--actions-bar__controls button:nth-of-type(2)' )
1699+ await nextButton . click ( )
1700+
1701+ await page . locator ( '#field-shouldFail' ) . check ( )
1702+
1703+ const saveButton = page . locator ( '.bulk-upload--actions-bar__saveButtons button' )
1704+ await saveButton . click ( )
1705+
1706+ await expect ( page . locator ( '.payload-toast-container .toast-success' ) ) . toContainText (
1707+ 'Successfully saved 1 files' ,
1708+ )
1709+ await expect (
1710+ page . locator ( '.payload-toast-container .toast-error:has-text("Failed to save 1 files")' ) ,
1711+ ) . toBeVisible ( )
1712+ await expect (
1713+ page . locator (
1714+ '.payload-toast-container .toast-error:has-text("Simulated hook error in beforeChange")' ,
1715+ ) ,
1716+ ) . toBeVisible ( )
1717+
1718+ await expect ( page . locator ( '.file-selections .file-selections__fileRowContainer' ) ) . toHaveCount (
1719+ 1 ,
1720+ )
1721+ } )
16741722 } )
16751723
16761724 describe ( 'remote url fetching' , ( ) => {
0 commit comments