Skip to content

Commit cce3f5b

Browse files
authored
fix(hasura): meta.gqlVariables passed to createMany Hasura data provider (#6783)
1 parent 66ea526 commit cce3f5b

4 files changed

Lines changed: 265 additions & 0 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@refinedev/hasura": patch
3+
---
4+
5+
meta.gqlVariables now passed to createMany query for Hasura data provider

packages/hasura/src/dataProvider/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ const dataProvider = (
305305
if (meta?.gqlMutation) {
306306
const response = await client.request<BaseRecord>(meta.gqlMutation, {
307307
objects: variablesFromParams,
308+
...meta?.gqlVariables,
308309
});
309310

310311
return {

packages/hasura/test/createMany/index.mock.ts

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,3 +443,155 @@ nock("https://ruling-redbird-23.hasura.app:443", { encodedQueryParams: true })
443443
"84376bd60fb703bf-BUD",
444444
],
445445
);
446+
447+
// Mock for CreateManyPosts with includeCategory=true from gqlVariables
448+
nock("https://flowing-mammal-24.hasura.app:443", { encodedQueryParams: true })
449+
.post("/v1/graphql", {
450+
query:
451+
"mutation CreateManyPosts($objects: [posts_insert_input!]!, $includeCategory: Boolean = false) {\n insert_posts(objects: $objects) {\n returning {\n id\n title\n content\n category @include(if: $includeCategory) {\n id\n }\n }\n }\n}\n",
452+
variables: {
453+
objects: [
454+
{
455+
content: "Vestibulum vulputate sapien arcu.",
456+
title: "Aenean ultricies non libero sit amet pellentesque",
457+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
458+
},
459+
{
460+
content: "Aliquam nibh erat.",
461+
title: "Etiam tincidunt ex ut auctor faucibus",
462+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
463+
},
464+
],
465+
includeCategory: true,
466+
},
467+
operationName: "CreateManyPosts",
468+
})
469+
.reply(
470+
200,
471+
{
472+
data: {
473+
insert_posts: {
474+
returning: [
475+
{
476+
id: "f1c8b6d7-3e5a-4c2b-9f8d-1e5a7b9d0c3e",
477+
title: "Aenean ultricies non libero sit amet pellentesque",
478+
content: "Vestibulum vulputate sapien arcu.",
479+
category: {
480+
id: "e27156c3-9998-434f-bd5b-2b078283ff26",
481+
},
482+
},
483+
{
484+
id: "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
485+
title: "Etiam tincidunt ex ut auctor faucibus",
486+
content: "Aliquam nibh erat.",
487+
category: {
488+
id: "e27156c3-9998-434f-bd5b-2b078283ff26",
489+
},
490+
},
491+
],
492+
},
493+
},
494+
},
495+
[
496+
"Date",
497+
"Wed, 10 Jan 2024 19:45:38 GMT",
498+
"Content-Type",
499+
"application/json; charset=utf-8",
500+
"Content-Length",
501+
"435",
502+
"Connection",
503+
"close",
504+
"x-request-id",
505+
"fd98c24a10b32a6e7c1f5d9b8e4a2c1d",
506+
"CF-Cache-Status",
507+
"DYNAMIC",
508+
"Content-Security-Policy",
509+
"upgrade-insecure-requests",
510+
"Referrer-Policy",
511+
"strict-origin-when-cross-origin",
512+
"Strict-Transport-Security",
513+
"max-age=31536000; includeSubDomains",
514+
"X-Content-Type-Options",
515+
"nosniff",
516+
"X-Frame-Options",
517+
"SAMEORIGIN",
518+
"X-XSS-Protection",
519+
"0",
520+
"Server",
521+
"cloudflare",
522+
"CF-RAY",
523+
"84376be01cba684c-BUD",
524+
],
525+
);
526+
527+
nock("https://flowing-mammal-24.hasura.app:443", { encodedQueryParams: true })
528+
.post("/v1/graphql", {
529+
query:
530+
"mutation CreateManyPosts($objects: [posts_insert_input!]!, $includeCategory: Boolean = false) {\n insert_posts(objects: $objects) {\n returning {\n id\n title\n content\n category @include(if: $includeCategory) {\n id\n }\n }\n }\n}\n",
531+
variables: {
532+
objects: [
533+
{
534+
content: "Vestibulum vulputate sapien arcu.",
535+
title: "Aenean ultricies non libero sit amet pellentesque",
536+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
537+
},
538+
{
539+
content: "Aliquam nibh erat.",
540+
title: "Etiam tincidunt ex ut auctor faucibus",
541+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
542+
},
543+
],
544+
},
545+
operationName: "CreateManyPosts",
546+
})
547+
.reply(
548+
200,
549+
{
550+
data: {
551+
insert_posts: {
552+
returning: [
553+
{
554+
id: "b5c6d7e8-f9a0-1b2c-3d4e-5f6a7b8c9d0e",
555+
title: "Aenean ultricies non libero sit amet pellentesque",
556+
content: "Vestibulum vulputate sapien arcu.",
557+
},
558+
{
559+
id: "e1f2a3b4-c5d6-7e8f-9a0b-1c2d3e4f5a6b",
560+
title: "Etiam tincidunt ex ut auctor faucibus",
561+
content: "Aliquam nibh erat.",
562+
},
563+
],
564+
},
565+
},
566+
},
567+
[
568+
"Date",
569+
"Wed, 10 Jan 2024 19:45:39 GMT",
570+
"Content-Type",
571+
"application/json; charset=utf-8",
572+
"Content-Length",
573+
"320",
574+
"Connection",
575+
"close",
576+
"x-request-id",
577+
"3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d",
578+
"CF-Cache-Status",
579+
"DYNAMIC",
580+
"Content-Security-Policy",
581+
"upgrade-insecure-requests",
582+
"Referrer-Policy",
583+
"strict-origin-when-cross-origin",
584+
"Strict-Transport-Security",
585+
"max-age=31536000; includeSubDomains",
586+
"X-Content-Type-Options",
587+
"nosniff",
588+
"X-Frame-Options",
589+
"SAMEORIGIN",
590+
"X-XSS-Protection",
591+
"0",
592+
"Server",
593+
"cloudflare",
594+
"CF-RAY",
595+
"84376be52f6d733a-BUD",
596+
],
597+
);

packages/hasura/test/createMany/index.spec.ts

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,111 @@ describe("with gqlMutation", () => {
172172

173173
expect(data[1]["title"]).toEqual("Etiam tincidunt ex ut auctor faucibus");
174174
});
175+
176+
it("correctly passes variables from meta.gqlVariables to the query", async () => {
177+
const client = createClient("hasura-default");
178+
const { data } = await dataProvider(client, {
179+
namingConvention: "hasura-default",
180+
}).createMany!({
181+
resource: "posts",
182+
variables: [
183+
{
184+
content: "Vestibulum vulputate sapien arcu.",
185+
title: "Aenean ultricies non libero sit amet pellentesque",
186+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
187+
},
188+
{
189+
content: "Aliquam nibh erat.",
190+
title: "Etiam tincidunt ex ut auctor faucibus",
191+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
192+
},
193+
],
194+
meta: {
195+
gqlMutation: gql`
196+
mutation CreateManyPosts(
197+
$objects: [posts_insert_input!]!,
198+
$includeCategory: Boolean = false
199+
) {
200+
insert_posts(objects: $objects) {
201+
returning {
202+
id
203+
title
204+
content
205+
category @include(if: $includeCategory) {
206+
id
207+
}
208+
}
209+
}
210+
}
211+
`,
212+
gqlVariables: {
213+
includeCategory: true,
214+
},
215+
},
216+
});
217+
218+
expect(data[0]["title"]).toEqual(
219+
"Aenean ultricies non libero sit amet pellentesque",
220+
);
221+
expect(data[0]["content"]).toEqual("Vestibulum vulputate sapien arcu.");
222+
expect(data[0]["category"].id).toEqual(
223+
"e27156c3-9998-434f-bd5b-2b078283ff26",
224+
);
225+
226+
expect(data[1]["title"]).toEqual("Etiam tincidunt ex ut auctor faucibus");
227+
expect(data[1]["content"]).toEqual("Aliquam nibh erat.");
228+
expect(data[1]["category"].id).toEqual(
229+
"e27156c3-9998-434f-bd5b-2b078283ff26",
230+
);
231+
});
232+
233+
it("doesn't pass extra variables to the query without meta.gqlVariables", async () => {
234+
const client = createClient("hasura-default");
235+
const { data } = await dataProvider(client, {
236+
namingConvention: "hasura-default",
237+
}).createMany!({
238+
resource: "posts",
239+
variables: [
240+
{
241+
content: "Vestibulum vulputate sapien arcu.",
242+
title: "Aenean ultricies non libero sit amet pellentesque",
243+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
244+
},
245+
{
246+
content: "Aliquam nibh erat.",
247+
title: "Etiam tincidunt ex ut auctor faucibus",
248+
category_id: "e27156c3-9998-434f-bd5b-2b078283ff26",
249+
},
250+
],
251+
meta: {
252+
gqlMutation: gql`
253+
mutation CreateManyPosts(
254+
$objects: [posts_insert_input!]!,
255+
$includeCategory: Boolean = false
256+
) {
257+
insert_posts(objects: $objects) {
258+
returning {
259+
id
260+
title
261+
content
262+
category @include(if: $includeCategory) {
263+
id
264+
}
265+
}
266+
}
267+
}
268+
`,
269+
},
270+
});
271+
272+
expect(data[0]["title"]).toEqual(
273+
"Aenean ultricies non libero sit amet pellentesque",
274+
);
275+
expect(data[0]["content"]).toEqual("Vestibulum vulputate sapien arcu.");
276+
expect(data[0]["category"]).toBeUndefined();
277+
278+
expect(data[1]["title"]).toEqual("Etiam tincidunt ex ut auctor faucibus");
279+
expect(data[1]["content"]).toEqual("Aliquam nibh erat.");
280+
expect(data[1]["category"]).toBeUndefined();
281+
});
175282
});

0 commit comments

Comments
 (0)