UNPKG

@graphql-hive/federation-gateway-audit

Version:
231 lines (212 loc) 4.21 kB
'use strict'; var testkit = require('./testkit-CAf-AsDy.cjs'); var env = require('./env-Dj2M4ll3.cjs'); require('@apollo/composition'); require('graphql'); require('fets'); require('@apollo/subgraph'); require('graphql-yoga'); const medias = [ { __typename: "Book", id: "m1", title: "Book 1" }, { __typename: "Movie", id: "m2", title: "Movie 1" } ]; var a = testkit.createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable", "@external"] ) type Query { media: [Media] @shareable } union Media = Book | Movie type Book @key(fields: "id") { id: ID! } type Movie @key(fields: "id") { id: ID! } ` ), resolvers: { Query: { media(_p, _a, context) { if (env.shouldPunishForPoorPlans()) { throw new Error("You should not be using the 'a' subgraph!"); } return medias.map((media) => ({ __typename: media.__typename, id: media.id })); } } } }); var b = testkit.createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable", "@provides", "@external"] ) type Query { media: [Media] @shareable @provides(fields: "... on Book { title }") } union Media = Book | Movie type Book @key(fields: "id") { id: ID! title: String @external } type Movie @key(fields: "id") { id: ID! } ` ), resolvers: { Query: { media() { return medias.map((media) => { if (media.__typename === "Book") { return { __typename: media.__typename, id: media.id, title: media.title }; } return { __typename: media.__typename, id: media.id }; }); } } } }); var c = testkit.createSubgraph("c", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable"] ) type Book @key(fields: "id") { id: ID! title: String @shareable } type Movie @key(fields: "id") { id: ID! title: String @shareable } ` ), resolvers: { Book: { __resolveReference(key, context) { if (env.shouldPunishForPoorPlans()) { throw new Error("You should be using the 'b' subgraph!"); } const media = medias.find((media2) => media2.id === key.id); if (!media) { return null; } return { __typename: media.__typename, id: media.id, title: media.title }; } }, Movie: { __resolveReference(key) { const media = medias.find((media2) => media2.id === key.id); if (!media) { return null; } return { __typename: media.__typename, id: media.id, title: media.title }; } } } }); var test = [ testkit.createTest( /* GraphQL */ ` query { media { ... on Book { id title } ... on Movie { id } } } `, { data: { media: [ { id: "m1", title: "Book 1" }, { id: "m2" } ] } } ), testkit.createTest( /* GraphQL */ ` query { media { ... on Book { id title } ... on Movie { id title } } } `, { data: { media: [ { id: "m1", title: "Book 1" }, { id: "m2", title: "Movie 1" } ] } } ) ]; var index = testkit.serve("provides-on-union", [a, b, c], test); exports.default = index;