Home Reference Source

src/files-by-directory.spec.js

import '@babel/polyfill'; // Required for NodeJS < 10
import { values } from './async';
import getFilesByDirectory from './files-by-directory';
import defaults from './options';
import {
  file1a,
  level1,
  level2,
  level2Files,
  level3,
  level3Files,
  emptyDirectory,
} from '../fixture';

/** @test {filesByDirectory} */
describe('filesByDirectory', () => {
  it('returns an asynchronousiterator', () => {
    const iterator = getFilesByDirectory([file1a]);
    expect(iterator.next).toBeFunction();
    expect(iterator.next()).toBeInstanceOf(Promise);
  });

  it('generates asynchronously an array containing the file when path is a file', async () => {
    expect(await values(getFilesByDirectory([file1a]))).toMatchSnapshot();
  });

  it('generates asynchronously an array of files when given path is a directory containing only files', async () => {
    expect(await values(getFilesByDirectory([level3]))).toMatchSnapshot();
  });

  it('generates one array per directory when given path is a directory containing sub-directories', async () => {
    expect(await values(getFilesByDirectory([level2]))).toMatchSnapshot();
  });

  it('omits double directory paths', async () => {
    expect(await values(getFilesByDirectory([level3, level3]))).toMatchSnapshot();
  });

  it('omits double file paths', async () => {
    expect(await values(getFilesByDirectory([file1a, file1a]))).toMatchSnapshot();
  });

  it('omits descendant directory paths', async () => {
    expect(await values(getFilesByDirectory([level2, level3]))).toMatchSnapshot();
    expect(await values(getFilesByDirectory([level3, level2]))).toMatchSnapshot();
  });

  it('omits descendant file paths', async () => {
    expect(await values(getFilesByDirectory([level3, level3Files[0]]))).toMatchSnapshot();
    expect(await values(getFilesByDirectory([level3Files[0], level3]))).toMatchSnapshot();
  });

  it('groups regular files by parent path', async () => {
    expect(await values(getFilesByDirectory(level3Files))).toMatchSnapshot();
    expect(await values(getFilesByDirectory([...level2Files, ...level3Files]))).toMatchSnapshot();
    expect(await values(getFilesByDirectory([...level3Files, ...level2Files]))).toMatchSnapshot();
  });

  describe('options', () => {
    async function testGetFilesByDirectoryWithOptions(options) {
      expect(await values(getFilesByDirectory([level3], options))).toMatchSnapshot();
      expect(await values(getFilesByDirectory([level2], options))).toMatchSnapshot();
      expect(await values(getFilesByDirectory([level1], options))).toMatchSnapshot();
      expect(
        await values(getFilesByDirectory([level3, ...level2Files], options)),
      ).toMatchSnapshot();
    }

    describe('excludeSymlinks', () => {
      it('is false by default', () => {
        expect(defaults.excludeSymlinks).toBe(false);
      });

      it('excludes symbolic links when excludeSymlinks is true', async () => {
        await testGetFilesByDirectoryWithOptions({ excludeSymlinks: true });
      });

      it('includes symbolic links when excludeSymlinks is false', async () => {
        await testGetFilesByDirectoryWithOptions({ excludeSymlinks: false });
      });
    });

    describe('directoriesFirst', () => {
      it('is false by default', () => {
        expect(defaults.excludeSymlinks).toBe(false);
      });

      it('generates files first when directoriesFirst is true', async () => {
        await testGetFilesByDirectoryWithOptions({ directoriesFirst: true });
      });

      it('generates directories first when directoriesFirst is false', async () => {
        await testGetFilesByDirectoryWithOptions({ directoriesFirst: false });
      });
    });

    describe('showDirectories', () => {
      it('is false by default', () => {
        expect(defaults.showDirectories).toBe(false);
      });

      it('generates files with their directory when showDirectories is true', async () => {
        await testGetFilesByDirectoryWithOptions({ showDirectories: true });
      });

      it('generates files without their directory when showDirectories is false', async () => {
        await testGetFilesByDirectoryWithOptions({ showDirectories: false });
      });
    });

    describe('followSymlinks', () => {
      it('is false by default', () => {
        expect(defaults.followSymlinks).toBe(false);
      });

      it('does not resolve symbolic links when followSymlinks is false', async () => {
        const options = { followSymlinks: false };
        expect(await values(getFilesByDirectory([level3], options))).toMatchSnapshot();
        expect(await values(getFilesByDirectory([level2], options))).toMatchSnapshot();
        expect(
          await values(getFilesByDirectory([level3, ...level2Files], options)),
        ).toMatchSnapshot();
      });

      it('resolves symbolic links when followSymlinks is true', async () => {
        const options = { followSymlinks: true };
        expect(await values(getFilesByDirectory([level3], options))).toMatchSnapshot();
        expect(await values(getFilesByDirectory([level2], options))).toMatchSnapshot();
        expect(
          await values(getFilesByDirectory([level3, ...level2Files], options)),
        ).toMatchSnapshot();
      });
    });

    describe('skipEmptyDirectories', () => {
      it('is true by default', () => {
        expect(defaults.skipEmptyDirectories).toBe(true);
      });

      it('skips empty directories when skipEmptyDirectories is true', async () => {
        expect(
          await values(
            getFilesByDirectory([emptyDirectory, level3], {
              skipEmptyDirectories: true,
            }),
          ),
        ).toMatchSnapshot();
      });

      it('includes empty directories when skipEmptyDirectories is false', async () => {
        expect(
          await values(
            getFilesByDirectory([emptyDirectory, level3], {
              skipEmptyDirectories: false,
            }),
          ),
        ).toMatchSnapshot();
      });
    });
  });
});