11import { GenericDataTable } from '@anywaydata/core/data_formats/generic-data-table.js' ;
22import { jest } from '@jest/globals' ;
3- import { fireEvent , waitFor } from '@testing-library/dom' ;
3+ import { fireEvent } from '@testing-library/dom' ;
44import { JSDOM } from 'jsdom' ;
5- import * as importExportWorkspaceExports from '../../../js/gui_components/app/import-export-workspace/index.js' ;
65import { createImportExportWorkspaceComponent } from '../../../js/gui_components/app/import-export-workspace/index.js' ;
6+ import { waitForMicrotaskAssertions } from '../helpers/wait-for-microtasks.js' ;
77
88function createTable ( rowCount = 3 ) {
99 const dataTable = new GenericDataTable ( ) ;
@@ -103,14 +103,6 @@ describe('ImportExportWorkspace', () => {
103103 delete global . window ;
104104 } ) ;
105105
106- test ( 'public barrel is component-factory-only' , ( ) => {
107- expect ( importExportWorkspaceExports . createImportExportWorkspaceComponent ) . toBe (
108- createImportExportWorkspaceComponent
109- ) ;
110- expect ( importExportWorkspaceExports . ImportExportWorkspaceController ) . toBeUndefined ( ) ;
111- expect ( importExportWorkspaceExports . ImportExportWorkspaceView ) . toBeUndefined ( ) ;
112- } ) ;
113-
114106 test ( 'mounts real controls, normalizes preview row count, and renders format previews without legacy controls' , ( ) => {
115107 const { component, documentObj, dom, exporter } = createHarness ( {
116108 props : { previewRowLimit : 0 } ,
@@ -216,11 +208,13 @@ describe('ImportExportWorkspace', () => {
216208
217209 fireEvent . click ( importButton ) ;
218210
219- await waitFor ( ( ) => expect ( importer . setGridFromGenericDataTable ) . toHaveBeenCalledTimes ( 1 ) ) ;
220- expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:2' ) ;
221- expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
222- expect ( component . getState ( ) . previewTextDirty ) . toBe ( false ) ;
223- expect ( importButton . disabled ) . toBe ( true ) ;
211+ await waitForMicrotaskAssertions ( ( ) => {
212+ expect ( importer . setGridFromGenericDataTable ) . toHaveBeenCalledTimes ( 1 ) ;
213+ expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:2' ) ;
214+ expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
215+ expect ( component . getState ( ) . previewTextDirty ) . toBe ( false ) ;
216+ expect ( importButton . disabled ) . toBe ( true ) ;
217+ } ) ;
224218
225219 component . destroy ( ) ;
226220 dom . window . close ( ) ;
@@ -258,15 +252,15 @@ describe('ImportExportWorkspace', () => {
258252
259253 fireEvent . click ( documentObj . querySelector ( '#filedownload' ) ) ;
260254
261- await waitFor ( ( ) =>
255+ await waitForMicrotaskAssertions ( ( ) => {
262256 expect ( downloadService . downloadText ) . toHaveBeenCalledWith ( 'export.csv' , 'full:csv' , {
263257 exportEncodingSettings : {
264258 lineEnding : 'lf' ,
265259 includeBom : true ,
266260 } ,
267- } )
268- ) ;
269- expect ( documentObj . querySelector ( '#export-progress-status' ) . textContent ) . toBe ( 'Download started.' ) ;
261+ } ) ;
262+ expect ( documentObj . querySelector ( '#export-progress-status' ) . textContent ) . toBe ( 'Download started.' ) ;
263+ } ) ;
270264
271265 component . destroy ( ) ;
272266 dom . window . close ( ) ;
@@ -291,14 +285,16 @@ describe('ImportExportWorkspace', () => {
291285 } ) ;
292286 fireEvent . change ( fileInput ) ;
293287
294- await waitFor ( ( ) => expect ( fileReadService . readText ) . toHaveBeenCalledTimes ( 1 ) ) ;
295- expect ( importer . setImportSettings ) . toHaveBeenCalledWith ( {
296- trimInput : false ,
297- trimInputFieldsCsv : '' ,
288+ await waitForMicrotaskAssertions ( ( ) => {
289+ expect ( fileReadService . readText ) . toHaveBeenCalledTimes ( 1 ) ;
290+ expect ( importer . setImportSettings ) . toHaveBeenCalledWith ( {
291+ trimInput : false ,
292+ trimInputFieldsCsv : '' ,
293+ } ) ;
294+ expect ( importer . setGridFromGenericDataTable ) . toHaveBeenCalledTimes ( 1 ) ;
295+ expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:1' ) ;
296+ expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
298297 } ) ;
299- await waitFor ( ( ) => expect ( importer . setGridFromGenericDataTable ) . toHaveBeenCalledTimes ( 1 ) ) ;
300- expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:1' ) ;
301- expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
302298
303299 component . destroy ( ) ;
304300 dom . window . close ( ) ;
@@ -317,16 +313,16 @@ describe('ImportExportWorkspace', () => {
317313
318314 fireEvent . click ( documentObj . querySelector ( '[data-role="clipboard-import-button"]' ) ) ;
319315
320- await waitFor ( ( ) => expect ( clipboardService . readText ) . toHaveBeenCalledTimes ( 1 ) ) ;
321- expect ( importer . setImportSettings ) . toHaveBeenCalledWith ( {
322- trimInput : false ,
323- trimInputFieldsCsv : '' ,
316+ await waitForMicrotaskAssertions ( ( ) => {
317+ expect ( clipboardService . readText ) . toHaveBeenCalledTimes ( 1 ) ;
318+ expect ( importer . setImportSettings ) . toHaveBeenCalledWith ( {
319+ trimInput : false ,
320+ trimInputFieldsCsv : '' ,
321+ } ) ;
322+ expect ( importer . importText ) . toHaveBeenCalledWith ( 'csv' , 'Name,Role\nAda,Engineer' ) ;
323+ expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:1' ) ;
324+ expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
324325 } ) ;
325- await waitFor ( ( ) => expect ( importer . importText ) . toHaveBeenCalledWith ( 'csv' , 'Name,Role\nAda,Engineer' ) ) ;
326- await waitFor ( ( ) => expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:1' ) ) ;
327- await waitFor ( ( ) =>
328- expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' )
329- ) ;
330326
331327 component . destroy ( ) ;
332328 dom . window . close ( ) ;
@@ -403,9 +399,11 @@ describe('ImportExportWorkspace', () => {
403399 readerInstance . emit ( 'progress' , { loaded : 5 , total : 10 , lengthComputable : true } ) ;
404400 readerInstance . emit ( 'load' , { target : { result : 'Name,Role\nAda,Engineer' } } ) ;
405401
406- await waitFor ( ( ) => expect ( importer . setGridFromGenericDataTable ) . toHaveBeenCalledTimes ( 1 ) ) ;
407- expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:1' ) ;
408- expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
402+ await waitForMicrotaskAssertions ( ( ) => {
403+ expect ( importer . setGridFromGenericDataTable ) . toHaveBeenCalledTimes ( 1 ) ;
404+ expect ( getPreviewTextArea ( documentObj ) . value ) . toBe ( 'csv:rows:1' ) ;
405+ expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
406+ } ) ;
409407 } finally {
410408 if ( typeof originalFileReader === 'undefined' ) {
411409 delete global . FileReader ;
@@ -442,19 +440,21 @@ describe('ImportExportWorkspace', () => {
442440 trimInput : false ,
443441 trimInputFieldsCsv : '' ,
444442 } ) ;
445- await waitFor ( ( ) => expect ( importer . importText ) . toHaveBeenCalledWith ( 'csv' , textArea . value ) ) ;
446- expect ( component . getState ( ) . importBusy ) . toBe ( false ) ;
447- expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
443+ await waitForMicrotaskAssertions ( ( ) => {
444+ expect ( importer . importText ) . toHaveBeenCalledWith ( 'csv' , textArea . value ) ;
445+ expect ( component . getState ( ) . importBusy ) . toBe ( false ) ;
446+ expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe ( 'Import complete.' ) ;
447+ } ) ;
448448
449449 importer . importText . mockRejectedValueOnce ( new Error ( 'boom' ) ) ;
450450 fireEvent . click ( importButton ) ;
451451
452- await waitFor ( ( ) =>
452+ await waitForMicrotaskAssertions ( ( ) => {
453453 expect ( documentObj . querySelector ( '#import-progress-status' ) . textContent ) . toBe (
454454 'Import failed. Check file format/options.'
455- )
456- ) ;
457- expect ( component . getState ( ) . importBusy ) . toBe ( false ) ;
455+ ) ;
456+ expect ( component . getState ( ) . importBusy ) . toBe ( false ) ;
457+ } ) ;
458458
459459 component . destroy ( ) ;
460460 dom . window . close ( ) ;
@@ -534,12 +534,12 @@ describe('ImportExportWorkspace', () => {
534534 } ) ;
535535
536536 fireEvent . click ( documentObj . querySelector ( '[data-role="clipboard-import-button"]' ) ) ;
537- await waitFor ( ( ) =>
537+ await waitForMicrotaskAssertions ( ( ) => {
538538 expect ( importer . setImportSettings ) . toHaveBeenCalledWith ( {
539539 trimInput : true ,
540540 trimInputFieldsCsv : 'Role' ,
541- } )
542- ) ;
541+ } ) ;
542+ } ) ;
543543
544544 const fileInput = documentObj . querySelector ( '#csvinput' ) ;
545545 Object . defineProperty ( fileInput , 'files' , {
@@ -548,12 +548,12 @@ describe('ImportExportWorkspace', () => {
548548 } ) ;
549549 fireEvent . change ( fileInput ) ;
550550
551- await waitFor ( ( ) =>
551+ await waitForMicrotaskAssertions ( ( ) => {
552552 expect ( importer . setImportSettings ) . toHaveBeenLastCalledWith ( {
553553 trimInput : true ,
554554 trimInputFieldsCsv : 'Role' ,
555- } )
556- ) ;
555+ } ) ;
556+ } ) ;
557557
558558 component . destroy ( ) ;
559559 dom . window . close ( ) ;
0 commit comments