Files
suaveplan/packages/api-stack/api/api-graphql-yoga/src/federation/federation.test.ts
2026-05-27 23:29:53 +01:00

62 lines
2.2 KiB
TypeScript

import { createGraphqlRegistry, GraphqlError } from "@suaveplan/api-graphql";
import { describe, expect, it } from "@suaveplan/testing/runner";
import { federatePlugins } from "./federation.js";
describe("federatePlugins", () => {
it("two plugins each extending Query both expose their fields", {
timeout: 5000,
}, () => {
const billing = createGraphqlRegistry();
billing.addTypes(
"type Query { _root: String } extend type Query { invoices: [String!]! }"
);
billing.addResolvers({ Query: { invoices: () => ["i_1"] } });
const crm = createGraphqlRegistry();
crm.addTypes("extend type Query { customers: [String!]! }");
crm.addResolvers({ Query: { customers: () => ["c_1"] } });
const result = federatePlugins([
{
plugin: "billing",
registry: billing as never,
},
{ plugin: "crm", registry: crm as never },
]);
expect(result.merged.sdl).toContain("invoices");
expect(result.merged.sdl).toContain("customers");
expect(result.resolvers.Query?.invoices).toBeDefined();
expect(result.resolvers.Query?.customers).toBeDefined();
});
it("same-field collision fails with GRAPHQL.SCHEMA_COLLISION", {
timeout: 5000,
}, () => {
const a = createGraphqlRegistry();
a.addTypes("type Query { invoices: [String!]! }");
const b = createGraphqlRegistry();
b.addTypes("type Query { invoices: [String!]! }");
expect(() =>
federatePlugins([
{ plugin: "a", registry: a as never },
{ plugin: "b", registry: b as never },
])
).toThrow(GraphqlError);
});
it("supports namespace wrapping", {
timeout: 5000,
}, () => {
const billing = createGraphqlRegistry();
billing.addTypes("extend type Query { invoices: [String!]! }");
const result = federatePlugins([
{
plugin: "billing",
registry: billing as never,
namespace: "Billing",
},
]);
expect(result.merged.sdl).toContain("Billing");
});
});