2018-08-03 21:25:16 +00:00
|
|
|
import 'package:graphql_schema/graphql_schema.dart';
|
|
|
|
import 'package:test/test.dart';
|
|
|
|
|
|
|
|
void main() {
|
2018-08-03 22:41:13 +00:00
|
|
|
var typeType = enumTypeFromStrings('Type', [
|
2018-08-03 22:06:02 +00:00
|
|
|
'FIRE',
|
|
|
|
'WATER',
|
|
|
|
'GRASS',
|
|
|
|
]);
|
|
|
|
|
2018-08-03 21:25:16 +00:00
|
|
|
var pokemonType = objectType('Pokémon', fields: [
|
2018-08-03 22:06:02 +00:00
|
|
|
field(
|
|
|
|
'name',
|
2018-08-04 19:18:53 +00:00
|
|
|
graphQLString.nonNullable(),
|
2018-08-03 22:06:02 +00:00
|
|
|
),
|
|
|
|
field(
|
|
|
|
'type',
|
2018-08-04 19:18:53 +00:00
|
|
|
typeType,
|
2018-08-03 22:06:02 +00:00
|
|
|
),
|
2018-08-03 21:25:16 +00:00
|
|
|
]);
|
|
|
|
|
|
|
|
var isValidPokemon = predicate(
|
|
|
|
(x) =>
|
|
|
|
pokemonType.validate('@root', x as Map<String, dynamic>).successful,
|
|
|
|
'is a valid Pokémon');
|
|
|
|
|
2019-04-11 17:49:53 +00:00
|
|
|
var throwsATypeError = throwsA(predicate(
|
|
|
|
(x) => x is TypeError || x is CastError, 'is a type or cast error'));
|
2018-08-03 21:25:16 +00:00
|
|
|
|
2018-08-05 01:32:20 +00:00
|
|
|
test('object accepts valid input', () {
|
|
|
|
expect({'name': 'Charmander', 'type': 'FIRE'}, isValidPokemon);
|
|
|
|
});
|
|
|
|
|
2018-08-03 21:25:16 +00:00
|
|
|
test('mismatched scalar type', () {
|
|
|
|
expect(() => pokemonType.validate('@root', {'name': 24}), throwsATypeError);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('empty passed for non-nullable', () {
|
|
|
|
expect(<String, dynamic>{}, isNot(isValidPokemon));
|
|
|
|
});
|
|
|
|
|
|
|
|
test('null passed for non-nullable', () {
|
|
|
|
expect({'name': null}, isNot(isValidPokemon));
|
|
|
|
});
|
|
|
|
|
|
|
|
test('rejects extraneous fields', () {
|
|
|
|
expect({'name': 'Vulpix', 'foo': 'bar'}, isNot(isValidPokemon));
|
|
|
|
});
|
2018-08-03 22:06:02 +00:00
|
|
|
|
|
|
|
test('enum accepts valid value', () {
|
|
|
|
expect(typeType.validate('@root', 'FIRE').successful, true);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('enum rejects invalid value', () {
|
|
|
|
expect(typeType.validate('@root', 'POISON').successful, false);
|
|
|
|
});
|
2018-08-05 01:32:20 +00:00
|
|
|
|
|
|
|
group('union type', () {
|
|
|
|
var digimonType = objectType(
|
|
|
|
'Digimon',
|
|
|
|
fields: [
|
|
|
|
field('size', graphQLFloat.nonNullable()),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
|
|
|
|
var u = new GraphQLUnionType('Monster', [pokemonType, digimonType]);
|
|
|
|
|
|
|
|
test('any of its types returns valid', () {
|
|
|
|
expect(u.validate('@root', {'size': 32.0}).successful, true);
|
|
|
|
expect(
|
|
|
|
u.validate(
|
|
|
|
'@root', {'name': 'Charmander', 'type': 'FIRE'}).successful,
|
|
|
|
true);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
group('input object', () {
|
|
|
|
var type = inputObjectType(
|
|
|
|
'Foo',
|
|
|
|
inputFields: [
|
|
|
|
inputField('bar', graphQLString.nonNullable()),
|
|
|
|
inputField('baz', graphQLFloat.nonNullable()),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
|
|
|
|
test('accept valid input', () {
|
|
|
|
expect(type.validate('@root', {'bar': 'a', 'baz': 2.0}).value,
|
|
|
|
{'bar': 'a', 'baz': 2.0});
|
|
|
|
});
|
|
|
|
|
|
|
|
test('error on missing non-null fields', () {
|
|
|
|
expect(type.validate('@root', {'bar': 'a'}).successful, false);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('error on unrecognized fields', () {
|
|
|
|
expect(
|
|
|
|
type.validate(
|
|
|
|
'@root', {'bar': 'a', 'baz': 2.0, 'franken': 'stein'}).successful,
|
|
|
|
false);
|
|
|
|
});
|
|
|
|
});
|
2018-08-03 21:25:16 +00:00
|
|
|
}
|