UNPKG

10.4 kBJavaScriptView Raw
1"use strict";
2/**
3 * @license
4 * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
5 * This code may only be used under the BSD style license found at
6 * http://polymer.github.io/LICENSE.txt
7 * The complete set of authors may be found at
8 * http://polymer.github.io/AUTHORS.txt
9 * The complete set of contributors may be found at
10 * http://polymer.github.io/CONTRIBUTORS.txt
11 * Code distributed by Google as part of the polymer project is also
12 * subject to an additional IP rights grant found at
13 * http://polymer.github.io/PATENTS.txt
14 */
15var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16 return new (P || (P = Promise))(function (resolve, reject) {
17 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
20 step((generator = generator.apply(thisArg, _arguments || [])).next());
21 });
22};
23Object.defineProperty(exports, "__esModule", { value: true });
24// TODO Migrate to async tests.
25const chai_1 = require("chai");
26const fs = require("mz/fs");
27const path = require("path");
28const vfs = require("vinyl-fs");
29const polymer_project_1 = require("../polymer-project");
30const serviceWorker = require("../service-worker");
31const temp = require('temp').track();
32const mergeStream = require('merge-stream');
33suite('service-worker', () => {
34 let testBuildRoot;
35 let defaultProject;
36 setup((done) => {
37 defaultProject = new polymer_project_1.PolymerProject({
38 root: path.resolve('test-fixtures/test-project'),
39 entrypoint: 'index.html',
40 shell: 'shell.html',
41 sources: [
42 'source-dir/**',
43 ],
44 });
45 temp.mkdir('polymer-build-test', (err, dir) => {
46 if (err || dir === undefined) {
47 return done(err || 'no dir given');
48 }
49 testBuildRoot = dir;
50 vfs.src(path.join('test-fixtures/test-project/**'))
51 .pipe(vfs.dest(dir))
52 .on('end', () => {
53 mergeStream(defaultProject.sources(), defaultProject.dependencies())
54 .pipe(vfs.dest(testBuildRoot))
55 .on('end', () => done())
56 .on('error', done);
57 });
58 });
59 });
60 teardown((done) => {
61 temp.cleanup(done);
62 });
63 suite('hasNoFileExtension regexp', () => {
64 test('matches URL paths correctly', () => {
65 const test = (s) => serviceWorker.hasNoFileExtension.test(s);
66 chai_1.assert.isTrue(test('/'));
67 chai_1.assert.isTrue(test('/foo'));
68 chai_1.assert.isTrue(test('/foo/'));
69 chai_1.assert.isTrue(test('/foo.png/bar/'));
70 chai_1.assert.isTrue(test('/foo?baz.png'));
71 chai_1.assert.isFalse(test('/foo.png'));
72 chai_1.assert.isFalse(test('/foo/bar.png'));
73 });
74 });
75 suite('generateServiceWorkerConfig()', () => {
76 test('should set entrypoint related options', () => __awaiter(this, void 0, void 0, function* () {
77 const config = yield serviceWorker.generateServiceWorkerConfig({
78 project: defaultProject,
79 buildRoot: testBuildRoot,
80 });
81 chai_1.assert.equal(config.navigateFallback, 'index.html');
82 chai_1.assert.deepEqual(config.navigateFallbackWhitelist, [serviceWorker.hasNoFileExtension]);
83 chai_1.assert.equal(config.directoryIndex, '');
84 }));
85 });
86 suite('generateServiceWorker()', () => {
87 test('should throw when options are not provided', () => {
88 // tslint:disable-next-line: no-any testing type unsafe code
89 return serviceWorker.generateServiceWorker().then(() => {
90 chai_1.assert.fail('generateServiceWorker() resolved, expected rejection!');
91 }, (error) => {
92 chai_1.assert.include(error.name, 'AssertionError');
93 chai_1.assert.equal(error.message, '`project` & `buildRoot` options are required');
94 });
95 });
96 test('should throw when options.project is not provided', () => {
97 // tslint:disable-next-line: no-any testing type unsafe code
98 const unsafeForm = serviceWorker.generateServiceWorker;
99 return unsafeForm({ buildRoot: testBuildRoot })
100 .then(() => {
101 chai_1.assert.fail('generateServiceWorker() resolved, expected rejection!');
102 }, (error) => {
103 chai_1.assert.include(error.name, 'AssertionError');
104 chai_1.assert.equal(error.message, '`project` option is required');
105 });
106 });
107 test('should throw when options.buildRoot is not provided', () => {
108 // tslint:disable-next-line: no-any testing type unsafe code
109 const unsafeForm = serviceWorker.generateServiceWorker;
110 return unsafeForm({ project: defaultProject })
111 .then(() => {
112 chai_1.assert.fail('generateServiceWorker() resolved, expected rejection!');
113 }, (error) => {
114 chai_1.assert.include(error.name, 'AssertionError');
115 chai_1.assert.equal(error.message, '`buildRoot` option is required');
116 });
117 });
118 test('should not modify the options object provided when called', () => {
119 const swPrecacheConfig = { staticFileGlobs: [] };
120 return serviceWorker
121 .generateServiceWorker({
122 project: defaultProject,
123 buildRoot: testBuildRoot,
124 swPrecacheConfig: swPrecacheConfig,
125 })
126 .then(() => {
127 chai_1.assert.equal(swPrecacheConfig.staticFileGlobs.length, 0);
128 });
129 });
130 test('should resolve with a Buffer representing the generated service worker code', () => {
131 return serviceWorker
132 .generateServiceWorker({
133 project: defaultProject,
134 buildRoot: testBuildRoot,
135 })
136 .then((swCode) => {
137 chai_1.assert.ok(swCode instanceof Buffer);
138 });
139 });
140 test('should add unbundled precached assets when options.unbundled is not provided', () => {
141 return serviceWorker
142 .generateServiceWorker({
143 project: defaultProject,
144 buildRoot: testBuildRoot,
145 })
146 .then((swFile) => {
147 const fileContents = swFile.toString();
148 chai_1.assert.include(fileContents, '"index.html"');
149 chai_1.assert.include(fileContents, '"shell.html"');
150 chai_1.assert.include(fileContents, '"bower_components/dep.html"');
151 chai_1.assert.notInclude(fileContents, '"source-dir/my-app.html"');
152 });
153 });
154 test('should add bundled precached assets when options.bundled is provided', () => {
155 return serviceWorker
156 .generateServiceWorker({
157 project: defaultProject,
158 buildRoot: testBuildRoot,
159 bundled: true,
160 })
161 .then((swFile) => {
162 const fileContents = swFile.toString();
163 chai_1.assert.include(fileContents, '"index.html"');
164 chai_1.assert.include(fileContents, '"shell.html"');
165 chai_1.assert.notInclude(fileContents, '"bower_components/dep.html"');
166 chai_1.assert.notInclude(fileContents, '"source-dir/my-app.html"');
167 });
168 });
169 test('should add provided staticFileGlobs paths to the final list', () => {
170 return serviceWorker
171 .generateServiceWorker({
172 project: defaultProject,
173 buildRoot: testBuildRoot,
174 bundled: true,
175 swPrecacheConfig: {
176 staticFileGlobs: ['/bower_components/dep.html'],
177 },
178 })
179 .then((swFile) => {
180 const fileContents = swFile.toString();
181 chai_1.assert.include(fileContents, '"index.html"');
182 chai_1.assert.include(fileContents, '"shell.html"');
183 chai_1.assert.include(fileContents, '"bower_components/dep.html"');
184 chai_1.assert.notInclude(fileContents, '"source-dir/my-app.html"');
185 });
186 });
187 test('basePath should prefix resources', () => {
188 return serviceWorker
189 .generateServiceWorker({
190 project: defaultProject,
191 buildRoot: testBuildRoot,
192 basePath: '/my/base/path',
193 })
194 .then((swFile) => {
195 const fileContents = swFile.toString();
196 chai_1.assert.include(fileContents, '"/my/base/path/index.html"');
197 });
198 });
199 test('basePath prefixes should not have double delimiters', () => {
200 return serviceWorker
201 .generateServiceWorker({
202 project: defaultProject,
203 buildRoot: testBuildRoot,
204 basePath: '/my/base/path/',
205 })
206 .then((swFile) => {
207 const fileContents = swFile.toString();
208 chai_1.assert.include(fileContents, '"/my/base/path/index.html"');
209 chai_1.assert.notInclude(fileContents, '"/my/base/path//index.html"');
210 });
211 });
212 });
213 suite('addServiceWorker()', () => {
214 test('should write generated service worker to file system', () => {
215 return serviceWorker
216 .addServiceWorker({
217 project: defaultProject,
218 buildRoot: testBuildRoot,
219 })
220 .then(() => {
221 const content = fs.readFileSync(path.join(testBuildRoot, 'service-worker.js'), 'utf-8');
222 chai_1.assert.include(content, '// This generated service worker JavaScript will precache your site\'s resources.');
223 });
224 });
225 });
226});
227//# sourceMappingURL=service-worker_test.js.map
\No newline at end of file