/
cli-run-failure.test.ts
108 lines (77 loc) · 3.06 KB
/
cli-run-failure.test.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
const mockCreateIntegrationLogger = jest.fn();
jest.doMock('@jupiterone/integration-sdk-runtime', () => ({
...(jest.requireActual('@jupiterone/integration-sdk-runtime') as any),
createIntegrationLogger: mockCreateIntegrationLogger,
}));
import { mocked } from 'ts-jest/utils';
import { Polly } from '@pollyjs/core';
import NodeHttpAdapter from '@pollyjs/adapter-node-http';
import FSPersister from '@pollyjs/persister-fs';
import { loadProjectStructure } from '@jupiterone/integration-sdk-private-test-utils';
import { SynchronizationJobStatus } from '@jupiterone/integration-sdk-core';
import { generateSynchronizationJob } from './util/synchronization';
import { createCli } from '../index';
import { setupSynchronizerApi } from './util/synchronization';
import * as log from '../log';
import { createTestPolly } from './util/recording';
jest.mock('../log');
Polly.register(NodeHttpAdapter);
Polly.register(FSPersister);
const { createIntegrationLogger } = jest.requireActual(
'@jupiterone/integration-sdk-runtime',
);
let polly: Polly;
beforeEach(() => {
process.env.JUPITERONE_API_KEY = 'testing-key';
process.env.JUPITERONE_ACCOUNT = 'mochi';
loadProjectStructure('validationFailure');
polly = createTestPolly('run-cli-failure');
mocked(mockCreateIntegrationLogger).mockReturnValue(
createIntegrationLogger({ name: 'test' }),
);
jest.spyOn(process, 'exit').mockImplementation((code: number | undefined) => {
throw new Error(`Process exited with code ${code}`);
});
});
afterEach(() => {
polly.disconnect();
});
test('aborts synchronization job if an error occurs', async () => {
const job = generateSynchronizationJob();
setupSynchronizerApi({ polly, job, baseUrl: 'https://api.us.jupiterone.io' });
await createCli().parseAsync([
'node',
'j1-integration',
'run',
'--integrationInstanceId',
'test',
]);
expect(log.displaySynchronizationResults).toHaveBeenCalledTimes(1);
expect(log.displaySynchronizationResults).toHaveBeenCalledWith({
...job,
status: SynchronizationJobStatus.ABORTED,
});
});
test('does not log errors that have been previously logged', async () => {
const job = generateSynchronizationJob();
setupSynchronizerApi({ polly, job, baseUrl: 'https://api.us.jupiterone.io' });
const logger = createIntegrationLogger({ name: 'test' });
const isHandledErrorSpy = jest.spyOn(logger, 'isHandledError');
const validationFailureSpy = jest.spyOn(logger, 'validationFailure');
const warnSpy = jest.spyOn(logger, 'warn');
jest.spyOn(logger, 'child').mockReturnValue(logger);
mocked(mockCreateIntegrationLogger).mockReturnValue(logger);
await createCli().parseAsync([
'node',
'j1-integration',
'run',
'--integrationInstanceId',
'test',
]);
expect(validationFailureSpy).toHaveBeenCalledTimes(1);
const loggedError = validationFailureSpy.mock.calls[0][0];
expect(isHandledErrorSpy).toHaveBeenCalledTimes(1);
expect(isHandledErrorSpy).toHaveBeenCalledWith(loggedError);
expect(isHandledErrorSpy).toHaveReturnedWith(true);
expect(warnSpy).toHaveBeenCalledTimes(1);
});