From ce36fc6fcac2874c1ee125823668a678d7004416 Mon Sep 17 00:00:00 2001 From: vejrj <77059398+vejrj@users.noreply.github.com> Date: Mon, 5 Jan 2026 13:36:26 +0100 Subject: [PATCH] mergeSchemaDefinitions implementation bug --- .../decodeASTSchema.test.ts.snap | 2 +- .../__tests__/mergeSchemaDefinitions.test.ts | 80 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 packages/supermassive/src/utilities/__tests__/mergeSchemaDefinitions.test.ts diff --git a/packages/supermassive/src/utilities/__tests__/__snapshots__/decodeASTSchema.test.ts.snap b/packages/supermassive/src/utilities/__tests__/__snapshots__/decodeASTSchema.test.ts.snap index 7af3e63f2..d69d6c6fd 100644 --- a/packages/supermassive/src/utilities/__tests__/__snapshots__/decodeASTSchema.test.ts.snap +++ b/packages/supermassive/src/utilities/__tests__/__snapshots__/decodeASTSchema.test.ts.snap @@ -30,7 +30,7 @@ type AnnotatedObject { type UndefinedType -interface Bar { +interface Bar implements Two { one: Type four(argument: String = "string"): String two(argument: InputType!): Type diff --git a/packages/supermassive/src/utilities/__tests__/mergeSchemaDefinitions.test.ts b/packages/supermassive/src/utilities/__tests__/mergeSchemaDefinitions.test.ts new file mode 100644 index 000000000..93f643359 --- /dev/null +++ b/packages/supermassive/src/utilities/__tests__/mergeSchemaDefinitions.test.ts @@ -0,0 +1,80 @@ +import { parse } from "graphql"; +import { mergeSchemaDefinitions } from "../mergeSchemaDefinitions"; +import { encodeASTSchema } from "../encodeASTSchema"; +import { SchemaDefinitions } from "../../schema/definition"; + +function schema(sdl: string): SchemaDefinitions[] { + const doc = parse(sdl); + return encodeASTSchema(doc); +} + +describe("mergeSchemaDefinitions", () => { + it("should copy interfaces from source when target interface has none", () => { + const defs = schema(` + interface Entity { + id: ID + } + + interface Entity implements Node & Named { + name: String + } + `); + const result = mergeSchemaDefinitions({ types: {}, directives: [] }, defs); + expect(result).toMatchInlineSnapshot(` + { + "directives": [], + "types": { + "Entity": [ + 3, + { + "id": 5, + "name": 1, + }, + [ + "Node", + "Named", + ], + ], + }, + } + `); + }); + + it("should copy interfaces from source when interface extension has none", () => { + const defs1 = schema(` + extend interface Entity { + id: ID + } + `); + + const defs2 = schema(` + interface Entity implements Node & Named { + name: String + } + `); + const mergeResult1 = mergeSchemaDefinitions( + { types: {}, directives: [] }, + defs1, + ); + + const mergeResult2 = mergeSchemaDefinitions(mergeResult1, defs2); + expect(mergeResult2).toMatchInlineSnapshot(` + { + "directives": [], + "types": { + "Entity": [ + 3, + { + "id": 5, + "name": 1, + }, + [ + "Node", + "Named", + ], + ], + }, + } + `); + }); +});