UNPKG

@graphql-hive/federation-gateway-audit

Version:
588 lines (571 loc) 10.2 kB
import { c as createSubgraph, a as createTest, s as serve } from './testkit-BtZjdl4n.js'; import '@apollo/composition'; import 'graphql'; import 'fets'; import '@apollo/subgraph'; import 'graphql-yoga'; const media = { __typename: "Book", id: "b1", title: "The Lord of the Rings", aTitle: "A: The Lord of the Rings", bTitle: "B: The Lord of the Rings" }; const song = { __typename: "Song", id: "s2", title: "Song Title", aTitle: "A: Song Title" }; var a = createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@shareable", "@key"] ) union Media = Book | Song union ViewerMedia = Book | Song type Book @key(fields: "id") { id: ID! title: String! @shareable aTitle: String! } type Song @key(fields: "id") { id: ID! title: String! @shareable aTitle: String! } type Query { media: Media @shareable aMedia: Media @shareable book: Book @shareable song: Media @shareable viewer: Viewer @shareable } type Viewer { media: ViewerMedia @shareable aMedia: ViewerMedia book: Book @shareable song: ViewerMedia @shareable } ` ), resolvers: { Query: { media: () => media, aMedia: () => media, book: () => media, song: () => song, viewer: () => { return { media, aMedia: media, book: media, song }; } }, Book: { __resolveReference(key) { if (key.id !== media.id) { return null; } return media; } }, Song: { __resolveReference(key) { if (key.id !== song.id) { return null; } return song; } } } }); const movie = { __typename: "Movie", id: "m3", title: "A Movie Title", bTitle: "B Movie Title" }; var b = createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@shareable", "@key"] ) type Query { media: Media @shareable bMedia: Media @shareable book: Media @shareable viewer: Viewer @shareable } union Media = Book | Movie union ViewerMedia = Book | Movie type Movie @key(fields: "id") { id: ID! title: String! @shareable bTitle: String! } type Book @key(fields: "id") { id: ID! title: String! @shareable bTitle: String! } type Viewer { media: ViewerMedia @shareable bMedia: ViewerMedia book: ViewerMedia @shareable } ` ), resolvers: { Query: { media: () => media, bMedia: () => media, book: () => media, viewer: () => { return { media, bMedia: movie, book: media }; } }, Book: { __resolveReference(key) { if (key.id !== media.id) { return null; } return media; } }, Movie: { __resolveReference(key) { if (key.id !== movie.id) { return null; } return movie; } } } }); var test = [ createTest( /* GraphQL */ ` query { media { ... on Movie { title } } } `, { data: { media: {} } } ), createTest( /* GraphQL */ ` query { media { ... on Book { title } } } `, { data: { media: { title: media.title } } } ), createTest( /* GraphQL */ ` query { media { ... on Book { title } ... on Movie { title } } } `, { data: { media: { title: media.title } } } ), createTest( /* GraphQL */ ` query { viewer { media { __typename ... on Song { title } ... on Movie { title } ... on Book { title } } book { __typename ... on Song { title } ... on Movie { title } ... on Book { title } } song { __typename ... on Song { title } ... on Movie { title } ... on Book { title } } } } `, { data: { viewer: { media: { __typename: "Book", title: "The Lord of the Rings" }, book: { __typename: "Book", title: "The Lord of the Rings" }, song: { __typename: "Song", title: "Song Title" } } } } ), createTest( /* GraphQL */ ` query { viewer { media { ... on Movie { title } } } } `, { data: { viewer: { media: {} } } } ), createTest( /* GraphQL */ ` query { viewer { media { ... on Book { title } } } } `, { data: { viewer: { media: { title: media.title } } } } ), createTest( /* GraphQL */ ` query { viewer { media { ... on Book { title } ... on Movie { title } } } } `, { data: { viewer: { media: { title: media.title } } } } ), createTest( /* GraphQL */ ` query { viewer { media { __typename ... on Song { title } ... on Movie { title } ... on Book { title } } book { __typename ... on Song { title } ... on Movie { title } ... on Book { title } } song { __typename ... on Song { title } ... on Movie { title } ... on Book { title } } } } `, { data: { viewer: { media: { __typename: "Book", title: "The Lord of the Rings" }, book: { __typename: "Book", title: "The Lord of the Rings" }, song: { __typename: "Song", title: "Song Title" } } } } ), // this part involves entity calls createTest( /* GraphQL */ ` query { aMedia { ... on Movie { title bTitle } } } `, { data: { aMedia: {} } } ), createTest( /* GraphQL */ ` query { aMedia { ... on Book { title aTitle bTitle } } } `, { data: { aMedia: { title: media.title, aTitle: media.aTitle, bTitle: media.bTitle } } } ), createTest( /* GraphQL */ ` query { viewer { media { __typename ... on Song { title aTitle } ... on Movie { title bTitle } ... on Book { title aTitle bTitle } } book { __typename ... on Song { title aTitle } ... on Movie { title bTitle } ... on Book { title aTitle bTitle } } song { __typename ... on Song { title aTitle } ... on Movie { title bTitle } ... on Book { title aTitle bTitle } } } } `, { data: { viewer: { media: { __typename: "Book", title: "The Lord of the Rings", aTitle: "A: The Lord of the Rings", bTitle: "B: The Lord of the Rings" }, book: { __typename: "Book", title: "The Lord of the Rings", aTitle: "A: The Lord of the Rings", bTitle: "B: The Lord of the Rings" }, song: { __typename: "Song", title: "Song Title", aTitle: "A: Song Title" } } } } ), createTest( /* GraphQL */ ` query { viewer { aMedia { ... on Movie { title bTitle } } bMedia { ... on Movie { title bTitle } } } } `, { data: { viewer: { aMedia: {}, bMedia: { title: "A Movie Title", bTitle: "B Movie Title" } } } } ) ]; var index = serve("union-intersection", [a, b], test); export { index as default };