-
Notifications
You must be signed in to change notification settings - Fork 12k
/
Copy pathbuilder-harness_spec.ts
135 lines (95 loc) · 4.66 KB
/
builder-harness_spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { TestProjectHost } from '@angular-devkit/architect/testing';
import { BuilderHarness } from './builder-harness';
describe('BuilderHarness', () => {
let mockHost: TestProjectHost;
beforeEach(() => {
mockHost = jasmine.createSpyObj('TestProjectHost', ['root']);
(mockHost.root as jasmine.Spy).and.returnValue('.');
});
it('uses the provided builder handler', async () => {
const mockHandler = jasmine.createSpy().and.returnValue({ success: true });
const harness = new BuilderHarness(mockHandler, mockHost);
await harness.executeOnce();
expect(mockHandler).toHaveBeenCalled();
});
it('provides the builder output result when executing', async () => {
const mockHandler = jasmine.createSpy().and.returnValue({ success: false, property: 'value' });
const harness = new BuilderHarness(mockHandler, mockHost);
const { result } = await harness.executeOnce();
expect(result).toBeDefined();
expect(result?.success).toBeFalse();
expect(result?.property).toBe('value');
});
it('does not show builder logs on console when a builder succeeds', async () => {
const consoleErrorMock = spyOn(console, 'error');
const harness = new BuilderHarness(async (_, context) => {
context.logger.warn('TEST WARNING');
return { success: true };
}, mockHost);
const { result } = await harness.executeOnce();
expect(result).toBeDefined();
expect(result?.success).toBeTrue();
expect(consoleErrorMock).not.toHaveBeenCalledWith(jasmine.stringMatching('TEST WARNING'));
});
it('shows builder logs on console when a builder fails', async () => {
const consoleErrorMock = spyOn(console, 'error');
const harness = new BuilderHarness(async (_, context) => {
context.logger.warn('TEST WARNING');
return { success: false };
}, mockHost);
const { result } = await harness.executeOnce();
expect(result).toBeDefined();
expect(result?.success).toBeFalse();
expect(consoleErrorMock).toHaveBeenCalledWith(jasmine.stringMatching('TEST WARNING'));
});
it('does not show builder logs on console when a builder fails and outputLogsOnFailure: false', async () => {
const consoleErrorMock = spyOn(console, 'error');
const harness = new BuilderHarness(async (_, context) => {
context.logger.warn('TEST WARNING');
return { success: false };
}, mockHost);
const { result } = await harness.executeOnce({ outputLogsOnFailure: false });
expect(result).toBeDefined();
expect(result?.success).toBeFalse();
expect(consoleErrorMock).not.toHaveBeenCalledWith(jasmine.stringMatching('TEST WARNING'));
});
it('provides and logs the builder output exception when builder throws', async () => {
const mockHandler = jasmine.createSpy().and.throwError(new Error('Builder Error'));
const consoleErrorMock = spyOn(console, 'error');
const harness = new BuilderHarness(mockHandler, mockHost);
const { result, error } = await harness.executeOnce();
expect(result).toBeUndefined();
expect(error).toEqual(jasmine.objectContaining({ message: 'Builder Error' }));
expect(consoleErrorMock).toHaveBeenCalledWith(jasmine.stringMatching('Builder Error'));
});
it('does not log exception with outputLogsOnException false when builder throws', async () => {
const mockHandler = jasmine.createSpy().and.throwError(new Error('Builder Error'));
const consoleErrorMock = spyOn(console, 'error');
const harness = new BuilderHarness(mockHandler, mockHost);
const { result, error } = await harness.executeOnce({ outputLogsOnException: false });
expect(result).toBeUndefined();
expect(error).toEqual(jasmine.objectContaining({ message: 'Builder Error' }));
expect(consoleErrorMock).not.toHaveBeenCalledWith(jasmine.stringMatching('Builder Error'));
});
it('supports executing a target from within a builder', async () => {
const mockHandler = jasmine.createSpy().and.returnValue({ success: true });
const harness = new BuilderHarness(async (_, context) => {
const run = await context.scheduleTarget({ project: 'test', target: 'another' });
expect(await run.result).toEqual(jasmine.objectContaining({ success: true }));
await run.stop();
return { success: true };
}, mockHost);
harness.withBuilderTarget('another', mockHandler);
const { result } = await harness.executeOnce();
expect(result).toBeDefined();
expect(result?.success).toBeTrue();
expect(mockHandler).toHaveBeenCalled();
});
});