Skip to content

Commit aca0be0

Browse files
committed
test(@angular-devkit/build-angular): enable vite service worker unit tests
Enable service worker tests for vite.
1 parent 9906ab7 commit aca0be0

File tree

1 file changed

+170
-161
lines changed

1 file changed

+170
-161
lines changed

packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/serve_service-worker_spec.ts

Lines changed: 170 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ const manifest = {
2727
installMode: 'lazy',
2828
updateMode: 'prefetch',
2929
resources: {
30-
files: ['/assets/**', '/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)'],
30+
files: [
31+
'/media/**',
32+
'/assets/**',
33+
'/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)',
34+
],
3135
},
3236
},
3337
],
@@ -37,182 +41,187 @@ describeServeBuilder(
3741
executeDevServer,
3842
DEV_SERVER_BUILDER_INFO,
3943
(harness, setupTarget, isViteRun) => {
40-
// TODO(fix-vite): currently this is broken in vite.
41-
(isViteRun ? xdescribe : describe)(
42-
'Behavior: "dev-server builder serves service worker"',
43-
() => {
44-
beforeEach(async () => {
45-
// Application code is not needed for these tests
46-
await harness.writeFile('src/main.ts', '');
47-
await harness.writeFile('src/polyfills.ts', '');
48-
49-
harness.useProject('test', {
50-
root: '.',
51-
sourceRoot: 'src',
52-
cli: {
53-
cache: {
54-
enabled: false,
55-
},
44+
describe('Behavior: "dev-server builder serves service worker"', () => {
45+
beforeEach(async () => {
46+
// Application code is not needed for these tests
47+
await harness.writeFile('src/main.ts', '');
48+
await harness.writeFile('src/polyfills.ts', '');
49+
50+
harness.useProject('test', {
51+
root: '.',
52+
sourceRoot: 'src',
53+
cli: {
54+
cache: {
55+
enabled: false,
5656
},
57-
i18n: {
58-
sourceLocale: {
59-
'code': 'fr',
60-
},
57+
},
58+
i18n: {
59+
sourceLocale: {
60+
'code': 'fr',
6161
},
62-
});
62+
},
63+
});
64+
});
65+
66+
it('works with service worker', async () => {
67+
setupTarget(harness, {
68+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
69+
serviceWorker: (isViteRun ? 'ngsw-config.json' : true) as any,
70+
resourcesOutputPath: isViteRun ? undefined : 'media',
71+
assets: ['src/favicon.ico', 'src/assets'],
72+
styles: ['src/styles.css'],
73+
});
74+
75+
await harness.writeFiles({
76+
'ngsw-config.json': JSON.stringify(manifest),
77+
'src/assets/folder-asset.txt': 'folder-asset.txt',
78+
'src/styles.css': `body { background: url(./spectrum.png); }`,
6379
});
6480

65-
it('works with service worker', async () => {
66-
setupTarget(harness, {
67-
serviceWorker: true,
68-
assets: ['src/favicon.ico', 'src/assets'],
69-
styles: ['src/styles.css'],
70-
});
71-
72-
await harness.writeFiles({
73-
'ngsw-config.json': JSON.stringify(manifest),
74-
'src/assets/folder-asset.txt': 'folder-asset.txt',
75-
'src/styles.css': `body { background: url(./spectrum.png); }`,
76-
});
77-
78-
harness.useTarget('serve', {
79-
...BASE_OPTIONS,
80-
});
81-
82-
const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json');
83-
84-
expect(result?.success).toBeTrue();
85-
86-
expect(await response?.json()).toEqual(
87-
jasmine.objectContaining({
88-
configVersion: 1,
89-
index: '/index.html',
90-
navigationUrls: [
91-
{ positive: true, regex: '^\\/.*$' },
92-
{ positive: false, regex: '^\\/(?:.+\\/)?[^/]*\\.[^/]*$' },
93-
{ positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*$' },
94-
{ positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$' },
95-
],
96-
assetGroups: [
97-
{
98-
name: 'app',
99-
installMode: 'prefetch',
100-
updateMode: 'prefetch',
101-
urls: ['/favicon.ico', '/index.html'],
102-
cacheQueryOptions: {
103-
ignoreVary: true,
104-
},
105-
patterns: [],
81+
harness.useTarget('serve', {
82+
...BASE_OPTIONS,
83+
});
84+
85+
const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json');
86+
87+
expect(result?.success).toBeTrue();
88+
89+
expect(await response?.json()).toEqual(
90+
jasmine.objectContaining({
91+
configVersion: 1,
92+
index: '/index.html',
93+
navigationUrls: [
94+
{ positive: true, regex: '^\\/.*$' },
95+
{ positive: false, regex: '^\\/(?:.+\\/)?[^/]*\\.[^/]*$' },
96+
{ positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*$' },
97+
{ positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$' },
98+
],
99+
assetGroups: [
100+
{
101+
name: 'app',
102+
installMode: 'prefetch',
103+
updateMode: 'prefetch',
104+
urls: ['/favicon.ico', '/index.html'],
105+
cacheQueryOptions: {
106+
ignoreVary: true,
106107
},
107-
{
108-
name: 'assets',
109-
installMode: 'lazy',
110-
updateMode: 'prefetch',
111-
urls: ['/assets/folder-asset.txt', '/spectrum.png'],
112-
cacheQueryOptions: {
113-
ignoreVary: true,
114-
},
115-
patterns: [],
108+
patterns: [],
109+
},
110+
{
111+
name: 'assets',
112+
installMode: 'lazy',
113+
updateMode: 'prefetch',
114+
urls: ['/assets/folder-asset.txt', '/media/spectrum.png'],
115+
cacheQueryOptions: {
116+
ignoreVary: true,
116117
},
117-
],
118-
dataGroups: [],
119-
hashTable: {
120-
'/favicon.ico': '84161b857f5c547e3699ddfbffc6d8d737542e01',
121-
'/assets/folder-asset.txt': '617f202968a6a81050aa617c2e28e1dca11ce8d4',
122-
'/index.html': '9d232e3e13b4605d197037224a2a6303dd337480',
123-
'/spectrum.png': '8d048ece46c0f3af4b598a95fd8e4709b631c3c0',
118+
patterns: [],
124119
},
125-
}),
126-
);
120+
],
121+
dataGroups: [],
122+
hashTable: {
123+
'/favicon.ico': '84161b857f5c547e3699ddfbffc6d8d737542e01',
124+
'/assets/folder-asset.txt': '617f202968a6a81050aa617c2e28e1dca11ce8d4',
125+
'/index.html': isViteRun
126+
? 'e5b73e6798d2782bf59dd5272d254d5bde364695'
127+
: '9d232e3e13b4605d197037224a2a6303dd337480',
128+
'/media/spectrum.png': '8d048ece46c0f3af4b598a95fd8e4709b631c3c0',
129+
},
130+
}),
131+
);
132+
});
133+
134+
it('works with localize', async () => {
135+
setupTarget(harness, {
136+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
137+
serviceWorker: (isViteRun ? 'ngsw-config.json' : true) as any,
138+
resourcesOutputPath: isViteRun ? undefined : 'media',
139+
assets: ['src/favicon.ico', 'src/assets'],
140+
styles: ['src/styles.css'],
141+
localize: ['fr'],
127142
});
128143

129-
it('works with localize', async () => {
130-
setupTarget(harness, {
131-
serviceWorker: true,
132-
assets: ['src/favicon.ico', 'src/assets'],
133-
styles: ['src/styles.css'],
134-
localize: ['fr'],
135-
});
144+
await harness.writeFiles({
145+
'ngsw-config.json': JSON.stringify(manifest),
146+
'src/assets/folder-asset.txt': 'folder-asset.txt',
147+
'src/styles.css': `body { background: url(./spectrum.png); }`,
148+
});
136149

137-
await harness.writeFiles({
138-
'ngsw-config.json': JSON.stringify(manifest),
139-
'src/assets/folder-asset.txt': 'folder-asset.txt',
140-
'src/styles.css': `body { background: url(./spectrum.png); }`,
141-
});
150+
harness.useTarget('serve', {
151+
...BASE_OPTIONS,
152+
});
142153

143-
harness.useTarget('serve', {
144-
...BASE_OPTIONS,
145-
});
154+
const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json');
146155

147-
const { result, response } = await executeOnceAndFetch(harness, '/ngsw.json');
156+
expect(result?.success).toBeTrue();
148157

149-
expect(result?.success).toBeTrue();
158+
expect(await response?.json()).toBeDefined();
159+
});
150160

151-
expect(await response?.json()).toBeDefined();
161+
// TODO(fix-vite): currently this is broken in vite due to watcher never terminates.
162+
(isViteRun ? xit : it)('works in watch mode', async () => {
163+
setupTarget(harness, {
164+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
165+
serviceWorker: (isViteRun ? 'ngsw-config.json' : true) as any,
166+
resourcesOutputPath: isViteRun ? undefined : 'media',
167+
assets: ['src/favicon.ico', 'src/assets'],
168+
styles: ['src/styles.css'],
152169
});
153170

154-
it('works in watch mode', async () => {
155-
setupTarget(harness, {
156-
serviceWorker: true,
157-
assets: ['src/favicon.ico', 'src/assets'],
158-
styles: ['src/styles.css'],
159-
});
160-
161-
await harness.writeFiles({
162-
'ngsw-config.json': JSON.stringify(manifest),
163-
'src/assets/folder-asset.txt': 'folder-asset.txt',
164-
'src/styles.css': `body { background: url(./spectrum.png); }`,
165-
});
166-
167-
harness.useTarget('serve', {
168-
...BASE_OPTIONS,
169-
watch: true,
170-
});
171-
172-
const buildCount = await harness
173-
.execute()
174-
.pipe(
175-
timeout(BUILD_TIMEOUT),
176-
concatMap(async ({ result }, index) => {
177-
expect(result?.success).toBeTrue();
178-
const response = await fetch(new URL('ngsw.json', `${result?.baseUrl}`));
179-
const { hashTable } = (await response.json()) as { hashTable: object };
180-
const hashTableEntries = Object.keys(hashTable);
181-
182-
switch (index) {
183-
case 0:
184-
expect(hashTableEntries).toEqual([
185-
'/assets/folder-asset.txt',
186-
'/favicon.ico',
187-
'/index.html',
188-
'/spectrum.png',
189-
]);
190-
191-
await harness.writeFile(
192-
'src/assets/folder-new-asset.txt',
193-
harness.readFile('src/assets/folder-asset.txt'),
194-
);
195-
break;
196-
197-
case 1:
198-
expect(hashTableEntries).toEqual([
199-
'/assets/folder-asset.txt',
200-
'/assets/folder-new-asset.txt',
201-
'/favicon.ico',
202-
'/index.html',
203-
'/spectrum.png',
204-
]);
205-
break;
206-
}
207-
}),
208-
take(2),
209-
count(),
210-
)
211-
.toPromise();
212-
213-
expect(buildCount).toBe(2);
171+
await harness.writeFiles({
172+
'ngsw-config.json': JSON.stringify(manifest),
173+
'src/assets/folder-asset.txt': 'folder-asset.txt',
174+
'src/styles.css': `body { background: url(./spectrum.png); }`,
214175
});
215-
},
216-
);
176+
177+
harness.useTarget('serve', {
178+
...BASE_OPTIONS,
179+
watch: true,
180+
});
181+
182+
const buildCount = await harness
183+
.execute()
184+
.pipe(
185+
timeout(BUILD_TIMEOUT),
186+
concatMap(async ({ result }, index) => {
187+
expect(result?.success).toBeTrue();
188+
const response = await fetch(new URL('ngsw.json', `${result?.baseUrl}`));
189+
const { hashTable } = (await response.json()) as { hashTable: object };
190+
const hashTableEntries = Object.keys(hashTable);
191+
192+
switch (index) {
193+
case 0:
194+
expect(hashTableEntries).toEqual([
195+
'/assets/folder-asset.txt',
196+
'/favicon.ico',
197+
'/index.html',
198+
'/media/spectrum.png',
199+
]);
200+
201+
await harness.writeFile(
202+
'src/assets/folder-new-asset.txt',
203+
harness.readFile('src/assets/folder-asset.txt'),
204+
);
205+
break;
206+
207+
case 1:
208+
expect(hashTableEntries).toEqual([
209+
'/assets/folder-asset.txt',
210+
'/assets/folder-new-asset.txt',
211+
'/favicon.ico',
212+
'/index.html',
213+
'/media/spectrum.png',
214+
]);
215+
break;
216+
}
217+
}),
218+
take(2),
219+
count(),
220+
)
221+
.toPromise();
222+
223+
expect(buildCount).toBe(2);
224+
});
225+
});
217226
},
218227
);

0 commit comments

Comments
 (0)