-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathfields.test.js
95 lines (80 loc) · 2.82 KB
/
fields.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
/**
* @jest-environment node
*/
const fs = require('fs');
const path = require('path');
const cuid = require('cuid');
const { graphqlRequest, keystoneMongoTest } = require('@voussoir/test-utils');
const Keystone = require('../../core/Keystone');
const WebServer = require('../../server/WebServer');
const { MongooseAdapter } = require('../../adapter-mongoose');
const sorted = (arr, keyFn) => {
arr = [...arr];
arr.sort((a, b) => {
a = keyFn(a);
b = keyFn(b);
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
});
return arr;
};
export const runQuery = (server, snippet) => {
return graphqlRequest({
server,
query: `query { ${snippet} }`,
}).then(res => res.body.data);
};
export const matchFilter = (server, gqlArgs, fields, target, sortkey) => {
gqlArgs = gqlArgs ? `(${gqlArgs})` : '';
const snippet = `allTests ${gqlArgs} ${fields}`;
return runQuery(server, snippet).then(data => {
const value = sortkey ? sorted(data.allTests || [], i => i[sortkey]) : data.allTests;
expect(value).toEqual(target);
});
};
// `mongodb-memory-server` downloads a binary on first run in CI, which can take
// a while, so we bump up the timeout here.
jest.setTimeout(60000);
describe('Test CRUD for all fields', () => {
const typesLoc = path.resolve('packages/fields/types');
const testModules = fs
.readdirSync(typesLoc)
.map(name => `${typesLoc}/${name}/filterTests.js`)
.filter(filename => fs.existsSync(filename));
testModules.push(path.resolve('packages/fields/tests/idFilterTests.js'));
testModules.map(require).forEach(mod => {
describe(`All the CRUD tests for module: ${mod.name}`, () => {
const listName = 'test';
const keystoneTestWrapper = (testFn = () => {}) =>
keystoneMongoTest(
() => {
// Set up a keystone project for each type test to use
const keystone = new Keystone({
adapter: new MongooseAdapter(),
name: `Field tests for ${mod.name} ${cuid}`,
});
// Create a list with all the fields required for testing
const fields = mod.getTestFields();
const labelResolver = item => item;
keystone.createList(listName, { fields, labelResolver });
// Set up a server (but do not .listen(), we will use supertest to access the app)
const server = new WebServer(keystone, {
'cookie secret': 'qwerty',
});
return { server, keystone };
},
async ({ server, ...rest }) => {
// Populate the database before running the tests
await server.keystone.createItems({ [listName]: mod.initItems() });
return testFn({ server, ...rest });
}
);
mod.filterTests(keystoneTestWrapper);
});
});
});