Skip to content

Commit 609a66d

Browse files
author
Piotr Oleś
committed
Tests
1 parent cb0c75a commit 609a66d

7 files changed

+662
-8
lines changed

test/CancellationToken.spec.js

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,115 @@
11
var describe = require('mocha').describe;
2+
var it = require('mocha').it;
3+
var os = require('os');
4+
var ts = require('typescript');
5+
var fs = require('fs');
6+
var beforeEach = require('mocha').beforeEach;
7+
var afterEach = require('mocha').afterEach;
8+
var expect = require('chai').expect;
9+
var mockFs = require('mock-fs');
10+
var CancellationToken = require('../lib/CancellationToken');
211

312
describe('CancellationToken', function () {
4-
// TODO...
13+
beforeEach(function () {
14+
var fsTree = {};
15+
fsTree[os.tmpdir()] = mockFs.directory();
16+
17+
mockFs(fsTree);
18+
});
19+
20+
afterEach(function () {
21+
mockFs.restore();
22+
});
23+
24+
it('should create valid cancellation token', function () {
25+
var tokenA = new CancellationToken();
26+
expect(tokenA.isCancellationRequested()).to.be.false;
27+
28+
var tokenB = new CancellationToken('FA#FERgSERgRT$rA$#rA#Ea@RweFRgERG');
29+
expect(tokenB.isCancellationRequested()).to.be.false;
30+
31+
var tokenC = new CancellationToken('GFERWgEgeF#R2erwreWrweWER', false);
32+
expect(tokenC.isCancellationRequested()).to.be.false;
33+
34+
var tokenD = new CancellationToken('REGg$#R2$#@r@#R$#T43T$#t43t', true);
35+
expect(tokenD.isCancellationRequested()).to.be.true;
36+
});
37+
38+
it('should serialize to JSON', function () {
39+
var tokenA = new CancellationToken();
40+
var json = JSON.stringify(tokenA);
41+
42+
expect(json).to.be.a('string');
43+
expect(function() { JSON.parse(json); }).to.not.throw(Error);
44+
expect(JSON.parse(json)).to.be.a('object');
45+
46+
var tokenB = CancellationToken.createFromJSON(JSON.parse(json));
47+
expect(tokenA.getCancellationFilePath()).to.be.equal(tokenB.getCancellationFilePath());
48+
expect(tokenA.isCancellationRequested()).to.be.equal(tokenB.isCancellationRequested());
49+
});
50+
51+
it('should generate path in os.tmpdir() directory', function () {
52+
var tokenA = new CancellationToken();
53+
54+
expect(tokenA.getCancellationFilePath().indexOf(os.tmpdir())).to.be.equal(0);
55+
});
56+
57+
it('should throw ts.OperationCanceledException error on cancelled', function () {
58+
var tokenA = new CancellationToken();
59+
expect(function () { tokenA.throwIfCancellationRequested(); }).to.not.throw();
60+
61+
var tokenB = new CancellationToken('rgeer#R23r$#T$3t#$t43', true);
62+
expect(function () { tokenB.throwIfCancellationRequested(); }).to.throw(ts.OperationCanceledException);
63+
});
64+
65+
it('should write file in filesystem on requestCancellation', function () {
66+
var tokenA = new CancellationToken();
67+
tokenA.requestCancellation();
68+
69+
expect(tokenA.isCancellationRequested()).to.be.true;
70+
expect(fs.existsSync(tokenA.getCancellationFilePath())).to.be.true;
71+
});
72+
73+
it('should cleanup file on cleanupCancellation', function () {
74+
var tokenA = new CancellationToken();
75+
tokenA.requestCancellation();
76+
tokenA.cleanupCancellation();
77+
78+
expect(tokenA.isCancellationRequested()).to.be.false;
79+
expect(fs.existsSync(tokenA.getCancellationFilePath())).to.be.false;
80+
81+
// make sure we can call it as many times as we want to
82+
expect(function() { tokenA.cleanupCancellation(); }).to.not.throw(Error);
83+
expect(tokenA.isCancellationRequested()).to.be.false;
84+
});
85+
86+
it('should not throw error on cleanupCancellation with no file exists', function () {
87+
var tokenA = new CancellationToken('some_file_that_doesnt_exists', true);
88+
89+
expect(function() { tokenA.cleanupCancellation(); }).to.not.throw();
90+
expect(function() { tokenA.cleanupCancellation(); }).to.not.throw();
91+
});
92+
93+
it('should throttle check for 10ms', function (done) {
94+
var tokenA = new CancellationToken();
95+
var tokenB = CancellationToken.createFromJSON(tokenA.toJSON());
96+
var start = Date.now();
97+
98+
expect(tokenA.isCancellationRequested()).to.be.false;
99+
expect(tokenB.isCancellationRequested()).to.be.false;
100+
101+
tokenA.requestCancellation();
102+
expect(tokenA.isCancellationRequested()).to.be.true;
103+
104+
var duration = Math.abs(Date.now() - start);
105+
if (duration < 10) {
106+
// we should throttle check
107+
expect(tokenB.isCancellationRequested()).to.be.false;
108+
}
109+
110+
setTimeout(function () {
111+
expect(tokenB.isCancellationRequested()).to.be.true;
112+
done();
113+
}, 11);
114+
});
5115
});

test/FileRegister.spec.js

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,101 @@
11
var describe = require('mocha').describe;
2+
var it = require('mocha').it;
3+
var beforeEach = require('mocha').beforeEach;
4+
var expect = require('chai').expect;
5+
var FilesRegister = require('../lib/FilesRegister');
26

37
describe('FilesRegister', function () {
4-
// TODO...
8+
var register;
9+
beforeEach(function () {
10+
register = new FilesRegister(function () {
11+
return {
12+
test: true
13+
};
14+
});
15+
});
16+
17+
it('should add and remove files', function () {
18+
register.add('/test');
19+
register.add('/test2');
20+
expect(register.has('/test')).to.be.true;
21+
expect(register.has('/test2')).to.be.true;
22+
register.remove('/test');
23+
expect(register.has('/test')).to.be.false;
24+
expect(register.has('/test2')).to.be.true;
25+
26+
expect(function() { register.remove('/test'); }).to.not.throw();
27+
register.remove('/test2');
28+
expect(register.has('/test')).to.be.false;
29+
expect(register.has('/test2')).to.be.false;
30+
});
31+
32+
it('should get file that exists in register', function () {
33+
register.add('/test');
34+
expect(function() { register.get('/test'); }).to.not.throw();
35+
expect(function() { register.get('/test2'); }).to.throw();
36+
expect(register.get('/test')).to.be.a('object');
37+
expect(Object.keys(register.get('/test'))).to.be.deep.equal(['mtime', 'data']);
38+
});
39+
40+
it('should list all keys in register', function () {
41+
register.add('/test');
42+
register.add('/test/foo');
43+
register.add('/test/foo/bar');
44+
expect(register.keys()).to.be.deep.equal(['/test', '/test/foo', '/test/foo/bar']);
45+
46+
register.remove('/test');
47+
expect(register.keys()).to.be.deep.equal(['/test/foo', '/test/foo/bar']);
48+
});
49+
50+
it('should get data from file', function () {
51+
register.add('/test');
52+
expect(register.getData('/test')).to.be.deep.equal({ test: true });
53+
expect(function() { register.getData('/test2'); }).to.throw(Error);
54+
});
55+
56+
it('should ensure if file exists', function () {
57+
expect(register.has('/test')).to.be.false;
58+
register.ensure('/test');
59+
expect(register.has('/test')).to.be.true;
60+
61+
var reference = register.get('/test');
62+
register.ensure('/test');
63+
expect(reference).to.be.equal(register.get('/test'));
64+
});
65+
66+
it('should mutate existing data', function () {
67+
register.add('/test');
68+
var dataReference = register.getData('/test');
69+
expect(dataReference.test).to.be.true;
70+
register.mutateData('/test', function (data) {
71+
data.test = false;
72+
});
73+
expect(dataReference).to.be.equal(register.getData('/test'));
74+
expect(dataReference.test).to.be.false;
75+
});
76+
77+
it('should set mtime and reset data if mtime changes', function () {
78+
register.add('/test');
79+
register.mutateData('/test', function (data) {
80+
data.test = false;
81+
});
82+
expect(register.getData('/test').test).to.be.false;
83+
expect(register.getMtime('/test')).to.be.undefined;
84+
85+
register.setMtime('/test', 1000);
86+
expect(register.getMtime('/test')).to.be.equal(1000);
87+
expect(register.getData('/test').test).to.be.true;
88+
register.mutateData('/test', function (data) {
89+
data.test = false;
90+
});
91+
expect(register.getData('/test').test).to.be.false;
92+
93+
register.setMtime('/test', 1000);
94+
expect(register.getMtime('/test')).to.be.equal(1000);
95+
expect(register.getData('/test').test).to.be.false;
96+
97+
register.setMtime('/test', 1001);
98+
expect(register.getMtime('/test')).to.be.equal(1001);
99+
expect(register.getData('/test').test).to.be.true;
100+
});
5101
});

test/FilesWatcher.spec.js

Lines changed: 147 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,151 @@
11
var describe = require('mocha').describe;
2+
var it = require('mocha').it;
3+
var beforeEach = require('mocha').beforeEach;
4+
var afterEach = require('mocha').afterEach;
5+
var sinon = require('sinon');
6+
var expect = require('chai').expect;
7+
var mockRequire = require('mock-require');
28

39
describe('FilesWatcher', function () {
4-
// TODO...
10+
var FilesWatcher;
11+
var watcher;
12+
var watchStub;
13+
var watcherStub;
14+
15+
beforeEach(function () {
16+
watcherStub = {
17+
on: sinon.stub().returnsThis()
18+
};
19+
watchStub = sinon.stub().returns(watcherStub);
20+
21+
mockRequire('chokidar', { watch: watchStub });
22+
FilesWatcher = mockRequire.reRequire('../lib/FilesWatcher');
23+
24+
watcher = new FilesWatcher(
25+
['/test', '/bar'],
26+
['.ext1', '.ext2']
27+
);
28+
});
29+
30+
afterEach(function () {
31+
mockRequire.stopAll();
32+
});
33+
34+
it('should check if file is supported', function () {
35+
expect(watcher.isFileSupported('/foo.ext1')).to.be.true;
36+
expect(watcher.isFileSupported('/foo.ext2')).to.be.true;
37+
expect(watcher.isFileSupported('/foo.txt')).to.be.false;
38+
expect(watcher.isFileSupported('/foo.ext1.txt')).to.be.false;
39+
});
40+
41+
it('should check if is watching file', function () {
42+
expect(watcher.isWatchingFile('/test/a.ext1')).to.be.false;
43+
expect(watcher.isWatchingFile('/test/a.txt')).to.be.false;
44+
expect(watcher.isWatchingFile('/test')).to.be.false;
45+
expect(watcher.isWatchingFile('/foo/a.ext1')).to.be.false;
46+
47+
watcher.watch();
48+
49+
expect(watcher.isWatchingFile('/test/a.ext1')).to.be.true;
50+
expect(watcher.isWatchingFile('/test/a.txt')).to.be.false;
51+
expect(watcher.isWatchingFile('/test')).to.be.false;
52+
expect(watcher.isWatchingFile('/foo/a.ext1')).to.be.false;
53+
});
54+
55+
it('should check if watcher is watching', function () {
56+
expect(watcher.isWatching()).to.be.false;
57+
watcher.watch();
58+
expect(watcher.isWatching()).to.be.true;
59+
expect(function () { watcher.watch(); }).to.throw(Error);
60+
});
61+
62+
it('should add and remove listeners', function () {
63+
var listenerA = function () {
64+
};
65+
var listenerB = function () {
66+
};
67+
68+
expect(watcher.listeners).to.be.a('object');
69+
watcher.on('event', listenerA);
70+
watcher.on('event', listenerB);
71+
expect(watcher.listeners['event']).to.be.a('array');
72+
expect(watcher.listeners['event']).to.be.deep.equal([listenerA, listenerB]);
73+
74+
watcher.off('event', listenerA);
75+
expect(watcher.listeners['event']).to.be.deep.equal([listenerB]);
76+
77+
expect(function() { watcher.off('event', listenerA); }).to.not.throw();
78+
expect(watcher.listeners['event']).to.be.deep.equal([listenerB]);
79+
80+
watcher.off('event', listenerB);
81+
expect(watcher.listeners['event']).to.be.deep.equal([]);
82+
83+
expect(watcher.listeners['foo']).to.be.undefined;
84+
expect(function() { watcher.off('foo', listenerA); }).to.not.throw();
85+
86+
expect(watcher.listeners['foo']).to.be.undefined;
87+
});
88+
89+
it('should watch filesystem using chokidar', function () {
90+
expect(watchStub.called).to.be.false;
91+
92+
var changeListenerA = sinon.spy();
93+
var changeListenerB = sinon.spy();
94+
var unlinkListenerA = sinon.spy();
95+
var unlinkListenerB = sinon.spy();
96+
97+
watcher.watch();
98+
99+
expect(watcherStub.on.getCall(0).args[0]).to.be.equal('change');
100+
expect(watcherStub.on.getCall(1).args[0]).to.be.equal('unlink');
101+
102+
var triggerChange = watcherStub.on.getCall(0).args[1];
103+
var triggerUnlink = watcherStub.on.getCall(1).args[1];
104+
105+
expect(triggerChange).to.be.a('function');
106+
expect(triggerUnlink).to.be.a('function');
107+
108+
expect(function() { triggerChange('/test/test.ext1', {}); }).to.not.throw();
109+
expect(function() { triggerUnlink('/test/test.ext1', {}); }).to.not.throw();
110+
111+
watcher.on('change', changeListenerA);
112+
watcher.on('change', changeListenerB);
113+
watcher.on('unlink', unlinkListenerA);
114+
watcher.on('unlink', unlinkListenerB);
115+
116+
expect(watchStub.called).to.be.true;
117+
expect(watchStub.getCall(0).args[0]).to.be.equal('/test');
118+
expect(watchStub.getCall(1).args[0]).to.be.equal('/bar');
119+
120+
// manually trigger change listeners
121+
triggerChange('/test/test.txt', {});
122+
expect(changeListenerA.called).to.be.false;
123+
expect(changeListenerB.called).to.be.false;
124+
125+
triggerChange('/test/test.ext1', {});
126+
expect(changeListenerB.called).to.be.true;
127+
expect(changeListenerB.called).to.be.true;
128+
129+
130+
// manually trigger unlink listeners
131+
triggerUnlink('/test/test.txt');
132+
expect(unlinkListenerA.called).to.be.false;
133+
expect(unlinkListenerB.called).to.be.false;
134+
135+
triggerUnlink('/test/test.ext1');
136+
expect(unlinkListenerA.called).to.be.true;
137+
expect(unlinkListenerB.called).to.be.true;
138+
139+
// check if off is working properly
140+
watcher.off('change', changeListenerA);
141+
watcher.off('unlink', unlinkListenerB);
142+
143+
triggerChange('/test/test.ext1', {});
144+
triggerUnlink('/test/test.ext1');
145+
146+
expect(changeListenerA.callCount).to.be.equal(1);
147+
expect(changeListenerB.callCount).to.be.equal(2);
148+
expect(unlinkListenerA.callCount).to.be.equal(2);
149+
expect(unlinkListenerB.callCount).to.be.equal(1);
150+
});
5151
});

test/IncrementalChecker.spec.js

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)