UNPKG

@graphql-hive/federation-gateway-audit

Version:
197 lines (185 loc) 3.59 kB
'use strict'; var testkit = require('./testkit-CAf-AsDy.cjs'); require('@apollo/composition'); require('graphql'); require('fets'); require('@apollo/subgraph'); require('graphql-yoga'); const books = [ { __typename: "Book", id: "1", price: 10.99 }, { __typename: "Book", id: "2", price: 5.99 }, { __typename: "Book", id: "3", price: 10.99 } ]; var a = testkit.createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@external", "@provides"] ) type Query { product: Product } interface Product { samePriceProduct: Product } type Book implements Product @key(fields: "id") { id: ID! samePriceProduct: Book @provides(fields: "price") price: Float @external } ` ), resolvers: { Query: { product() { const book = books[0]; return { __typename: book.__typename, id: book.id, price: book.price }; } }, Book: { samePriceProduct(book) { const samePriceBook = books.find( (b) => b.price === book.price && b.id !== book.id ); if (!samePriceBook) { return null; } return { __typename: samePriceBook.__typename, id: samePriceBook.id, price: samePriceBook.price }; } } } }); var b = testkit.createSubgraph("b", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable"] ) type Book @key(fields: "id") { id: ID! price: Float @shareable } ` ), resolvers: { Book: { __resolveReference(key) { const book = books.find((b) => b.id === key.id); if (!book) { return null; } return { __typename: book.__typename, id: book.id, price: book.price }; } } } }); var test = [ testkit.createTest( /* GraphQL */ ` query { product { samePriceProduct { ... on Product { samePriceProduct { __typename } } } } } `, { data: { product: { samePriceProduct: { samePriceProduct: { __typename: "Book" } } } } } ), testkit.createTest( /* GraphQL */ ` query { product { __typename samePriceProduct { __typename ... on Book { id } samePriceProduct { __typename ... on Book { id } } } ... on Book { __typename id price samePriceProduct { id price } } } } `, { data: { product: { __typename: "Book", samePriceProduct: { __typename: "Book", id: "3", samePriceProduct: { __typename: "Book", id: "1" }, price: 10.99 }, id: "1", price: 10.99 } } } ) ]; var index = testkit.serve("circular-reference-interface", [a, b], test); exports.default = index;