/
batched-file-reader.test.ts
66 lines (59 loc) · 1.88 KB
/
batched-file-reader.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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)
})
})