Skip to content

Commit b3c72b3

Browse files
committed
test: add tests for dirty watch file patterns
Add failing tests that ensure dirty file watching is matching patterns from the files options exactly like ESLint. Add folder fixture because handling folder paths requires checking existence of folders. Preparation for requested change in webpack#11.
1 parent fcba5ce commit b3c72b3

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import { resolve } from 'path';
2+
3+
import DirtyFileWatcher from '../src/DirtyFileWatcher';
4+
5+
describe('dirty file watcher file patterns', () => {
6+
const fixtures = resolve(__dirname, 'fixtures');
7+
8+
it('watches pattern "folder"', () => {
9+
const watcher = new DirtyFileWatcher({
10+
files: [resolve(fixtures, 'folder')],
11+
});
12+
13+
const inFolder = resolve(fixtures, 'folder/inside.js');
14+
const inNestedFolder = resolve(fixtures, 'folder/nested/inside.js');
15+
const wrongExtension = resolve(fixtures, 'folder/wrong.ts');
16+
const outside = resolve(fixtures, 'outside.js');
17+
18+
watcher.getDirtyFiles({
19+
fileTimestamps: new Map([
20+
[inFolder, { timestamp: 1 }],
21+
[inNestedFolder, { timestamp: 1 }],
22+
[wrongExtension, { timestamp: 1 }],
23+
[outside, { timestamp: 1 }],
24+
]),
25+
});
26+
const dirtyFiles = watcher.getDirtyFiles({
27+
fileTimestamps: new Map([
28+
[inFolder, { timestamp: 2 }],
29+
[inNestedFolder, { timestamp: 2 }],
30+
[wrongExtension, { timestamp: 2 }],
31+
[outside, { timestamp: 2 }],
32+
]),
33+
});
34+
35+
expect(dirtyFiles).toHaveLength(2);
36+
expect(dirtyFiles).toContain(inFolder);
37+
expect(dirtyFiles).toContain(inNestedFolder);
38+
});
39+
40+
it('watches folder pattern "folder/"', () => {
41+
const watcher = new DirtyFileWatcher({
42+
files: [resolve(fixtures, 'folder/')],
43+
});
44+
45+
const inFolder = resolve(fixtures, 'folder/inside.js');
46+
const inNestedFolder = resolve(fixtures, 'folder/nested/inside.js');
47+
const wrongExtension = resolve(fixtures, 'folder/wrong.ts');
48+
const outside = resolve(fixtures, 'outside.js');
49+
50+
watcher.getDirtyFiles({
51+
fileTimestamps: new Map([
52+
[inFolder, { timestamp: 1 }],
53+
[inNestedFolder, { timestamp: 1 }],
54+
[wrongExtension, { timestamp: 1 }],
55+
[outside, { timestamp: 1 }],
56+
]),
57+
});
58+
const dirtyFiles = watcher.getDirtyFiles({
59+
fileTimestamps: new Map([
60+
[inFolder, { timestamp: 2 }],
61+
[inNestedFolder, { timestamp: 2 }],
62+
[wrongExtension, { timestamp: 2 }],
63+
[outside, { timestamp: 2 }],
64+
]),
65+
});
66+
67+
expect(dirtyFiles).toHaveLength(2);
68+
expect(dirtyFiles).toContain(inFolder);
69+
expect(dirtyFiles).toContain(inNestedFolder);
70+
});
71+
72+
it('watches glob pattern "**/*"', () => {
73+
const watcher = new DirtyFileWatcher({
74+
files: [resolve(fixtures, '**/*')],
75+
});
76+
77+
const inside = resolve(fixtures, 'inside.js');
78+
const inNestedFolder = resolve(fixtures, 'folder/nested/inside.js');
79+
const wrongExtension = resolve(fixtures, 'wrong.ts');
80+
81+
watcher.getDirtyFiles({
82+
fileTimestamps: new Map([
83+
[inside, { timestamp: 1 }],
84+
[inNestedFolder, { timestamp: 1 }],
85+
[wrongExtension, { timestamp: 1 }],
86+
]),
87+
});
88+
const dirtyFiles = watcher.getDirtyFiles({
89+
fileTimestamps: new Map([
90+
[inside, { timestamp: 2 }],
91+
[inNestedFolder, { timestamp: 2 }],
92+
[wrongExtension, { timestamp: 2 }],
93+
]),
94+
});
95+
96+
expect(dirtyFiles).toHaveLength(3);
97+
expect(dirtyFiles).toContain(inside);
98+
expect(dirtyFiles).toContain(inNestedFolder);
99+
// options.extensions should not be enforced on file and glob patterns.
100+
expect(dirtyFiles).toContain(wrongExtension);
101+
});
102+
103+
it('watches file pattern "good.js"', () => {
104+
const file = resolve(fixtures, 'good.js');
105+
const watcher = new DirtyFileWatcher({
106+
files: [file],
107+
extensions: ['.ts'],
108+
});
109+
110+
watcher.getDirtyFiles({
111+
fileTimestamps: new Map([[file, { timestamp: 1 }]]),
112+
});
113+
const dirtyFiles = watcher.getDirtyFiles({
114+
fileTimestamps: new Map([[file, { timestamp: 2 }]]),
115+
});
116+
117+
// options.extensions should not be enforced on file and glob patterns.
118+
expect(dirtyFiles).toHaveLength(1);
119+
expect(dirtyFiles).toContain(file);
120+
});
121+
122+
it('uses extensions with folder patterns', () => {
123+
const watcher = new DirtyFileWatcher({
124+
files: [resolve(fixtures, 'folder/')],
125+
extensions: ['ts', '.tsx'],
126+
});
127+
128+
const inFolder = resolve(fixtures, 'folder/inside.tsx');
129+
const inNestedFolder = resolve(fixtures, 'folder/nested/inside.ts');
130+
const wrongExtension = resolve(fixtures, 'folder/wrong.js');
131+
const outside = resolve(fixtures, 'outside.ts');
132+
133+
watcher.getDirtyFiles({
134+
fileTimestamps: new Map([
135+
[inFolder, { timestamp: 1 }],
136+
[inNestedFolder, { timestamp: 1 }],
137+
[wrongExtension, { timestamp: 1 }],
138+
[outside, { timestamp: 1 }],
139+
]),
140+
});
141+
const dirtyFiles = watcher.getDirtyFiles({
142+
fileTimestamps: new Map([
143+
[inFolder, { timestamp: 2 }],
144+
[inNestedFolder, { timestamp: 2 }],
145+
[wrongExtension, { timestamp: 2 }],
146+
[outside, { timestamp: 2 }],
147+
]),
148+
});
149+
150+
expect(dirtyFiles).toHaveLength(2);
151+
expect(dirtyFiles).toContain(inFolder);
152+
expect(dirtyFiles).toContain(inNestedFolder);
153+
});
154+
});

test/fixtures/folder/readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This folder is used as a fixture for dirty file watching.

0 commit comments

Comments
 (0)