18d307f52SEvan Baconimport { fs, vol } from 'memfs'; 28d307f52SEvan Bacon 3fa5bc561SWill Schurmanimport { asMock } from '../../__tests__/asMock'; 48d307f52SEvan Baconimport * as Log from '../../log'; 58d307f52SEvan Baconimport { FileNotifier } from '../FileNotifier'; 68d307f52SEvan Bacon 78d307f52SEvan Baconjest.mock('../../log'); 88d307f52SEvan Bacon 98d307f52SEvan Baconconst originalCwd = process.cwd(); 108d307f52SEvan Bacon 118d307f52SEvan BaconbeforeEach(() => { 128d307f52SEvan Bacon vol.reset(); 138d307f52SEvan Bacon}); 148d307f52SEvan Bacon 158d307f52SEvan BaconbeforeAll(() => { 168d307f52SEvan Bacon process.chdir('/'); 178d307f52SEvan Bacon // @ts-expect-error 188d307f52SEvan Bacon fs.watchFile = jest.fn(fs.watchFile); 198d307f52SEvan Bacon}); 208d307f52SEvan Bacon 218d307f52SEvan BaconafterAll(() => { 228d307f52SEvan Bacon process.chdir(originalCwd); 238d307f52SEvan Bacon}); 248d307f52SEvan Bacon 258d307f52SEvan Baconit('returns null when no files can be found', () => { 268d307f52SEvan Bacon vol.fromJSON({}, '/'); 278d307f52SEvan Bacon const fileNotifier = new FileNotifier('./', ['babel.config.js']); 288d307f52SEvan Bacon expect(fileNotifier.startObserving()).toBe(null); 298d307f52SEvan Bacon}); 308d307f52SEvan Bacon 318d307f52SEvan Baconit('observes the first existing file', () => { 328d307f52SEvan Bacon asMock(fs.watchFile) 338d307f52SEvan Bacon // @ts-expect-error 348d307f52SEvan Bacon .mockImplementationOnce((_, callback) => { 358d307f52SEvan Bacon // @ts-expect-error: polymorphism 368d307f52SEvan Bacon callback({}, { size: 1 }); 378d307f52SEvan Bacon }); 388d307f52SEvan Bacon 398d307f52SEvan Bacon vol.fromJSON( 408d307f52SEvan Bacon { 418d307f52SEvan Bacon 'babel.config.js': '', 428d307f52SEvan Bacon }, 438d307f52SEvan Bacon '/' 448d307f52SEvan Bacon ); 45fdf34e39SEvan Bacon const fileNotifier = new FileNotifier( 46fdf34e39SEvan Bacon './', 47fdf34e39SEvan Bacon [ 488d307f52SEvan Bacon // Skips this file 498d307f52SEvan Bacon '.babelrc', 508d307f52SEvan Bacon // Starts observing 518d307f52SEvan Bacon 'babel.config.js', 52fdf34e39SEvan Bacon ], 53fdf34e39SEvan Bacon { additionalWarning: ' foobar' } 54fdf34e39SEvan Bacon ); 55*c5d00206SEvan Bacon expect(fileNotifier.startObserving()).toBe('/babel.config.js'); 568d307f52SEvan Bacon 578d307f52SEvan Bacon // We mock out the callback firing and test that a warning was logged. 588d307f52SEvan Bacon expect(Log.log).toBeCalledTimes(1); 598d307f52SEvan Bacon expect(Log.log).toBeCalledWith(expect.stringContaining('babel.config.js')); 60fdf34e39SEvan Bacon expect(Log.log).toBeCalledWith(expect.stringContaining('foobar')); 618d307f52SEvan Bacon}); 62