| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var path_1 = require("path");
- var build = require("./build");
- var interfaces_1 = require("./util/interfaces");
- var file_cache_1 = require("./util/file-cache");
- var watch = require("./watch");
- describe('watch', function () {
- describe('runBuildUpdate', function () {
- it('should require transpile full build for html file add', function () {
- var files = [{
- event: 'add',
- filePath: 'file1.html',
- ext: '.html'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresBuild);
- });
- it('should require transpile full build for html file change and not already successful bundle', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.html',
- ext: '.html'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresBuild);
- });
- it('should require template update for html file change and already successful bundle', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.html',
- ext: '.html'
- }];
- context.bundleState = interfaces_1.BuildState.SuccessfulBuild;
- watch.runBuildUpdate(context, files);
- expect(context.templateState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- });
- it('should require sass update for ts file unlink', function () {
- var files = [{
- event: 'unlink',
- filePath: 'file1.ts',
- ext: '.ts'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.sassState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- });
- it('should require sass update for ts file add', function () {
- var files = [{
- event: 'add',
- filePath: 'file1.ts',
- ext: '.ts'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.sassState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- });
- it('should require sass update for scss file add', function () {
- var files = [{
- event: 'add',
- filePath: 'file1.scss',
- ext: '.scss'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.sassState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- });
- it('should require sass update for scss file change', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.scss',
- ext: '.scss'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.sassState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- });
- it('should require transpile full build for single ts add, but only bundle update when already successful bundle', function () {
- var files = [{
- event: 'add',
- filePath: 'file1.ts',
- ext: '.ts'
- }];
- context.bundleState = interfaces_1.BuildState.SuccessfulBuild;
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.bundleState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- });
- it('should require transpile full build for single ts add', function () {
- var files = [{
- event: 'add',
- filePath: 'file1.ts',
- ext: '.ts'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.bundleState).toEqual(interfaces_1.BuildState.RequiresBuild);
- });
- it('should require transpile full build for single ts change and not in file cache', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.ts',
- ext: '.ts'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.bundleState).toEqual(interfaces_1.BuildState.RequiresBuild);
- });
- it('should require transpile update only and full bundle build for single ts change and already in file cache and hasnt already had successful bundle', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.ts',
- ext: '.ts'
- }];
- context.bundleState = interfaces_1.BuildState.SuccessfulBuild;
- var resolvedFilePath = path_1.resolve('file1.ts');
- context.fileCache.set(resolvedFilePath, { path: 'file1.ts', content: 'content' });
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- expect(context.bundleState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- });
- it('should require transpile update only and bundle update for single ts change and already in file cache and bundle already successful', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.ts',
- ext: '.ts'
- }];
- var resolvedFilePath = path_1.resolve('file1.ts');
- context.fileCache.set(resolvedFilePath, { path: 'file1.ts', content: 'content' });
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresUpdate);
- expect(context.bundleState).toEqual(interfaces_1.BuildState.RequiresBuild);
- });
- it('should require transpile full build for multiple ts changes', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.ts',
- ext: '.ts'
- }, {
- event: 'change',
- filePath: 'file2.ts',
- ext: '.ts'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.transpileState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.deepLinkState).toEqual(interfaces_1.BuildState.RequiresBuild);
- expect(context.bundleState).toEqual(interfaces_1.BuildState.RequiresBuild);
- });
- it('should not update bundle state if no transpile changes', function () {
- var files = [{
- event: 'change',
- filePath: 'file1.scss',
- ext: '.scss'
- }];
- watch.runBuildUpdate(context, files);
- expect(context.bundleState).toEqual(undefined);
- });
- it('should do nothing if there are no changed files', function () {
- expect(watch.runBuildUpdate(context, [])).toEqual(null);
- expect(watch.runBuildUpdate(context, null)).toEqual(null);
- });
- var context;
- beforeEach(function () {
- context = {
- fileCache: new file_cache_1.FileCache()
- };
- });
- });
- describe('prepareWatcher', function () {
- it('should do nothing when options.ignored is a function', function () {
- var ignoreFn = function () { };
- var watcher = { options: { ignored: ignoreFn } };
- var context = { srcDir: '/some/src/' };
- watch.prepareWatcher(context, watcher);
- expect(watcher.options.ignored).toBe(ignoreFn);
- });
- it('should set replacePathVars when options.ignored is a string', function () {
- var watcher = { options: { ignored: path_1.join('{{SRC}}', '**', '*.spec.ts') } };
- var context = { srcDir: path_1.join(process.cwd(), 'some', 'src') };
- watch.prepareWatcher(context, watcher);
- expect(watcher.options.ignored).toEqual(path_1.join(process.cwd(), 'some', 'src', '**', '*.spec.ts'));
- });
- it('should set replacePathVars when options.ignored is an array of strings', function () {
- var watcher = { options: { ignored: [path_1.join('{{SRC}}', '**', '*.spec.ts'), path_1.join('{{SRC}}', 'index.html')] } };
- var context = { srcDir: path_1.join(process.cwd(), 'some', 'src') };
- watch.prepareWatcher(context, watcher);
- expect(watcher.options.ignored[0]).toEqual(path_1.join(process.cwd(), 'some', 'src', '**', '*.spec.ts'));
- expect(watcher.options.ignored[1]).toEqual(path_1.join(process.cwd(), 'some', 'src', 'index.html'));
- });
- it('should set replacePathVars when paths is an array', function () {
- var watcher = { paths: [
- path_1.join('{{SRC}}', 'some', 'path1'),
- path_1.join('{{SRC}}', 'some', 'path2')
- ] };
- var context = { srcDir: path_1.join(process.cwd(), 'some', 'src') };
- watch.prepareWatcher(context, watcher);
- expect(watcher.paths.length).toEqual(2);
- expect(watcher.paths[0]).toEqual(path_1.join(process.cwd(), 'some', 'src', 'some', 'path1'));
- expect(watcher.paths[1]).toEqual(path_1.join(process.cwd(), 'some', 'src', 'some', 'path2'));
- });
- it('should set replacePathVars when paths is a string', function () {
- var watcher = { paths: path_1.join('{{SRC}}', 'some', 'path') };
- var context = { srcDir: path_1.join(process.cwd(), 'some', 'src') };
- watch.prepareWatcher(context, watcher);
- expect(watcher.paths).toEqual(path_1.join(process.cwd(), 'some', 'src', 'some', 'path'));
- });
- it('should not set options.ignoreInitial if it was provided', function () {
- var watcher = { options: { ignoreInitial: false } };
- var context = {};
- watch.prepareWatcher(context, watcher);
- expect(watcher.options.ignoreInitial).toEqual(false);
- });
- it('should set options.ignoreInitial to true if it wasnt provided', function () {
- var watcher = { options: {} };
- var context = {};
- watch.prepareWatcher(context, watcher);
- expect(watcher.options.ignoreInitial).toEqual(true);
- });
- it('should not set options.cwd from context.rootDir if it was provided', function () {
- var watcher = { options: { cwd: '/my/cwd/' } };
- var context = { rootDir: '/my/root/dir/' };
- watch.prepareWatcher(context, watcher);
- expect(watcher.options.cwd).toEqual('/my/cwd/');
- });
- it('should set options.cwd from context.rootDir if it wasnt provided', function () {
- var watcher = {};
- var context = { rootDir: '/my/root/dir/' };
- watch.prepareWatcher(context, watcher);
- expect(watcher.options.cwd).toEqual(context.rootDir);
- });
- it('should create watcher options when not provided', function () {
- var watcher = {};
- var context = {};
- watch.prepareWatcher(context, watcher);
- expect(watcher.options).toBeDefined();
- });
- });
- describe('queueOrRunBuildUpdate', function () {
- it('should not queue a build when there isnt an active build', function () {
- var changedFileOne = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter.ts'
- };
- var changedFileTwo = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter2.ts'
- };
- var changedFiles = [changedFileOne, changedFileTwo];
- var context = {};
- spyOn(watch, watch.queueOrRunBuildUpdate.name).and.callThrough();
- spyOn(build, build.buildUpdate.name).and.returnValue(Promise.resolve());
- var promise = watch.queueOrRunBuildUpdate(changedFiles, context);
- return promise.then(function () {
- expect(watch.queueOrRunBuildUpdate).toHaveBeenCalledTimes(1);
- expect(build.buildUpdate).toHaveBeenCalledWith(changedFiles, context);
- expect(watch.buildUpdatePromise).toEqual(null);
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- });
- });
- it('should not queue changes when subsequent build is called after the first build', function () {
- var changedFileOne = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter.ts'
- };
- var changedFileTwo = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter2.ts'
- };
- var changedFiles = [changedFileOne, changedFileTwo];
- var context = {};
- spyOn(watch, watch.queueOrRunBuildUpdate.name).and.callThrough();
- spyOn(build, build.buildUpdate.name).and.returnValue(Promise.resolve());
- var promise = watch.queueOrRunBuildUpdate(changedFiles, context);
- return promise.then(function () {
- expect(watch.queueOrRunBuildUpdate).toHaveBeenCalledTimes(1);
- expect(build.buildUpdate).toHaveBeenCalledWith(changedFiles, context);
- expect(watch.buildUpdatePromise).toEqual(null);
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- return watch.queueOrRunBuildUpdate(changedFiles, context);
- }).then(function () {
- expect(watch.queueOrRunBuildUpdate).toHaveBeenCalledTimes(2);
- expect(build.buildUpdate).toHaveBeenCalledWith(changedFiles, context);
- expect(watch.buildUpdatePromise).toEqual(null);
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- return watch.queueOrRunBuildUpdate(changedFiles, context);
- }).then(function () {
- expect(watch.queueOrRunBuildUpdate).toHaveBeenCalledTimes(3);
- expect(build.buildUpdate).toHaveBeenCalledWith(changedFiles, context);
- expect(watch.buildUpdatePromise).toEqual(null);
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- });
- });
- it('should queue up changes when a build is active', function () {
- var changedFileOne = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter.ts'
- };
- var changedFileTwo = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter2.ts'
- };
- var changedFileThree = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter3.ts'
- };
- var changedFileFour = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter4.ts'
- };
- var changedFileFive = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter5.ts'
- };
- var changedFileSix = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter6.ts'
- };
- var originalChangedFiles = [changedFileOne, changedFileTwo];
- var secondSetOfChangedFiles = [changedFileThree, changedFileFour];
- var ThirdSetOfChangedFiles = [changedFileTwo, changedFileFour, changedFileFive, changedFileSix];
- var context = {};
- var firstPromiseResolve = null;
- var firstPromise = new Promise(function (resolve, reject) {
- firstPromiseResolve = resolve;
- });
- spyOn(watch, watch.queueOrRunBuildUpdate.name).and.callThrough();
- var buildUpdateSpy = spyOn(build, build.buildUpdate.name).and.callFake(function (changedFiles, context) {
- if (changedFiles === originalChangedFiles) {
- return firstPromise;
- }
- else {
- return Promise.resolve();
- }
- });
- // call the original
- expect(watch.buildUpdatePromise).toBeFalsy();
- var promise = watch.queueOrRunBuildUpdate(originalChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- // okay, call again and it should be queued now
- watch.queueOrRunBuildUpdate(secondSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(2);
- expect(watch.queuedChangedFileMap.get(changedFileThree.filePath)).toEqual(changedFileThree);
- expect(watch.queuedChangedFileMap.get(changedFileFour.filePath)).toEqual(changedFileFour);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- // okay, let's queue some more
- watch.queueOrRunBuildUpdate(ThirdSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(5);
- expect(watch.queuedChangedFileMap.get(changedFileTwo.filePath)).toEqual(changedFileTwo);
- expect(watch.queuedChangedFileMap.get(changedFileThree.filePath)).toEqual(changedFileThree);
- expect(watch.queuedChangedFileMap.get(changedFileFour.filePath)).toEqual(changedFileFour);
- expect(watch.queuedChangedFileMap.get(changedFileFive.filePath)).toEqual(changedFileFive);
- expect(watch.queuedChangedFileMap.get(changedFileSix.filePath)).toEqual(changedFileSix);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- firstPromiseResolve();
- return promise.then(function () {
- expect(watch.buildUpdatePromise).toBeFalsy();
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- expect(build.buildUpdate).toHaveBeenCalledTimes(2);
- expect(buildUpdateSpy.calls.first().args[0]).toEqual(originalChangedFiles);
- expect(buildUpdateSpy.calls.first().args[1]).toEqual(context);
- expect(buildUpdateSpy.calls.mostRecent().args[0].length).toEqual(5);
- // make sure the array contains the elements that we expect it to
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileTwo; })[0]).toEqual(changedFileTwo);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileThree; })[0]).toEqual(changedFileThree);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileFour; })[0]).toEqual(changedFileFour);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileFive; })[0]).toEqual(changedFileFive);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileSix; })[0]).toEqual(changedFileSix);
- expect(buildUpdateSpy.calls.mostRecent().args[1]).toEqual(context);
- });
- });
- it('should run buildUpdate on the queued files even if the first build update fails', function () {
- var changedFileOne = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter.ts'
- };
- var changedFileTwo = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter2.ts'
- };
- var changedFileThree = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter3.ts'
- };
- var changedFileFour = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter4.ts'
- };
- var changedFileFive = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter5.ts'
- };
- var changedFileSix = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter6.ts'
- };
- var originalChangedFiles = [changedFileOne, changedFileTwo];
- var secondSetOfChangedFiles = [changedFileThree, changedFileFour];
- var ThirdSetOfChangedFiles = [changedFileTwo, changedFileFour, changedFileFive, changedFileSix];
- var context = {};
- var firstPromiseReject = null;
- var firstPromise = new Promise(function (resolve, reject) {
- firstPromiseReject = reject;
- });
- spyOn(watch, watch.queueOrRunBuildUpdate.name).and.callThrough();
- var buildUpdateSpy = spyOn(build, build.buildUpdate.name).and.callFake(function (changedFiles, context) {
- if (changedFiles === originalChangedFiles) {
- return firstPromise;
- }
- else {
- return Promise.resolve();
- }
- });
- // call the original
- expect(watch.buildUpdatePromise).toBeFalsy();
- var promise = watch.queueOrRunBuildUpdate(originalChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- // okay, call again and it should be queued now
- watch.queueOrRunBuildUpdate(secondSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(2);
- expect(watch.queuedChangedFileMap.get(changedFileThree.filePath)).toEqual(changedFileThree);
- expect(watch.queuedChangedFileMap.get(changedFileFour.filePath)).toEqual(changedFileFour);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- // okay, let's queue some more
- watch.queueOrRunBuildUpdate(ThirdSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(5);
- expect(watch.queuedChangedFileMap.get(changedFileTwo.filePath)).toEqual(changedFileTwo);
- expect(watch.queuedChangedFileMap.get(changedFileThree.filePath)).toEqual(changedFileThree);
- expect(watch.queuedChangedFileMap.get(changedFileFour.filePath)).toEqual(changedFileFour);
- expect(watch.queuedChangedFileMap.get(changedFileFive.filePath)).toEqual(changedFileFive);
- expect(watch.queuedChangedFileMap.get(changedFileSix.filePath)).toEqual(changedFileSix);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- firstPromiseReject();
- return promise.then(function () {
- expect(watch.buildUpdatePromise).toBeFalsy();
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- expect(build.buildUpdate).toHaveBeenCalledTimes(2);
- expect(buildUpdateSpy.calls.first().args[0]).toEqual(originalChangedFiles);
- expect(buildUpdateSpy.calls.first().args[1]).toEqual(context);
- expect(buildUpdateSpy.calls.mostRecent().args[0].length).toEqual(5);
- // make sure the array contains the elements that we expect it to
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileTwo; })[0]).toEqual(changedFileTwo);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileThree; })[0]).toEqual(changedFileThree);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileFour; })[0]).toEqual(changedFileFour);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileFive; })[0]).toEqual(changedFileFive);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileSix; })[0]).toEqual(changedFileSix);
- expect(buildUpdateSpy.calls.mostRecent().args[1]).toEqual(context);
- });
- });
- it('should handle multiple queueing and unqueuing events aka advanced test', function () {
- var changedFileOne = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter.ts'
- };
- var changedFileTwo = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter2.ts'
- };
- var changedFileThree = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter3.ts'
- };
- var changedFileFour = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter4.ts'
- };
- var changedFileFive = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter5.ts'
- };
- var changedFileSix = {
- event: 'change',
- ext: '.ts',
- filePath: '/some/fake/path/that/doesnt/matter6.ts'
- };
- var originalChangedFiles = [changedFileOne, changedFileTwo];
- var secondSetOfChangedFiles = [changedFileThree, changedFileFour];
- var thirdSetOfChangedFiles = [changedFileTwo, changedFileFour, changedFileFive, changedFileSix];
- var fourthSetOfChangedFiles = [changedFileOne, changedFileThree];
- var fifthSetOfChangedFiles = [changedFileFour, changedFileFive, changedFileSix];
- var context = {};
- var firstPromiseResolve = null;
- var secondPromiseResolve = null;
- var thirdPromiseResolve = null;
- var firstPromise = new Promise(function (resolve, reject) {
- firstPromiseResolve = resolve;
- });
- var secondPromise = new Promise(function (resolve, reject) {
- secondPromiseResolve = resolve;
- });
- var thirdPromise = new Promise(function (resolve, reject) {
- thirdPromiseResolve = resolve;
- });
- spyOn(watch, watch.queueOrRunBuildUpdate.name).and.callThrough();
- var buildUpdateSpy = spyOn(build, build.buildUpdate.name).and.callFake(function (changedFiles, context) {
- if (changedFiles === originalChangedFiles) {
- return firstPromise;
- }
- else if (changedFiles.length === 5) {
- // hardcode the length for now as it's easier to detect which array it'll be
- return secondPromise;
- }
- else {
- return thirdPromise;
- }
- });
- // call the original
- expect(watch.buildUpdatePromise).toBeFalsy();
- var promise = watch.queueOrRunBuildUpdate(originalChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(0);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- expect(buildUpdateSpy.calls.first().args[0]).toEqual(originalChangedFiles);
- expect(buildUpdateSpy.calls.first().args[1]).toEqual(context);
- // okay, call again and it should be queued now
- watch.queueOrRunBuildUpdate(secondSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(2);
- expect(watch.queuedChangedFileMap.get(changedFileThree.filePath)).toEqual(changedFileThree);
- expect(watch.queuedChangedFileMap.get(changedFileFour.filePath)).toEqual(changedFileFour);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- // okay, let's queue some more
- watch.queueOrRunBuildUpdate(thirdSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(5);
- expect(watch.queuedChangedFileMap.get(changedFileTwo.filePath)).toEqual(changedFileTwo);
- expect(watch.queuedChangedFileMap.get(changedFileThree.filePath)).toEqual(changedFileThree);
- expect(watch.queuedChangedFileMap.get(changedFileFour.filePath)).toEqual(changedFileFour);
- expect(watch.queuedChangedFileMap.get(changedFileFive.filePath)).toEqual(changedFileFive);
- expect(watch.queuedChangedFileMap.get(changedFileSix.filePath)).toEqual(changedFileSix);
- expect(build.buildUpdate).toHaveBeenCalledTimes(1);
- firstPromiseResolve();
- return firstPromise.then(function () {
- expect(build.buildUpdate).toHaveBeenCalledTimes(2);
- expect(buildUpdateSpy.calls.mostRecent().args[0].length).toEqual(5);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileTwo; })[0]).toEqual(changedFileTwo);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileThree; })[0]).toEqual(changedFileThree);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileFour; })[0]).toEqual(changedFileFour);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileFive; })[0]).toEqual(changedFileFive);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileSix; })[0]).toEqual(changedFileSix);
- expect(buildUpdateSpy.calls.mostRecent().args[1]).toEqual(context);
- // okay, give it more changes so it queues that stuff up
- // also do some assertions homie
- watch.queueOrRunBuildUpdate(fourthSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(2);
- expect(watch.queuedChangedFileMap.get(changedFileOne.filePath)).toEqual(changedFileOne);
- expect(watch.queuedChangedFileMap.get(changedFileThree.filePath)).toEqual(changedFileThree);
- // cool beans yo, go ahead and resolve another promise
- secondPromiseResolve();
- return secondPromise;
- }).then(function () {
- expect(build.buildUpdate).toHaveBeenCalledTimes(3);
- expect(buildUpdateSpy.calls.mostRecent().args[0].length).toEqual(2);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileOne; })[0]).toEqual(changedFileOne);
- expect(buildUpdateSpy.calls.mostRecent().args[0].concat().filter(function (changedFile) { return changedFile === changedFileThree; })[0]).toEqual(changedFileThree);
- // okay, give it more changes so it queues that stuff up
- // also do some assertions homie
- watch.queueOrRunBuildUpdate(fifthSetOfChangedFiles, context);
- expect(watch.buildUpdatePromise).toBeTruthy();
- expect(watch.queuedChangedFileMap.size).toEqual(3);
- expect(watch.queuedChangedFileMap.get(changedFileFour.filePath)).toEqual(changedFileFour);
- expect(watch.queuedChangedFileMap.get(changedFileFive.filePath)).toEqual(changedFileFive);
- expect(watch.queuedChangedFileMap.get(changedFileSix.filePath)).toEqual(changedFileSix);
- // cool beans yo, go ahead and resolve another promise
- thirdPromiseResolve();
- return thirdPromise;
- }).then(function () {
- // return the original promise just to make sure everything is chained together
- return promise;
- });
- });
- });
- });
|