Skip to content

Commit 4925105

Browse files
authored
Merge pull request #476 from open-rpc/feat/multiple-reporters
feat: added mulitple reporters feature
2 parents ed3812c + 606e956 commit 4925105

File tree

5 files changed

+72
-40
lines changed

5 files changed

+72
-40
lines changed

bin/cli.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const program = require('commander');
33
const orpcCoverage = require('../build').default;
44
const { parseOpenRPCDocument } = require('@open-rpc/schema-utils-js');
55

6-
const getMethodsArray = (input) => {
6+
const getArrayFromCommaSeparated = (input) => {
77
if (input && input.split(',').length > 0) {
88
return input.split(',');
99
} else {
@@ -15,10 +15,10 @@ program
1515
.version(require('./get-version'))
1616
.usage('[options]')
1717
.option('-s, --schema [schema]', 'JSON string or a Path/Url pointing to an open rpc schema')
18-
.option('-r, --reporter <reporter>', 'Use the specified reporter [console] [json] [empty]')
18+
.option('-r, --reporters <reporters>', 'Use the specified reporter [console] [json] [empty]. Can be a comma separated list of reporters.')
1919
.option('-t, --transport <transport>', 'Use the specified transport [http]')
20-
.option('--skip <skip>', 'Methods to skip')
21-
.option('--only <only>', 'Methods to only run')
20+
.option('--skip <skip>', 'Methods to skip. Comma separated list of method names')
21+
.option('--only <only>', 'Methods to only run. Comma separated list of method names')
2222
.action(async (options) => {
2323
let schema;
2424
try {
@@ -32,9 +32,9 @@ program
3232
await orpcCoverage({
3333
openrpcDocument: schema,
3434
transport: options.transport,
35-
reporter: options.reporter,
36-
skip: getMethodsArray(options.skip),
37-
only: getMethodsArray(options.only),
35+
reporters: getArrayFromCommaSeparated(options.reporters),
36+
skip: getArrayFromCommaSeparated(options.skip),
37+
only: getArrayFromCommaSeparated(options.only),
3838
});
3939
} catch (e) {
4040
console.error(e);

src/coverage.test.ts

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import coverage, { ExampleCall, IOptions } from "./coverage";
22
import { OpenrpcDocument } from "@open-rpc/meta-schema";
33
import EmptyReporter from "./reporters/emptyReporter";
4+
import ConsoleReporter from "./reporters/console";
45

56
const mockSchema = {
67
openrpc: "1.0.0",
@@ -127,7 +128,7 @@ describe("coverage", () => {
127128
}
128129
const transport = () => Promise.resolve();
129130
coverage({
130-
reporter: new CustomReporter(),
131+
reporters: [new CustomReporter()],
131132
transport,
132133
openrpcDocument: mockSchema,
133134
skip: [],
@@ -148,7 +149,7 @@ describe("coverage", () => {
148149
return { result: true };
149150
};
150151
coverage({
151-
reporter: new CustomReporter(),
152+
reporters: [new CustomReporter()],
152153
transport,
153154
openrpcDocument: mockSchema,
154155
skip: [],
@@ -168,7 +169,7 @@ describe("coverage", () => {
168169
const transport = () => Promise.resolve({});
169170
const openrpcDocument = mockSchema;
170171
const options = {
171-
reporter,
172+
reporters: [reporter],
172173
transport,
173174
openrpcDocument,
174175
skip: ['foo', 'bar', 'baz'],
@@ -189,14 +190,14 @@ describe("coverage", () => {
189190
const openrpcDocument = {...mockSchema};
190191
openrpcDocument.servers = undefined;
191192
const options = {
192-
reporter,
193+
reporters: [reporter],
193194
transport,
194195
openrpcDocument,
195196
skip: [],
196197
only: ['baz'],
197198
};
198199

199-
await expect(coverage(options)).resolves.toBeUndefined();
200+
await expect(coverage(options)).resolves.toBeDefined();
200201
});
201202
});
202203
describe("transport", () => {
@@ -206,7 +207,7 @@ describe("coverage", () => {
206207
return Promise.resolve({});
207208
};
208209
coverage({
209-
reporter: new EmptyReporter(),
210+
reporters: [new EmptyReporter()],
210211
transport,
211212
openrpcDocument: mockSchema,
212213
skip: [],
@@ -222,7 +223,7 @@ describe("coverage", () => {
222223
const transport = () => Promise.resolve({});
223224
const openrpcDocument = mockSchema;
224225
const options = {
225-
reporter,
226+
reporters: [reporter],
226227
transport,
227228
openrpcDocument,
228229
skip: [],
@@ -244,7 +245,7 @@ describe("coverage", () => {
244245
const transport = () => Promise.resolve({});
245246
const openrpcDocument = mockSchema;
246247
const options = {
247-
reporter,
248+
reporters: [reporter],
248249
transport,
249250
openrpcDocument,
250251
skip: [],
@@ -254,5 +255,40 @@ describe("coverage", () => {
254255
await coverage(options);
255256
expect(spy).toHaveBeenCalledTimes(12);
256257
});
258+
it("can handle multiple reporters", async () => {
259+
const reporter = new EmptyReporter();
260+
const reporter2 = new EmptyReporter();
261+
const transport = () => Promise.resolve({});
262+
const openrpcDocument = mockSchema;
263+
264+
const onBeginSpy = jest.spyOn(reporter, "onBegin");
265+
const onTestBeginSpy = jest.spyOn(reporter, "onTestBegin");
266+
const onTestEndSpy = jest.spyOn(reporter, "onTestEnd");
267+
const onEndSpy = jest.spyOn(reporter, "onEnd");
268+
269+
const onBeginSpy2 = jest.spyOn(reporter2, "onBegin");
270+
const onTestBeginSpy2 = jest.spyOn(reporter2, "onTestBegin");
271+
const onTestEndSpy2 = jest.spyOn(reporter2, "onTestEnd");
272+
const onEndSpy2 = jest.spyOn(reporter2, "onEnd");
273+
274+
const options = {
275+
reporters: [reporter, reporter2],
276+
transport,
277+
openrpcDocument,
278+
skip: [],
279+
only: [],
280+
};
281+
await coverage(options);
282+
283+
expect(onBeginSpy).toHaveBeenCalledTimes(1);
284+
expect(onTestBeginSpy).toHaveBeenCalledTimes(12);
285+
expect(onTestEndSpy).toHaveBeenCalledTimes(12);
286+
expect(onEndSpy).toHaveBeenCalledTimes(1);
287+
288+
expect(onBeginSpy2).toHaveBeenCalledTimes(1);
289+
expect(onTestBeginSpy2).toHaveBeenCalledTimes(12);
290+
expect(onTestEndSpy2).toHaveBeenCalledTimes(12);
291+
expect(onEndSpy2).toHaveBeenCalledTimes(1);
292+
})
257293
});
258294
});

src/coverage.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface IOptions {
2222
skip: string[];
2323
only: string[];
2424
transport(url: string, method: string, params: any[]): PromiseLike<any>;
25-
reporter: Reporter;
25+
reporters: Reporter[];
2626
}
2727

2828
export interface ExampleCall {
@@ -104,10 +104,14 @@ export default async (options: IOptions) => {
104104
});
105105
});
106106

107-
options.reporter.onBegin(options, exampleCalls);
107+
for (const reporter of options.reporters) {
108+
reporter.onBegin(options, exampleCalls);
109+
}
108110

109111
for (const exampleCall of exampleCalls) {
110-
options.reporter.onTestBegin(options, exampleCall);
112+
for (const reporter of options.reporters) {
113+
reporter.onTestBegin(options, exampleCall);
114+
}
111115
try {
112116
const callResult = await options.transport(
113117
exampleCall.url,
@@ -135,8 +139,13 @@ export default async (options: IOptions) => {
135139
exampleCall.valid = false;
136140
exampleCall.requestError = e;
137141
}
138-
options.reporter.onTestEnd(options, exampleCall);
142+
for (const reporter of options.reporters) {
143+
reporter.onTestEnd(options, exampleCall);
144+
}
139145
}
140146

141-
return options.reporter.onEnd(options, exampleCalls);
147+
for (const reporter of options.reporters) {
148+
reporter.onEnd(options, exampleCalls);
149+
}
150+
return exampleCalls;
142151
};

src/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,34 @@ import { OpenrpcDocument } from "@open-rpc/meta-schema";
44
import { ITransport } from "./transports/ITransport";
55
import ConsoleReporter from "./reporters/console";
66
import JsonReporter from "./reporters/json";
7-
import RawReporter from "./reporters/raw";
87
import EmptyReporter from "./reporters/emptyReporter";
98

109
const reporters = {
1110
console: ConsoleReporter,
1211
json: JsonReporter,
13-
raw: RawReporter,
1412
empty: EmptyReporter,
1513
};
1614

1715
const transports = {
1816
http: HTTPTransport,
1917
};
20-
18+
type ReporterString = "console" | "json" | "empty";
2119
interface IOptions {
2220
openrpcDocument: OpenrpcDocument;
2321
skip?: string[];
2422
only?: string[];
25-
reporter: "console" | "json" | "raw" | "empty";
23+
reporters: ReporterString[];
2624
transport: "http" | ITransport;
2725
}
2826

2927
export default async (options: IOptions) => {
3028
const transport = typeof options.transport === "function" ? options.transport : transports[options.transport || "http"];
29+
let reporterInstances = options.reporters.map((reporter) => new reporters[reporter]);
30+
if (reporterInstances.length === 0) {
31+
reporterInstances = [new reporters["console"]()];
32+
}
3133
return coverage({
32-
reporter: new reporters[options.reporter || "console"],
34+
reporters: reporterInstances,
3335
openrpcDocument: options.openrpcDocument,
3436
skip: options.skip || [],
3537
only: options.only || [],

src/reporters/raw.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)