import { expect } from 'chai';
import { describe, it } from 'mocha';
import { graphqlSync } from '../graphql.js';
import { StarWarsSchema } from './starWarsSchema.js';
function queryStarWars(source: string) {
const result = graphqlSync({ schema: StarWarsSchema, source });
expect(Object.keys(result)).to.deep.equal(['data']);
return result.data;
}
describe('Star Wars Introspection Tests', () => {
describe('Basic Introspection', () => {
it('Allows querying the schema for types', () => {
const data = queryStarWars(`
{
__schema {
types {
name
}
}
}
`);
expect(data).to.deep.equal({
__schema: {
types: [
{ name: 'Human' },
{ name: 'Character' },
{ name: 'String' },
{ name: 'Episode' },
{ name: 'Droid' },
{ name: 'Query' },
{ name: 'Boolean' },
{ name: '__Schema' },
{ name: '__Type' },
{ name: '__TypeKind' },
{ name: '__Field' },
{ name: '__InputValue' },
{ name: '__EnumValue' },
{ name: '__Directive' },
{ name: '__DirectiveLocation' },
],
},
});
});
it('Allows querying the schema for query type', () => {
const data = queryStarWars(`
{
__schema {
queryType {
name
}
}
}
`);
expect(data).to.deep.equal({
__schema: {
queryType: {
name: 'Query',
},
},
});
});
it('Allows querying the schema for a specific type', () => {
const data = queryStarWars(`
{
__type(name: "Droid") {
name
}
}
`);
expect(data).to.deep.equal({
__type: {
name: 'Droid',
},
});
});
it('Allows querying the schema for an object kind', () => {
const data = queryStarWars(`
{
__type(name: "Droid") {
name
kind
}
}
`);
expect(data).to.deep.equal({
__type: {
name: 'Droid',
kind: 'OBJECT',
},
});
});
it('Allows querying the schema for an interface kind', () => {
const data = queryStarWars(`
{
__type(name: "Character") {
name
kind
}
}
`);
expect(data).to.deep.equal({
__type: {
name: 'Character',
kind: 'INTERFACE',
},
});
});
it('Allows querying the schema for object fields', () => {
const data = queryStarWars(`
{
__type(name: "Droid") {
name
fields {
name
type {
name
kind
}
}
}
}
`);
expect(data).to.deep.equal({
__type: {
name: 'Droid',
fields: [
{
name: 'id',
type: { name: null, kind: 'NON_NULL' },
},
{
name: 'name',
type: { name: 'String', kind: 'SCALAR' },
},
{
name: 'friends',
type: { name: null, kind: 'LIST' },
},
{
name: 'appearsIn',
type: { name: null, kind: 'LIST' },
},
{
name: 'secretBackstory',
type: { name: 'String', kind: 'SCALAR' },
},
{
name: 'primaryFunction',
type: { name: 'String', kind: 'SCALAR' },
},
],
},
});
});
it('Allows querying the schema for nested object fields', () => {
const data = queryStarWars(`
{
__type(name: "Droid") {
name
fields {
name
type {
name
kind
ofType {
name
kind
}
}
}
}
}
`);
expect(data).to.deep.equal({
__type: {
name: 'Droid',
fields: [
{
name: 'id',
type: {
name: null,
kind: 'NON_NULL',
ofType: {
name: 'String',
kind: 'SCALAR',
},
},
},
{
name: 'name',
type: {
name: 'String',
kind: 'SCALAR',
ofType: null,
},
},
{
name: 'friends',
type: {
name: null,
kind: 'LIST',
ofType: {
name: 'Character',
kind: 'INTERFACE',
},
},
},
{
name: 'appearsIn',
type: {
name: null,
kind: 'LIST',
ofType: {
name: 'Episode',
kind: 'ENUM',
},
},
},
{
name: 'secretBackstory',
type: {
name: 'String',
kind: 'SCALAR',
ofType: null,
},
},
{
name: 'primaryFunction',
type: {
name: 'String',
kind: 'SCALAR',
ofType: null,
},
},
],
},
});
});
it('Allows querying the schema for field args', () => {
const data = queryStarWars(`
{
__schema {
queryType {
fields {
name
args {
name
description
type {
name
kind
ofType {
name
kind
}
}
defaultValue
}
}
}
}
}
`);
expect(data).to.deep.equal({
__schema: {
queryType: {
fields: [
{
name: 'hero',
args: [
{
defaultValue: null,
description:
'If omitted, returns the hero of the whole saga. If provided, returns the hero of that particular episode.',
name: 'episode',
type: {
kind: 'ENUM',
name: 'Episode',
ofType: null,
},
},
],
},
{
name: 'human',
args: [
{
name: 'id',
description: 'id of the human',
type: {
kind: 'NON_NULL',
name: null,
ofType: {
kind: 'SCALAR',
name: 'String',
},
},
defaultValue: null,
},
],
},
{
name: 'droid',
args: [
{
name: 'id',
description: 'id of the droid',
type: {
kind: 'NON_NULL',
name: null,
ofType: {
kind: 'SCALAR',
name: 'String',
},
},
defaultValue: null,
},
],
},
],
},
},
});
});
it('Allows querying the schema for documentation', () => {
const data = queryStarWars(`
{
__type(name: "Droid") {
name
description
}
}
`);
expect(data).to.deep.equal({
__type: {
name: 'Droid',
description: 'A mechanical creature in the Star Wars universe.',
},
});
});
});
});