next.js/packages/next/src/server/route-matcher-providers/dev/helpers/file-reader/batched-file-reader.test.ts
batched-file-reader.test.ts67 lines1.9 KB
import { BatchedFileReader } from './batched-file-reader'
import type { FileReader } from './file-reader'

describe('CachedFileReader', () => {
  it('will only scan the filesystem a minimal amount of times', async () => {
    const pages = ['1', '2', '3']
    const app = ['4', '5', '6']

    const reader: FileReader = {
      read: jest.fn(async (directory: string) => {
        switch (directory) {
          case '<root>/pages':
            return pages
          case '<root>/app':
            return app
          default:
            throw new Error('unexpected')
        }
      }),
    }
    const cached = new BatchedFileReader(reader)

    const results = await Promise.all([
      cached.read('<root>/pages'),
      cached.read('<root>/pages'),
      cached.read('<root>/app'),
      cached.read('<root>/app'),
    ])

    expect(reader.read).toHaveBeenCalledTimes(2)
    expect(results).toHaveLength(4)
    expect(results[0]).toBe(pages)
    expect(results[1]).toBe(pages)
    expect(results[2]).toBe(app)
    expect(results[3]).toBe(app)
  })

  it('will send an error back only to the correct reader', async () => {
    const resolved: string[] = []
    const reader: FileReader = {
      read: jest.fn(async (directory: string) => {
        switch (directory) {
          case 'reject':
            throw new Error('rejected')
          case 'resolve':
            return resolved
          default:
            throw new Error('should not occur')
        }
      }),
    }
    const cached = new BatchedFileReader(reader)

    await Promise.all(
      ['reject', 'resolve', 'reject', 'resolve'].map(async (directory) => {
        if (directory === 'reject') {
          await expect(cached.read(directory)).rejects.toThrow('rejected')
        } else {
          await expect(cached.read(directory)).resolves.toEqual(resolved)
        }
      })
    )

    expect(reader.read).toHaveBeenCalledTimes(2)
  })
})
Quest for Codev2.0.0
/
SIGN IN