-
Notifications
You must be signed in to change notification settings - Fork 1
/
custom-types-test.js
141 lines (125 loc) · 3.57 KB
/
custom-types-test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import { describe, Try } from "riteway";
import { Email, EthereumAddress, TokenData } from "./custom-types.js";
import configureGqlValidate from "./index.js";
describe("gqlValidate(): with valid custom types", async assert => {
const config = { Email, EthereumAddress };
const gqlValidate = configureGqlValidate(config);
const rootType = "Issuer";
const schema = `
type ${rootType} {
name: String
email: Email!
address: EthereumAddress!
}
`;
{
const validObj = {
address: "0xad16d6d10e6acf06c6a17bd85cfb9f1d5467c644",
email: "foo@example.com",
name: "Foobert"
};
assert({
given: "a schema with custom types and a valid object",
should: "return an empty array",
actual: await gqlValidate(schema, rootType, validObj),
expected: []
});
}
{
const invalidObj = {
address: "abc",
email: "Foobert"
};
assert({
given: "a schema with custom types and an invalid object",
should: "return an array containing the correct errors",
actual: await gqlValidate(schema, rootType, invalidObj),
expected: [
"email must be a valid email",
"address must be a valid Ethereum address"
]
});
}
});
describe("gqlValidate(): with array", async assert => {
const config = { TokenData };
const validate = configureGqlValidate(config);
const rootType = "Params";
const schema = `
type TokenData {
name: String!
id: String!
}
type ${rootType} {
message: String!
numbers: [Int!]!
strings: [String!]!
tokens: [TokenData!]!
}
`;
{
const token = { name: "foo", id: "123" };
const validObj = {
message: "bar",
numbers: [4],
tokens: [token],
strings: ["foo"]
};
assert({
given: "a valid object",
should: "return an empty array",
actual: await validate(schema, rootType, validObj),
expected: []
});
}
{
const invalidObj = { message: "foo", numbers: [], tokens: [], strings: [] };
assert({
given: "an invalid object (empty array)",
should: "return an array containing the corresponding error",
actual: await validate(schema, rootType, invalidObj),
expected: [
"numbers is a required field",
"strings is a required field",
"tokens is a required field"
]
});
}
{
const invalidObj = {
message: "hello",
numbers: ["hello"],
strings: [1],
tokens: [{ name: 1, id: true }]
};
assert({
given: "an invalid object (wrong types)",
should: "return an array containing the corresponding error",
actual: await validate(schema, rootType, invalidObj),
expected: [
'numbers[0] must be a `number` type, but the final value was: `"hello"`.',
"strings[0] must be a `string` type, but the final value was: `1`.",
"tokens[0].name must be a `string` type, but the final value was: `1`.",
"tokens[0].id must be a `string` type, but the final value was: `true`."
]
});
}
});
describe("gqlValidate(): with invalid custom types", async assert => {
const invalidConfig = { Wrong: {} };
const gqlValidate = configureGqlValidate(invalidConfig);
const rootType = "Wrong";
const schema = `
type ${rootType} {
wrong: Wrong!
}
`;
const obj = { wrong: "" };
const error = await Try(gqlValidate, schema, rootType, obj);
assert({
given: "an invalid configuration object",
should: "throw",
actual: error.message,
expected: `${rootType} must be a yup validator.`
});
});