specmatic 2.12.0 → 2.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,62 +0,0 @@
1
- import path from 'path';
2
- import { specmaticKafkaJarName } from '../../config';
3
- import { ChildProcess, spawn } from 'child_process';
4
- import { Readable } from 'stream';
5
- import { mock as jestMock } from 'jest-mock-extended';
6
- import * as specmatic from '../..';
7
- import { KafkaStub } from '..';
8
-
9
- jest.mock('child_process');
10
- jest.mock('terminate');
11
-
12
- const SPECMATIC_JAR_PATH = path.resolve(__dirname, '..', '..', '..', '..','specmatic-commercial', 'kafka', specmaticKafkaJarName);
13
- const javaProcessMock = jestMock<ChildProcess>();
14
- const readableMock = jestMock<Readable>();
15
- javaProcessMock.stdout = readableMock;
16
- javaProcessMock.stderr = readableMock;
17
-
18
- beforeEach(() => {
19
- jest.resetAllMocks();
20
- });
21
-
22
- test('starts the specmatic kafka stub server', async () => {
23
- spawn.mockReturnValue(javaProcessMock);
24
-
25
- setTimeout(() => {
26
- const messageCallback = readableMock.on.mock.calls[0][1];
27
- messageCallback("[Specmatic::Mock] Starting api server on port:29092");
28
- messageCallback("[Specmatic::Mock] Kafka started on localhost:9092");
29
- messageCallback("[Specmatic::Mock] Listening on topics: (product-queries)")
30
- }, 0);
31
-
32
- await expect(specmatic.startKafkaStub()).resolves.toStrictEqual(
33
- new KafkaStub(9092, 29092, javaProcessMock)
34
- );
35
-
36
- expect(spawn.mock.calls[0][1][1]).toBe(`"${path.resolve(SPECMATIC_JAR_PATH)}"`);
37
- expect(spawn.mock.calls[0][1][2]).toBe("");
38
- });
39
-
40
- test('takes additional pass through arguments', async () => {
41
- spawn.mockReturnValue(javaProcessMock);
42
-
43
- setTimeout(() => {
44
- const messageCallback = readableMock.on.mock.calls[0][1];
45
- messageCallback("[Specmatic::Mock] Starting api server on port:29092");
46
- messageCallback("[Specmatic::Mock] Kafka started on localhost:1234");
47
- messageCallback("[Specmatic::Mock] Listening on topics: (product-queries)")
48
- }, 0);
49
-
50
- await expect(specmatic.startKafkaStub(1234, ['p1', 'p2'])).resolves.toStrictEqual(
51
- new KafkaStub(1234, 29092, javaProcessMock)
52
- );
53
-
54
- expect(spawn.mock.calls[0][1][1]).toBe(`"${path.resolve(SPECMATIC_JAR_PATH)}"`);
55
- expect(spawn.mock.calls[0][1][2]).toBe(" --port=1234 p1 p2");
56
- });
57
-
58
- test('stopStub method stops any running stub server', async () => {
59
- specmatic.stopKafkaMock(new KafkaStub(1234, 29092, javaProcessMock));
60
- expect(readableMock.removeAllListeners).toHaveBeenCalledTimes(2);
61
- expect(javaProcessMock.removeAllListeners).toHaveBeenCalledTimes(1);
62
- });
@@ -1,140 +0,0 @@
1
- import { callKafka } from '../common/runner';
2
- import logger from '../common/logger';
3
- import { ChildProcess } from 'child_process';
4
- import axios from 'axios';
5
- import terminate from 'terminate/promise';
6
-
7
- export class KafkaStub {
8
- port: number;
9
- apiPort: number;
10
- process: ChildProcess;
11
- constructor(port: number, apiPort: number, process: ChildProcess) {
12
- this.port = port;
13
- this.apiPort = apiPort;
14
- this.process = process;
15
- }
16
- }
17
-
18
- const startKafkaStub = (port?: number, args?: (string | number)[]): Promise<KafkaStub> => {
19
- var cmd = ``;
20
- if (port) cmd += ` --port=${port}`;
21
- if (args) cmd += ' ' + args.join(' ');
22
-
23
- logger.info('Kafka Stub: Starting server');
24
- logger.debug(`Kafka Stub: Executing "${cmd}"`);
25
-
26
- return new Promise((resolve, reject) => {
27
- let port: number, apiPort: number;
28
- const javaProcess = callKafka(
29
- cmd,
30
- (err: any) => {
31
- if (err) {
32
- logger.error(`Kafka Stub: Exited with error ${err}`);
33
- }
34
- },
35
- (message, error) => {
36
- if (!error) {
37
- if (message.indexOf('Kafka started on') > -1) {
38
- logger.info(`Kafka Stub: ${message}`);
39
- const stubInfo = message.split('Kafka started on')[1];
40
- if (stubInfo.length < 2) reject('Cannot determine port from kafka stub output');
41
- else port = parseInt(stubInfo.split(':')[1].trim());
42
- } else if (message.indexOf('Starting api server on port') > -1) {
43
- logger.info(`Kafka Stub: ${message}`);
44
- const stubInfo = message.split('Starting api server on port')[1];
45
- if (stubInfo.length < 2) reject('Cannot determine api port from kafka stub output');
46
- else apiPort = parseInt(stubInfo.split(':')[1].trim());
47
- } else if (message.indexOf('Listening on topic') > -1) {
48
- logger.info(`Kafka Stub: ${message}`);
49
- if (port && apiPort) resolve(new KafkaStub(port, apiPort, javaProcess));
50
- else reject('No port or api port information available but kafka stub listening on topic already');
51
- } else if (message.indexOf('Address already in use') > -1) {
52
- logger.error(`Kafka Stub: ${message}`);
53
- reject('Address already in use');
54
- } else {
55
- logger.debug(`Kafka Stub: ${message}`);
56
- }
57
- } else {
58
- logger.error(`Kafka Stub: ${message}`);
59
- }
60
- }
61
- );
62
- });
63
- };
64
-
65
- const stopKafkaStub = async (stub: KafkaStub) => {
66
- logger.debug(`Kafka Stub: Stopping at port=${stub.port}, apiPort=${stub.apiPort}`);
67
- const javaProcess = stub.process;
68
- javaProcess.stdout?.removeAllListeners();
69
- javaProcess.stderr?.removeAllListeners();
70
- javaProcess.removeAllListeners('close');
71
- await terminate(javaProcess.pid!);
72
- logger.info(`Kafka Stub: Stopped at port=${stub.port}, apiPort=${stub.apiPort}`);
73
- };
74
-
75
- const setKafkaStubExpectations = (stub: KafkaStub, expecations: any): Promise<void> => {
76
- const exectationsUrl = `http://localhost:${stub.apiPort}/_expectations`;
77
- logger.info(`Kafka Set Expectations: Url is ${exectationsUrl}`);
78
- return new Promise((resolve, reject) => {
79
- axios
80
- .post(`${exectationsUrl}`, expecations, {
81
- headers: {
82
- Accept: 'application/json',
83
- 'Content-Type': 'application/json',
84
- },
85
- })
86
- .then(response => {
87
- logger.debug(`Kafka Set Expectations: Finished ${JSON.stringify(response.data)}`)
88
- resolve()
89
- })
90
- .catch(err => {
91
- logger.error(`Kafka Set Expectations: Failed with error ${err}`)
92
- reject(`Set expectation failed with error ${err}`)
93
- })
94
- });
95
- };
96
-
97
- const verifyKafkaStub = (stub: KafkaStub): Promise<Boolean> => {
98
- const verificationUrl = `http://localhost:${stub.apiPort}/_expectations/verifications`;
99
- logger.info(`Kafka Verification: Url is ${verificationUrl}`);
100
- return new Promise((resolve, reject) => {
101
- axios.post(`${verificationUrl}`, {
102
- headers: {
103
- Accept: 'application/json',
104
- 'Content-Type': 'application/json',
105
- },
106
- })
107
- .then(response => {
108
- logger.debug(`Kafka Verification: Finished ${JSON.stringify(response.data)}`);
109
- if (!response.data.success) logger.info(`Kafka Verification: Errors\n${JSON.stringify(response.data)}`);
110
- resolve(response.data.success);
111
- })
112
- .catch(err => {
113
- logger.error(`Kafka Verification: Failed with error ${err}`);
114
- reject(`Kafka verification failed with error ${err}`);
115
- });
116
- });
117
- };
118
-
119
- const verifyKafkaStubMessage = (stub: KafkaStub, topic: string, value: string): Promise<Boolean> => {
120
- const verificationUrl = `http://localhost:${stub.apiPort}/_verifications`;
121
- logger.info(`Kafka Verify Message: Url is ${verificationUrl}`);
122
- return new Promise((resolve, reject) => {
123
- axios.post(`${verificationUrl}`, { topic: topic, value: value }, {
124
- headers: {
125
- Accept: 'application/json',
126
- 'Content-Type': 'application/json',
127
- },
128
- })
129
- .then(response => {
130
- logger.debug(`Kafka Verify Message: Finished ${JSON.stringify(response.data)}`);
131
- resolve(response.data.received);
132
- })
133
- .catch(err => {
134
- logger.error(`Kafka Verify Message: Failed with error ${err}`);
135
- reject(`Kafka message verification failed with error ${err}`);
136
- });
137
- });
138
- };
139
-
140
- export { startKafkaStub, stopKafkaStub, verifyKafkaStubMessage, verifyKafkaStub, setKafkaStubExpectations };