Skip to content

Commit 5fa1a10

Browse files
committed
fix(useProvider): compatibility with string of cachekey
Refs NEXT_BUILDER-2059
1 parent 97c35b7 commit 5fa1a10

File tree

2 files changed

+109
-20
lines changed

2 files changed

+109
-20
lines changed

packages/brick-kit/src/hooks/useProvider/fetch.spec.ts

Lines changed: 102 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ customGlobal.fetch = require("jest-fetch-mock");
99
customGlobal.fetchMock = customGlobal.fetch;
1010

1111
const fakeFetch = global.fetch as FetchMock;
12-
12+
const fakeRevolve = jest.fn();
1313
// Mock a custom element of `any-provider`.
1414
customElements.define(
1515
"any-provider",
1616
class Tmp extends HTMLElement {
1717
resolve(): string {
18+
fakeRevolve();
1819
return "resolved";
1920
}
2021
}
@@ -59,18 +60,20 @@ describe("fetch", () => {
5960

6061
afterEach((): void => {
6162
fakeFetch.resetMocks();
63+
fakeRevolve.mockClear();
6264
});
6365

6466
it("should resolve normal provider", async () => {
65-
const result = await fetch("any-provider", true, ["abc"]);
67+
const result = await fetch("any-provider", true, ...["abc"]);
6668

6769
expect(result).toBe("resolved");
70+
expect(fakeRevolve).toHaveBeenCalledTimes(1);
6871
});
6972

7073
it("should throw error ", async () => {
7174
expect.assertions(1);
7275
try {
73-
await fetch("error-provider", true, ["abc"]);
76+
await fetch("error-provider", true, ...["abc"]);
7477
} catch (e) {
7578
expect(e.message).toBe("oops");
7679
}
@@ -79,32 +82,36 @@ describe("fetch", () => {
7982
it("should throw error when not defined provider", async () => {
8083
expect.assertions(1);
8184
try {
82-
await fetch("undefined-provider", true, ["abc"]);
85+
await fetch("undefined-provider", true, "abc");
8386
} catch (e) {
8487
expect(e.message).toContain('Provider not defined: "undefined-provider"');
8588
}
8689
});
8790

8891
it("should resolve flow api provider", async () => {
89-
const result = await fetch("easyops.custom_api@test", false, [
90-
"abc",
91-
{ a: "a", c: "c", b: "b" },
92-
]);
92+
const result = await fetch("easyops.custom_api@test", false, "abc", {
93+
a: "a",
94+
c: "c",
95+
b: "b",
96+
});
9397

9498
expect(result).toEqual(expected);
9599
expect(fakeFetch).toHaveBeenCalledTimes(1);
96100

97-
const result2 = await fetch("easyops.custom_api@test", false, [
98-
"abc",
99-
{ a: "a", c: "c", b: "b" },
100-
]);
101+
const result2 = await fetch("easyops.custom_api@test", false, "abc", {
102+
a: "a",
103+
c: "c",
104+
b: "b",
105+
});
101106

102107
expect(result2).toEqual(expected);
103108
expect(fakeFetch).toHaveBeenCalledTimes(2);
104109
});
105110

106111
it("should resolve flow api provider by cache", async () => {
107-
const result = await fetch("easyops.custom_api@test", true, [
112+
const result = await fetch(
113+
"easyops.custom_api@test",
114+
true,
108115
{
109116
url: "api/gateway/easyops.api.cmdb.cmdb_object.ListObjectBasic@1.1.0/object_basic",
110117
originalUri: "/object_basic",
@@ -116,13 +123,15 @@ describe("fetch", () => {
116123
a: "a",
117124
c: "c",
118125
b: "b",
119-
},
120-
]);
126+
}
127+
);
121128

122129
expect(result).toEqual(expected);
123130
expect(fakeFetch).toHaveBeenCalledTimes(1);
124131

125-
const result2 = await fetch("easyops.custom_api@test", true, [
132+
const result2 = await fetch(
133+
"easyops.custom_api@test",
134+
true,
126135
{
127136
isFileType: false,
128137
responseWrapper: true,
@@ -134,8 +143,8 @@ describe("fetch", () => {
134143
c: "c",
135144
b: "b",
136145
a: "a",
137-
},
138-
]);
146+
}
147+
);
139148

140149
// use cached response data
141150
expect(result2).toEqual(expected);
@@ -160,4 +169,79 @@ describe("fetch", () => {
160169
expect(result3).toEqual(expected);
161170
expect(fakeFetch).toHaveBeenCalledTimes(2);
162171
});
172+
173+
it("should resolve normal provider by cache", async () => {
174+
const result = await fetch(
175+
"providers-of-cmbd.a",
176+
true,
177+
...[
178+
"_DASHBOARD_PROVIDER",
179+
{
180+
fields: {
181+
provider: 1,
182+
args: 1,
183+
name: 1,
184+
instanceId: 1,
185+
transform: 1,
186+
},
187+
query: {
188+
$or: [
189+
{
190+
name: {
191+
$like: "%alexabcdes%",
192+
},
193+
},
194+
{
195+
provider: {
196+
$like: "%alexabcdes%",
197+
},
198+
},
199+
],
200+
},
201+
page: 1,
202+
page_size: 30,
203+
},
204+
{},
205+
]
206+
);
207+
208+
expect(result).toEqual("resolved");
209+
expect(fakeRevolve).toHaveBeenCalledTimes(1);
210+
211+
const result2 = await fetch(
212+
"providers-of-cmbd.a",
213+
true,
214+
"_DASHBOARD_PROVIDER",
215+
{
216+
fields: {
217+
provider: 1,
218+
args: 1,
219+
name: 1,
220+
instanceId: 1,
221+
transform: 1,
222+
},
223+
query: {
224+
$or: [
225+
{
226+
name: {
227+
$like: "%alexabcdes%",
228+
},
229+
},
230+
{
231+
provider: {
232+
$like: "%alexabcdes%",
233+
},
234+
},
235+
],
236+
},
237+
page: 1,
238+
page_size: 30,
239+
},
240+
{}
241+
);
242+
243+
// cached response data
244+
expect(result2).toEqual("resolved");
245+
expect(fakeRevolve).toHaveBeenCalledTimes(1);
246+
});
163247
});

packages/brick-kit/src/hooks/useProvider/fetch.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@ function isObj(v: any): boolean {
1010
return typeof v === "object" && v !== null && !Array.isArray(v);
1111
}
1212

13-
function buildSortedCacheKey(provider: string, args: any): string {
13+
function isString(v: any): v is string {
14+
return typeof v === "string";
15+
}
16+
function buildSortedCacheKey(provider: string, ...args: any): string {
1417
const sortObj = (obj: Record<string, any>) =>
1518
Object.keys(obj)
1619
.sort()
1720
.map((k) => ({ [k]: (obj as any)[k] }));
1821
try {
1922
const sortedArgs = isObj(args)
2023
? sortObj(args)
21-
: (args as Record<string, any>[]).map((arg) => sortObj(arg));
24+
: (args as Record<string, any>[]).map((arg) =>
25+
isString(arg) ? arg : sortObj(arg)
26+
);
2227

2328
return JSON.stringify({
2429
provider,

0 commit comments

Comments
 (0)