orionsoft-react-scripts
Version:
Orionsoft Configuration and scripts for Create React App.
417 lines (400 loc) • 12 kB
JavaScript
/*globals describe it beforeEach afterEach */
require("should");
var path = require("path");
var TestHelper = require("./helpers/TestHelper");
var Watchpack = require("../lib/watchpack");
var fixtures = path.join(__dirname, "fixtures");
var testHelper = new TestHelper(fixtures);
describe("Watchpack", function() {
this.timeout(10000);
beforeEach(testHelper.before);
afterEach(testHelper.after);
it("should watch a single file", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = 0;
w.on("change", function(file) {
file.should.be.eql(path.join(fixtures, "a"));
changeEvents++;
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "a")]);
changeEvents.should.be.eql(1);
w.close();
done();
});
w.watch([path.join(fixtures, "a")], []);
testHelper.tick(function() {
testHelper.file("a");
});
});
it("should watch multiple files", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.sort().should.be.eql([path.join(fixtures, "a"), path.join(fixtures, "b")]);
changeEvents.should.be.eql([
path.join(fixtures, "a"),
path.join(fixtures, "b"),
path.join(fixtures, "a"),
path.join(fixtures, "b"),
path.join(fixtures, "a")
]);
Object.keys(w.getTimes()).sort().should.be.eql([
path.join(fixtures, "a"),
path.join(fixtures, "b")
]);
w.close();
done();
});
w.watch([path.join(fixtures, "a"), path.join(fixtures, "b")], []);
testHelper.tick(function() {
testHelper.file("a");
testHelper.tick(function() {
testHelper.file("b");
testHelper.tick(function() {
testHelper.file("a");
testHelper.tick(function() {
testHelper.file("b");
testHelper.tick(function() {
testHelper.file("a");
});
});
});
});
});
});
it("should watch a directory", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
changeEvents.should.be.eql([path.join(fixtures, "dir", "a")]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.tick(function() {
w.watch([], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.file(path.join("dir", "a"));
});
});
});
it("should watch a file than a directory", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
changeEvents.should.be.eql([path.join(fixtures, "dir", "a")]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.dir(path.join("dir", "subdir"));
testHelper.file(path.join("dir", "a"));
testHelper.tick(function() {
w.watch([path.join(fixtures, "dir", "a")], []);
testHelper.tick(function() {
w.watch([path.join(fixtures, "dir")], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.file(path.join("dir", "a"));
});
});
});
});
it("should watch a directory (delete file)", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
changeEvents.should.be.eql([path.join(fixtures, "dir", "a")]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.file(path.join("dir", "a"));
testHelper.tick(function() {
w.watch([], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.remove(path.join("dir", "a"));
});
});
});
it("should watch a directory (delete directory)", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.dir(path.join("dir", "sub"));
testHelper.file(path.join("dir", "sub", "a"));
testHelper.tick(function() {
w.watch([], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.remove(path.join("dir", "sub"));
});
});
});
it("should watch a directory (delete directory2)", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
changeEvents.should.be.eql([path.join(fixtures, "dir", "sub")]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.dir(path.join("dir", "sub"));
testHelper.tick(function() {
w.watch([], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.remove(path.join("dir", "sub"));
});
});
});
it("should watch already watched directory", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
changeEvents.should.be.eql([path.join(fixtures, "dir", "a")]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.file(path.join("dir", "a"));
testHelper.tick(function() {
w.watch([path.join(fixtures, "dir", "a")], []);
testHelper.tick(function() {
w.watch([], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.remove(path.join("dir", "a"));
});
});
});
});
it("should watch file in a sub directory", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
changeEvents.should.be.eql([path.join(fixtures, "dir", "sub", "a")]);
var times = w.getTimes();
times[path.join(fixtures, "dir")].should.be.type("number");
times[path.join(fixtures, "dir")].should.be.eql(times[path.join(fixtures, "dir", "sub", "a")]);
times[path.join(fixtures, "dir", "sub")].should.be.eql(times[path.join(fixtures, "dir", "sub", "a")]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.dir(path.join("dir", "sub"));
testHelper.tick(function() {
w.watch([], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.file(path.join("dir", "sub", "a"));
});
});
});
it("should watch file in a sub sub directory", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = [];
w.on("change", function(file) {
if(changeEvents[changeEvents.length - 1] === file)
return;
changeEvents.push(file);
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "dir")]);
changeEvents.should.be.eql([path.join(fixtures, "dir", "sub", "sub", "a")]);
Object.keys(w.getTimes()).sort().should.be.eql([
path.join(fixtures, "dir"),
path.join(fixtures, "dir", "sub"),
path.join(fixtures, "dir", "sub", "sub"),
path.join(fixtures, "dir", "sub", "sub", "a")
]);
w.close();
done();
});
testHelper.dir("dir");
testHelper.dir(path.join("dir", "sub"));
testHelper.dir(path.join("dir", "sub", "sub"));
testHelper.tick(function() {
w.watch([], [path.join(fixtures, "dir")]);
testHelper.tick(function() {
testHelper.file(path.join("dir", "sub", "sub", "a"));
});
});
});
it("should detect a single change to future timestamps", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var w2 = new Watchpack({
aggregateTimeout: 1000
});
w.on("change", function() {
throw new Error("should not report change event");
});
w.on("aggregated", function() {
throw new Error("should not report aggregated event");
});
testHelper.file("a");
testHelper.tick(function() {
w2.watch([path.join(fixtures, "a")], []);
testHelper.tick(1000, function() { // wait for initial scan
testHelper.mtime("a", Date.now() + 1000000);
testHelper.tick(function() {
w.watch([path.join(fixtures, "a")], []);
testHelper.tick(function() {
testHelper.tick(function() {
w2.close();
w.close();
done();
});
});
});
});
});
});
it("should detect a past change to a file (timestamp)", function(done) {
var w = new Watchpack({
aggregateTimeout: 1000
});
var changeEvents = 0;
w.on("change", function(file) {
file.should.be.eql(path.join(fixtures, "a"));
changeEvents++;
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "a")]);
changeEvents.should.be.greaterThan(0);
w.close();
done();
});
var startTime = Date.now();
testHelper.tick(function() {
testHelper.file("a");
testHelper.tick(function() {
w.watch([path.join(fixtures, "a")], [], startTime);
});
});
});
it("should not detect a past change to a file (watched)", function(done) {
var w2 = new Watchpack();
var w = new Watchpack();
w.on("change", function() {
throw new Error("Should not be detected");
});
testHelper.tick(function() {
testHelper.file("b");
w2.watch([path.join(fixtures, "b")], []);
testHelper.tick(1000, function() { // wait for stable state
testHelper.file("a");
testHelper.tick(function() {
var startTime = Date.now();
testHelper.tick(function() {
w.watch([path.join(fixtures, "a")], [], startTime);
testHelper.tick(function() {
w.close();
w2.close();
done();
});
});
});
});
});
});
it("should detect a past change to a file (watched)", function(done) {
var w2 = new Watchpack();
var w = new Watchpack();
var changeEvents = 0;
w.on("change", function(file) {
file.should.be.eql(path.join(fixtures, "a"));
changeEvents++;
});
w.on("aggregated", function(changes) {
changes.should.be.eql([path.join(fixtures, "a")]);
changeEvents.should.be.eql(1);
w.close();
w2.close();
done();
});
testHelper.tick(function() {
testHelper.file("b");
w2.watch([path.join(fixtures, "b")], []);
testHelper.tick(function() {
var startTime = Date.now();
testHelper.tick(function() {
testHelper.file("a");
testHelper.tick(function() {
w.watch([path.join(fixtures, "a")], [], startTime);
});
});
});
});
});
});