Skip to content

Commit e793378

Browse files
authored
Merge pull request #405 from open-rpc/fix/object-assign-reuse
fix: dont use existing object for example pairings fallback
2 parents 8409305 + 81d33e0 commit e793378

File tree

4 files changed

+155
-20
lines changed

4 files changed

+155
-20
lines changed

src/Documentation.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ it("renders without crashing", () => {
77
ReactDOM.render(<Documentation schema={{} as any}/>, div);
88
ReactDOM.unmountComponentAtNode(div);
99
});
10+
11+
it("renders without crashing with no schema", () => {
12+
const div = document.createElement("div");
13+
ReactDOM.render(<Documentation />, div);
14+
ReactDOM.unmountComponentAtNode(div);
15+
});

src/Documentation.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import ContentDescriptors from "./ContentDescriptors/ContentDescriptors";
66
import { OpenrpcDocument } from "@open-rpc/meta-schema";
77

88
interface IProps {
9-
schema: OpenrpcDocument;
9+
schema?: OpenrpcDocument;
1010
uiSchema?: any;
1111
reactJsonOptions?: any;
1212
methodPlugins?: Array<React.FC<IMethodPluginProps>>;

src/ExamplePairings/ExamplePairings.test.tsx

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,53 @@ it("renders examples with only schema examples with no params", async () => {
113113
} />
114114
, div);
115115
expect(div.innerHTML.includes("potato")).toBe(true);
116+
expect(div.innerHTML.includes("bob")).toBe(false);
117+
ReactDOM.unmountComponentAtNode(div);
118+
});
119+
120+
it("renders examples with multiple param schema examples and no method", async () => {
121+
const div = document.createElement("div");
122+
const testDoc: OpenrpcDocument = {
123+
info: {
124+
title: "test",
125+
version: "0.0.0",
126+
},
127+
methods: [
128+
{
129+
name: "test-method",
130+
params: [
131+
{
132+
name: "testparam1",
133+
schema: {
134+
examples: ["bob"],
135+
type: "string",
136+
},
137+
},
138+
{
139+
name: "testparam2",
140+
schema: {
141+
examples: ["bob2"],
142+
type: "string",
143+
},
144+
},
145+
],
146+
result: {
147+
name: "test-method-result",
148+
schema: {
149+
examples: ["potato"],
150+
type: "string",
151+
},
152+
},
153+
},
154+
],
155+
openrpc: "1.0.0",
156+
};
157+
ReactDOM.render(
158+
<ExamplePairings method={testDoc.methods[0]} />
159+
, div);
160+
console.log("div", div.innerHTML); //tslint:disable-line
116161
expect(div.innerHTML.includes("bob")).toBe(true);
162+
expect(div.innerHTML.includes("bob2")).toBe(true);
117163
ReactDOM.unmountComponentAtNode(div);
118164
});
119165

@@ -153,6 +199,77 @@ it("renders examples with only schema examples and no method", async () => {
153199
ReactDOM.unmountComponentAtNode(div);
154200
});
155201

202+
it("renders examples with only schema examples and no method with number", async () => {
203+
const div = document.createElement("div");
204+
const testDoc: OpenrpcDocument = {
205+
info: {
206+
title: "test",
207+
version: "0.0.0",
208+
},
209+
methods: [
210+
{
211+
name: "test-method",
212+
params: [{
213+
name: "testparam1",
214+
schema: {
215+
examples: [10101],
216+
type: "number",
217+
},
218+
}],
219+
result: {
220+
name: "test-method-result",
221+
schema: {
222+
examples: ["potato"],
223+
type: "string",
224+
},
225+
},
226+
},
227+
],
228+
openrpc: "1.0.0",
229+
};
230+
ReactDOM.render(
231+
<ExamplePairings
232+
examples={testDoc.methods[0].examples as ExamplePairingObject[]
233+
} />
234+
, div);
235+
ReactDOM.unmountComponentAtNode(div);
236+
});
237+
it("renders examples with only schema examples and no method with multiple number examples", async () => {
238+
const div = document.createElement("div");
239+
const testDoc: OpenrpcDocument = {
240+
info: {
241+
title: "test",
242+
version: "0.0.0",
243+
},
244+
methods: [
245+
{
246+
name: "test-method",
247+
params: [{
248+
name: "testparam1",
249+
schema: {
250+
examples: [10101, 102],
251+
type: "number",
252+
},
253+
}],
254+
result: {
255+
name: "test-method-result",
256+
schema: {
257+
examples: ["potato", "bar"],
258+
type: "string",
259+
},
260+
},
261+
},
262+
],
263+
openrpc: "1.0.0",
264+
};
265+
ReactDOM.render(
266+
<ExamplePairings
267+
examples={testDoc.methods[0].examples as ExamplePairingObject[]
268+
} />
269+
, div);
270+
ReactDOM.unmountComponentAtNode(div);
271+
});
272+
156273
it("renders examples and can switch between them", async () => {
157274
const simpleMath = await refParser.dereference(examples.simpleMath) as OpenrpcDocument;
158275
const { getByText } = render(

src/ExamplePairings/ExamplePairings.tsx

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,6 @@ interface IState {
1515
currentExample?: ExamplePairingObject;
1616
}
1717

18-
const newExample: ExamplePairingObject = {
19-
name: "generated-example",
20-
params: [
21-
],
22-
result: {
23-
name: "example-result",
24-
value: null,
25-
},
26-
};
2718
const getExamplesFromMethod = (method?: MethodObject): ExamplePairingObject[] => {
2819
if (!method) { return []; }
2920
if (!method.params) { return []; }
@@ -33,25 +24,46 @@ const getExamplesFromMethod = (method?: MethodObject): ExamplePairingObject[] =>
3324
if (param.schema && param.schema.examples && param.schema.examples.length > 0) {
3425
param.schema.examples.forEach((ex: any, i: number) => {
3526
if (!examples[i]) {
36-
examples.push({ ...newExample });
27+
examples.push({
28+
name: "generated-example",
29+
params: [
30+
{
31+
name: param.name,
32+
value: ex,
33+
},
34+
],
35+
result: {
36+
name: "example-result",
37+
value: null,
38+
},
39+
});
40+
} else {
41+
examples[i].params.push({
42+
name: param.name,
43+
value: ex,
44+
});
3745
}
38-
examples[i].params.push({
39-
name: param.name,
40-
value: ex,
41-
});
4246
});
4347
}
4448
});
4549
const methodResult = method.result as ContentDescriptorObject;
4650
if (methodResult && methodResult.schema && methodResult.schema.examples && methodResult.schema.examples.length > 0) {
4751
methodResult.schema.examples.forEach((ex: any, i: number) => {
4852
if (!examples[i]) {
49-
examples.push({ ...newExample });
53+
examples.push({
54+
name: "generated-example",
55+
params: [],
56+
result: {
57+
name: methodResult.name,
58+
value: ex,
59+
},
60+
});
61+
} else {
62+
examples[i].result = {
63+
name: methodResult.name,
64+
value: ex,
65+
};
5066
}
51-
examples[i].result = {
52-
name: methodResult.name,
53-
value: ex,
54-
};
5567
});
5668
}
5769
return examples;

0 commit comments

Comments
 (0)