@@ -5,34 +5,49 @@ import t, { Test } from 'tap'
55// and that when the cb returns an error, the promised version fails,
66// and when the cb returns data, the promisified version resolves to it.
77import realFS from 'fs'
8+ import realFSP from 'fs/promises'
89import * as fs from '../src/fs.js'
910import { useNative } from '../src/use-native.js'
1011
1112type MockCb = ( e : Error | null , m ?: string ) => void
1213type MockFsCb = Record < string , ( cb : MockCb ) => void >
1314type MockFsPromise = Record < string , ( ) => Promise < void > >
1415
15- const mockFs = async ( t : Test , mock : MockFsCb ) =>
16+ const mockFs = async ( t : Test , fs : MockFsCb = { } , fsp : MockFsPromise = { } ) =>
1617 ( await t . mockImport ( '../src/fs.js' , {
17- fs : t . createMock ( realFS , mock ) ,
18+ fs : t . createMock ( realFS , fs ) ,
19+ 'fs/promises' : t . createMock ( realFSP , fsp ) ,
1820 } ) ) as typeof import ( '../src/fs.js' )
1921
2022const mockFSMethodPass =
2123 ( method : string ) =>
2224 ( ...args : unknown [ ] ) => {
2325 process . nextTick ( ( ) => ( args . at ( - 1 ) as MockCb ) ( null , method ) )
2426 }
27+ const mockFSPromiseMethodPass =
28+ ( _method : string ) =>
29+ ( ) => new Promise < void > ( ( resolve , _reject ) => {
30+ resolve ( )
31+ } )
2532const mockFSMethodFail =
26- ( ) =>
33+ ( _ : string ) =>
2734 ( ...args : unknown [ ] ) => {
2835 process . nextTick ( ( ) => ( args . at ( - 1 ) as MockCb ) ( new Error ( 'oops' ) ) )
2936 }
37+ const mockFSPromiseMethodFail =
38+ ( _method : string ) =>
39+ ( ) => new Promise < void > ( ( _resolve , reject ) => {
40+ reject ( new Error ( 'oops' ) )
41+ } )
3042
3143t . type ( fs . promises , Object )
3244const mockFSPass : MockFsCb = { }
3345const mockFSFail : MockFsCb = { }
46+ const mockFSPromisesFail : MockFsPromise = { }
47+ const mockFSPromisesPass : MockFsPromise = { }
3448
3549for ( const method of Object . keys ( fs . promises ) ) {
50+
3651 // of course fs.rm is missing when we shouldn't use native :)
3752 // also, readdirSync is clubbed to always return file types
3853 if ( method !== 'rm' || useNative ( ) ) {
@@ -52,7 +67,9 @@ for (const method of Object.keys(fs.promises)) {
5267
5368 // set up our pass/fails for the next tests
5469 mockFSPass [ method ] = mockFSMethodPass ( method )
55- mockFSFail [ method ] = mockFSMethodFail ( )
70+ mockFSPromisesPass [ method ] = mockFSPromiseMethodPass ( method )
71+ mockFSFail [ method ] = mockFSMethodFail ( method )
72+ mockFSPromisesFail [ method ] = mockFSPromiseMethodFail ( method )
5673}
5774
5875// doesn't have any sync versions that aren't promisified
@@ -69,18 +86,17 @@ for (const method of Object.keys(fs)) {
6986}
7087
7188t . test ( 'passing resolves promise' , async t => {
72- const fs = await mockFs ( t , mockFSPass )
89+ const fs = await mockFs ( t , mockFSPass , mockFSPromisesPass )
7390 for ( const [ m , fn ] of Object . entries (
7491 fs . promises as unknown as MockFsPromise ,
7592 ) ) {
76- const expected =
77- [ 'chmod' , 'rename' , 'rm' , 'rmdir' , 'unlink' ] . includes ( m ) ? undefined : m
78- t . same ( await fn ( ) , expected , `got expected value for ${ m } ` )
93+ t . same ( await fn ( ) , undefined , `${ m } is a Promise<void> method` )
7994 }
8095} )
8196
8297t . test ( 'failing rejects promise' , async t => {
83- const fs = await mockFs ( t , mockFSFail )
98+ const fs = await mockFs ( t , mockFSFail , mockFSPromisesFail )
99+
84100 for ( const [ m , fn ] of Object . entries (
85101 fs . promises as unknown as MockFsPromise ,
86102 ) ) {
0 commit comments