UNPKG

@graphql-hive/federation-gateway-audit

Version:
336 lines (310 loc) 6.52 kB
'use strict'; var testkit = require('./testkit-CAf-AsDy.cjs'); require('@apollo/composition'); require('graphql'); require('fets'); require('@apollo/subgraph'); require('graphql-yoga'); const medias = [ { __typename: "Book", id: "m1", animals: ["a1", "a2"] } ]; const animals = [ { __typename: "Dog", id: "a1", name: "Fido", age: 3 }, { __typename: "Cat", id: "a2", name: "Whiskers", age: 6 } ]; var a = testkit.createSubgraph("a", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable", "@external", "@provides"] ) type Query { media: Media @shareable book: Book @provides(fields: "animals { ... on Dog { name } }") } interface Media { id: ID! } interface Animal { id: ID! } type Book implements Media @key(fields: "id") { id: ID! animals: [Animal] @shareable } type Dog implements Animal @key(fields: "id") { id: ID! @external name: String @external } type Cat implements Animal @key(fields: "id") { id: ID! @external } ` ), resolvers: { Query: { media() { { throw new Error("You should be using the 'a' subgraph!"); } }, book() { const book = medias[0]; return { __typename: "Book", id: book.id, animals: book.animals.map((animalId) => { const animal = animals.find((a) => a.id === animalId); if (!animal) { return null; } if (animal.__typename === "Dog") { return { __typename: "Dog", id: animal.id, name: animal.name }; } return { __typename: animal.__typename, id: animal.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: "animals { id name }") } interface Media { id: ID! animals: [Animal] } interface Animal { id: ID! name: String } type Book implements Media { id: ID! @shareable animals: [Animal] @external } type Dog implements Animal { id: ID! @external name: String @external } type Cat implements Animal { id: ID! @external name: String @external } ` ), resolvers: { Query: { media() { const media = medias[0]; return { __typename: media.__typename, id: media.id, animals: media.animals.map((animalId) => { const animal = animals.find((a) => a.id === animalId); if (!animal) { return null; } return { __typename: animal.__typename, id: animal.id, name: animal.name }; }) }; } } } }); var c = testkit.createSubgraph("c", { typeDefs: ( /* GraphQL */ ` extend schema @link( url: "https://specs.apollo.dev/federation/v2.3" import: ["@key", "@shareable"] ) interface Media { id: ID! animals: [Animal] } interface Animal { id: ID! name: String } type Book implements Media @key(fields: "id") { id: ID! animals: [Animal] @shareable } type Dog implements Animal @key(fields: "id") { id: ID! name: String @shareable age: Int } type Cat implements Animal @key(fields: "id") { id: ID! name: String @shareable age: Int } ` ), resolvers: { Query: { media() { { throw new Error("You should be using the 'a' subgraph!"); } } }, Book: { __resolveReference(key) { const media = medias.find((media2) => media2.id === key.id); return media ? { __typename: "Book", id: media.id, animals: media.animals } : null; }, animals(book) { return book.animals.map((animalId) => { const animal = animals.find((a) => a.id === animalId); return animal ? { __typename: animal.__typename, id: animal.id, name: animal.name } : null; }); } }, Cat: { __resolveReference(key) { const animal = animals.find((animal2) => animal2.id === key.id); return animal ? { __typename: "Cat", id: animal.id, name: animal.name, age: animal.age } : null; }, age(cat) { const animal = animals.find((a) => a.id === cat.id); return animal ? animal.age : null; } }, Dog: { __resolveReference(key) { { throw new Error("You should be using the 'c' subgraph!"); } }, age(dog) { const animal = animals.find((a) => a.id === dog.id); return animal ? animal.age : null; } } } }); var test = [ testkit.createTest( /* GraphQL */ ` query { media { id animals { id name } } } `, { data: { media: { id: "m1", animals: [ { id: "a1", name: "Fido" }, { id: "a2", name: "Whiskers" } ] } } } ), testkit.createTest( /* GraphQL */ ` query { media { id animals { id name ... on Cat { age } } } } `, { data: { media: { id: "m1", animals: [ { id: "a1", name: "Fido" }, { id: "a2", name: "Whiskers", age: 6 } ] } } } ) ]; var index = testkit.serve("provides-on-interface", [a, b, c], test); exports.default = index;