apollo-codegen-flow
Version:
Flow generator module for Apollo Codegen
482 lines (436 loc) • 12.1 kB
text/typescript
import {
GraphQLString,
GraphQLInt,
GraphQLFloat,
GraphQLBoolean,
GraphQLID,
GraphQLNonNull,
GraphQLList,
GraphQLScalarType,
} from "graphql";
import * as t from "@babel/types";
import { createTypeAnnotationFromGraphQLTypeFunction } from "../helpers";
const typeAnnotationFromGraphQLType =
createTypeAnnotationFromGraphQLTypeFunction({
passthroughCustomScalars: false,
useReadOnlyTypes: false,
});
describe("Flow typeAnnotationFromGraphQLType", () => {
test("String", () => {
expect(typeAnnotationFromGraphQLType(GraphQLString)).toMatchObject(
t.nullableTypeAnnotation(t.stringTypeAnnotation())
);
});
test("Int", () => {
expect(typeAnnotationFromGraphQLType(GraphQLInt)).toMatchObject(
t.nullableTypeAnnotation(t.numberTypeAnnotation())
);
});
test("Float", () => {
expect(typeAnnotationFromGraphQLType(GraphQLFloat)).toMatchObject(
t.nullableTypeAnnotation(t.numberTypeAnnotation())
);
});
test("Boolean", () => {
expect(typeAnnotationFromGraphQLType(GraphQLBoolean)).toMatchObject(
t.nullableTypeAnnotation(t.booleanTypeAnnotation())
);
});
test("ID", () => {
expect(typeAnnotationFromGraphQLType(GraphQLID)).toMatchObject(
t.nullableTypeAnnotation(t.stringTypeAnnotation())
);
});
test("String!", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLNonNull(GraphQLString))
).toMatchObject(t.stringTypeAnnotation());
});
test("Int!", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLNonNull(GraphQLInt))
).toMatchObject(t.numberTypeAnnotation());
});
test("Float!", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLNonNull(GraphQLFloat))
).toMatchObject(t.numberTypeAnnotation());
});
test("Boolean!", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLNonNull(GraphQLBoolean))
).toMatchObject(t.booleanTypeAnnotation());
});
test("ID!", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLNonNull(GraphQLID))
).toMatchObject(t.stringTypeAnnotation());
});
// TODO: Test GenericTypeAnnotation
test("[String]", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLList(GraphQLString))
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.stringTypeAnnotation()),
])
)
)
);
});
test("[Int]", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLList(GraphQLInt))
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.numberTypeAnnotation()),
])
)
)
);
});
test("[Float]", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLList(GraphQLFloat))
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.numberTypeAnnotation()),
])
)
)
);
});
test("[Boolean]", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLList(GraphQLBoolean))
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.booleanTypeAnnotation()),
])
)
)
);
});
test("[ID]", () => {
expect(
typeAnnotationFromGraphQLType(new GraphQLList(GraphQLID))
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.stringTypeAnnotation()),
])
)
)
);
});
test("[String]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(GraphQLString))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.stringTypeAnnotation()),
])
)
);
});
test("[Int]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(GraphQLInt))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.numberTypeAnnotation()),
])
)
);
});
test("[Float]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(GraphQLFloat))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.numberTypeAnnotation()),
])
)
);
});
test("[Boolean]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(GraphQLBoolean))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.booleanTypeAnnotation()),
])
)
);
});
test("[ID]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(GraphQLID))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.stringTypeAnnotation()),
])
)
);
});
test("[String!]", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLList(new GraphQLNonNull(GraphQLString))
)
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.stringTypeAnnotation()])
)
)
);
});
test("[Int!]", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLList(new GraphQLNonNull(GraphQLInt))
)
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.numberTypeAnnotation()])
)
)
);
});
test("[Float!]", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLList(new GraphQLNonNull(GraphQLFloat))
)
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.numberTypeAnnotation()])
)
)
);
});
test("[Boolean!]", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLList(new GraphQLNonNull(GraphQLBoolean))
)
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.booleanTypeAnnotation()])
)
)
);
});
test("[ID!]", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLList(new GraphQLNonNull(GraphQLID))
)
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.stringTypeAnnotation()])
)
)
);
});
test("[String!]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLString)))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.stringTypeAnnotation()])
)
);
});
test("[Int!]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLInt)))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.numberTypeAnnotation()])
)
);
});
test("[Float!]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLFloat)))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.numberTypeAnnotation()])
)
);
});
test("[Boolean!]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLBoolean)))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.booleanTypeAnnotation()])
)
);
});
test("[ID!]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLID)))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([t.stringTypeAnnotation()])
)
);
});
test("[[String]]", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLList(new GraphQLList(GraphQLString))
)
).toMatchObject(
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.stringTypeAnnotation()),
])
)
),
])
)
)
);
});
test("[[String]]!", () => {
expect(
typeAnnotationFromGraphQLType(
new GraphQLNonNull(new GraphQLList(new GraphQLList(GraphQLString)))
)
).toMatchObject(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(
t.genericTypeAnnotation(
t.identifier("Array"),
t.typeParameterInstantiation([
t.nullableTypeAnnotation(t.stringTypeAnnotation()),
])
)
),
])
)
);
});
test("Custom Scalar", () => {
const OddType = new GraphQLScalarType({
name: "Odd",
serialize(value) {
return value % 2 === 1 ? value : null;
},
});
expect(typeAnnotationFromGraphQLType(OddType)).toMatchObject(
t.nullableTypeAnnotation(t.anyTypeAnnotation())
);
});
});
describe("passthrough custom scalars", () => {
let getTypeAnnotation: Function;
beforeAll(() => {
getTypeAnnotation = createTypeAnnotationFromGraphQLTypeFunction({
passthroughCustomScalars: true,
useReadOnlyTypes: false,
});
});
test("Custom Scalar", () => {
const OddType = new GraphQLScalarType({
name: "Odd",
serialize(value) {
return value % 2 === 1 ? value : null;
},
});
expect(getTypeAnnotation(OddType)).toMatchObject(
t.nullableTypeAnnotation(t.genericTypeAnnotation(t.identifier("Odd")))
);
});
});
describe("passthrough custom scalars with custom scalar prefix", () => {
let getTypeAnnotation: Function;
beforeAll(() => {
getTypeAnnotation = createTypeAnnotationFromGraphQLTypeFunction({
passthroughCustomScalars: true,
customScalarsPrefix: "Foo$",
useReadOnlyTypes: false,
});
});
test("Custom Scalar", () => {
const OddType = new GraphQLScalarType({
name: "Odd",
serialize(value) {
return value % 2 === 1 ? value : null;
},
});
expect(getTypeAnnotation(OddType)).toMatchObject(
t.nullableTypeAnnotation(t.genericTypeAnnotation(t.identifier("Foo$Odd")))
);
});
});