@graphql-hive/federation-gateway-audit
Version:
Audit tool for Apollo Federation Gateway
590 lines (572 loc) • 10.3 kB
JavaScript
'use strict';
var testkit = require('./testkit-CAf-AsDy.cjs');
require('@apollo/composition');
require('graphql');
require('fets');
require('@apollo/subgraph');
require('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 = testkit.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 = testkit.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 = [
testkit.createTest(
/* GraphQL */
`
query {
media {
... on Movie {
title
}
}
}
`,
{
data: {
media: {}
}
}
),
testkit.createTest(
/* GraphQL */
`
query {
media {
... on Book {
title
}
}
}
`,
{
data: {
media: {
title: media.title
}
}
}
),
testkit.createTest(
/* GraphQL */
`
query {
media {
... on Book {
title
}
... on Movie {
title
}
}
}
`,
{
data: {
media: {
title: media.title
}
}
}
),
testkit.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"
}
}
}
}
),
testkit.createTest(
/* GraphQL */
`
query {
viewer {
media {
... on Movie {
title
}
}
}
}
`,
{
data: {
viewer: {
media: {}
}
}
}
),
testkit.createTest(
/* GraphQL */
`
query {
viewer {
media {
... on Book {
title
}
}
}
}
`,
{
data: {
viewer: {
media: {
title: media.title
}
}
}
}
),
testkit.createTest(
/* GraphQL */
`
query {
viewer {
media {
... on Book {
title
}
... on Movie {
title
}
}
}
}
`,
{
data: {
viewer: {
media: {
title: media.title
}
}
}
}
),
testkit.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
testkit.createTest(
/* GraphQL */
`
query {
aMedia {
... on Movie {
title
bTitle
}
}
}
`,
{
data: {
aMedia: {}
}
}
),
testkit.createTest(
/* GraphQL */
`
query {
aMedia {
... on Book {
title
aTitle
bTitle
}
}
}
`,
{
data: {
aMedia: {
title: media.title,
aTitle: media.aTitle,
bTitle: media.bTitle
}
}
}
),
testkit.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"
}
}
}
}
),
testkit.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 = testkit.serve("union-intersection", [a, b], test);
exports.default = index;