1 | 'use strict';
|
2 |
|
3 | var ServiceWorkerBuilder = require('../lib/service-worker-builder');
|
4 | var assert = require('chai').assert;
|
5 | var fs = require('fs');
|
6 | var path = require('path');
|
7 | var helper = require('broccoli-test-helper');
|
8 | var Babel = require('broccoli-babel-transpiler');
|
9 | var EmberCliBabel = require('ember-cli-babel');
|
10 |
|
11 | var fixturePath = path.join(__dirname, 'fixtures');
|
12 | var createBuilder = helper.createBuilder;
|
13 | var serviceWorkerFilename = 'sw.js';
|
14 |
|
15 | var generatePlugin = function(name, projectPath) {
|
16 | return {
|
17 | pkg: { name: name },
|
18 | root: path.join(fixturePath, projectPath),
|
19 | };
|
20 | };
|
21 |
|
22 | describe('Service Worker Builder', () => {
|
23 | let app;
|
24 | let build;
|
25 | let output;
|
26 |
|
27 | beforeEach(() => {
|
28 |
|
29 | build = function(options, type) {
|
30 | let subject = new ServiceWorkerBuilder(options).build(type);
|
31 | output = createBuilder(subject);
|
32 | return output.build();
|
33 | };
|
34 |
|
35 | app = {
|
36 | treeGenerator: (dir) => dir,
|
37 | project: {
|
38 | addons: [
|
39 | {
|
40 | name: 'ember-cli-babel',
|
41 | transpileTree(tree, options) {
|
42 | return new Babel(tree, {
|
43 | annotation: "Babel: app-with-sw",
|
44 | babelrc: false,
|
45 | highlightCode: false,
|
46 | sourceMaps: false,
|
47 | presets: [
|
48 | EmberCliBabel._getPresetEnv({ 'ember-cli-babel': { compileModules: false } }),
|
49 | ].filter(Boolean)
|
50 | });
|
51 | }
|
52 | }
|
53 | ]
|
54 | },
|
55 | };
|
56 | });
|
57 |
|
58 | afterEach(() => output.dispose());
|
59 |
|
60 | it('returns a tree with the sw.js file', () => {
|
61 | let plugins = [generatePlugin('test-project', 'builder-test')];
|
62 | return build({ app, plugins, serviceWorkerFilename }, 'service-worker').then(() => {
|
63 | let files = output.read();
|
64 | assert.property(files, serviceWorkerFilename);
|
65 | });
|
66 | });
|
67 |
|
68 | it('returns a tree with a custom service worker file', () => {
|
69 | let plugins = [generatePlugin('test-project', 'builder-test')];
|
70 | return build({ app, plugins, serviceWorkerFilename: 'kermit.js' }, 'service-worker').then(() => {
|
71 | let files = output.read();
|
72 | assert.property(files, 'kermit.js');
|
73 | });
|
74 | });
|
75 |
|
76 | it('returns a tree with the sw-registration.js file', () => {
|
77 | let plugins = [generatePlugin('test-project', 'builder-test')];
|
78 | return build({ app, plugins }, 'service-worker-registration').then(() => {
|
79 | let files = output.read();
|
80 | assert.property(files, 'sw-registration.js');
|
81 | });
|
82 | });
|
83 |
|
84 | it('transpiles code with babel', () => {
|
85 | let plugins = [generatePlugin('test-project', 'builder-test/babel')];
|
86 | return build({ app, plugins, serviceWorkerFilename }, 'service-worker').then(() => {
|
87 | let expected = `(function () {
|
88 | 'use strict';
|
89 |
|
90 | var CONSTANT = 42;
|
91 | self.addEventListener('fetch', function () {
|
92 | var x = CONSTANT + 1;
|
93 | return x;
|
94 | });
|
95 |
|
96 | }());
|
97 | `;
|
98 | let files = output.read();
|
99 | assert.property(files, serviceWorkerFilename);
|
100 | assert.equal(files[serviceWorkerFilename], expected);
|
101 | });
|
102 | });
|
103 |
|
104 | it('uses rollup to concat all modules in a file', () => {
|
105 | let plugins = [
|
106 | generatePlugin('plugin-a', 'builder-test/rollup/plugin-a'),
|
107 | generatePlugin('plugin-b', 'builder-test/rollup/plugin-b')
|
108 | ];
|
109 |
|
110 | return build({ app, plugins, serviceWorkerFilename }, 'service-worker')
|
111 | .then((results) => {
|
112 | let expected = `(function () {
|
113 | 'use strict';
|
114 |
|
115 | var CONSTANT = 42;
|
116 |
|
117 | self.addEventListener('fetch', function () {
|
118 | var x = CONSTANT + 1;
|
119 | return x;
|
120 | });
|
121 |
|
122 | }());
|
123 | `;
|
124 |
|
125 | let files = output.read();
|
126 | assert.property(files, serviceWorkerFilename);
|
127 | assert.equal(files[serviceWorkerFilename], expected);
|
128 | });
|
129 | });
|
130 |
|
131 | it('uglifies the code when `minifyJS` is enabled', () => {
|
132 | let plugins = [generatePlugin('test-project', 'builder-test')];
|
133 | return build({ app, plugins, serviceWorkerFilename, minifyJS: { enabled: true } }, 'service-worker')
|
134 | .then((results) => {
|
135 | let expected = '\n//# sourceMappingURL=sw.map';
|
136 |
|
137 | let files = output.read();
|
138 | assert.property(files, serviceWorkerFilename);
|
139 | assert.equal(files[serviceWorkerFilename], expected);
|
140 | });
|
141 | });
|
142 | });
|