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