-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
crud-test-suite.ts
106 lines (96 loc) · 3.04 KB
/
crud-test-suite.ts
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
// Copyright IBM Corp. 2019. All Rights Reserved.
// Node module: @loopback/repository-tests
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
import {juggler} from '@loopback/repository';
import debugFactory from 'debug';
import fs from 'fs';
import path from 'path';
import {withCrudCtx} from './helpers.repository-tests';
import {
CrudFeatures,
CrudRepositoryCtor,
CrudTestContext,
DataSourceOptions,
} from './types.repository-tests';
const debug = debugFactory('loopback:repository-tests');
type SuiteFn = (
dataSourceOptions: DataSourceOptions,
repositoryClass: CrudRepositoryCtor,
features: CrudFeatures,
) => void;
export function crudRepositoryTestSuite(
dataSourceOptions: DataSourceOptions,
repositoryClass: CrudRepositoryCtor,
partialFeatures: Partial<CrudFeatures>,
) {
const features: CrudFeatures = {
idType: 'string',
freeFormProperties: true,
emptyValue: undefined,
supportsTransactions: true,
supportsInclusionResolvers: true,
hasRevisionToken: false,
...partialFeatures,
};
describe('CRUD Repository operations', () => {
before(
withCrudCtx(function setupContext(ctx: CrudTestContext) {
ctx.dataSourceOptions = dataSourceOptions;
ctx.repositoryClass = repositoryClass;
ctx.features = features;
}),
);
before(
withCrudCtx(function setupGlobalDataSource(ctx: CrudTestContext) {
ctx.dataSource = new juggler.DataSource(ctx.dataSourceOptions);
}),
);
let testFiles = [];
const testRoot = path.resolve(__dirname, 'crud');
testFiles = fs.readdirSync(testRoot);
testFiles = testFiles.filter(function(it) {
return (
!!require.extensions[path.extname(it).toLowerCase()] &&
/\.suite\.[^.]+$/.test(it)
);
});
// relations folder tests
const folders = ['acceptance'];
for (const folder of folders) {
const relationsTestRoot = path.resolve(
__dirname,
`crud/relations/${folder}`,
);
let folderTestFiles = fs.readdirSync(relationsTestRoot);
folderTestFiles = folderTestFiles.filter(function(it) {
return (
!!require.extensions[path.extname(it).toLowerCase()] &&
/\.acceptance\.[^.]+$/.test(it)
);
});
folderTestFiles.forEach(file => {
file = `relations/${folder}/` + file;
testFiles.push(file);
});
}
for (const ix in testFiles) {
const name = testFiles[ix];
const fullPath = path.resolve(testRoot, name);
debug('Loading CRUD test suite %j', fullPath);
const allExports = require(fullPath);
for (const key in allExports) {
const suite: SuiteFn = allExports[key];
if (typeof suite !== 'function') continue;
debug(
'Calling suite function %j with args',
suite.name,
dataSourceOptions,
'class ' + repositoryClass.name,
partialFeatures,
);
suite(dataSourceOptions, repositoryClass, features);
}
}
});
}