chadstart 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/devcontainer.json +34 -0
- package/.env.example +30 -1
- package/.github/workflows/db-integration.yml +139 -0
- package/.github/workflows/npm-chadstart.yml +12 -1
- package/.github/workflows/npm-sdk.yml +12 -1
- package/chadstart.example.yml +52 -0
- package/chadstart.schema.json +62 -0
- package/core/api-generator.js +36 -36
- package/core/auth.js +76 -65
- package/core/db.js +324 -149
- package/core/entity-engine.js +1 -0
- package/core/oauth.js +263 -0
- package/core/seeder.js +3 -3
- package/docs/auth.md +3 -0
- package/docs/config.md +8 -8
- package/docs/oauth.md +869 -0
- package/mkdocs.yml +1 -0
- package/package.json +5 -1
- package/server/express-server.js +20 -18
- package/test/access-policies.test.js +8 -8
- package/test/api-keys.test.js +28 -28
- package/test/auth.test.js +18 -18
- package/test/db.test.js +71 -71
- package/test/groups.test.js +5 -5
- package/test/integration/db-integration.test.js +368 -0
- package/test/middleware.test.js +1 -1
- package/test/oauth.test.js +259 -0
- package/test/sdk.test.js +19 -19
- package/test/seeder.test.js +26 -26
package/test/db.test.js
CHANGED
|
@@ -11,35 +11,35 @@ describe('db', () => {
|
|
|
11
11
|
let tmpDb;
|
|
12
12
|
const testCore = buildCore({ name: 'T', entities: { Widget: { properties: ['name', 'color'] } } });
|
|
13
13
|
|
|
14
|
-
before(() => {
|
|
14
|
+
before(async () => {
|
|
15
15
|
tmpDb = path.join(os.tmpdir(), `chadstart-test-${Date.now()}.db`);
|
|
16
|
-
dbModule.initDb(testCore, tmpDb);
|
|
16
|
+
await dbModule.initDb(testCore, tmpDb);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
after(() => { fs.unlinkSync(tmpDb); });
|
|
20
20
|
|
|
21
21
|
it('initDb creates database file', () => { assert.ok(fs.existsSync(tmpDb)); });
|
|
22
|
-
it('create inserts a row', () => { const r = dbModule.create('widget', { name: 'Foo', color: 'red' }); assert.strictEqual(r.name, 'Foo'); assert.ok(typeof r.id === 'string' && r.id.length > 0); assert.ok(r.createdAt); assert.ok(r.updatedAt); });
|
|
23
|
-
it('findAll returns paginated result', () => { const result = dbModule.findAll('widget'); assert.ok(result.data.length >= 1); assert.ok(typeof result.total === 'number'); assert.ok(typeof result.currentPage === 'number'); });
|
|
24
|
-
it('findById works', () => { const c = dbModule.create('widget', { name: 'Bar', color: 'blue' }); assert.strictEqual(dbModule.findById('widget', c.id).name, 'Bar'); });
|
|
25
|
-
it('findById returns null for missing', () => assert.strictEqual(dbModule.findById('widget', 'nonexistent-id'), null));
|
|
26
|
-
it('update modifies row', () => { const c = dbModule.create('widget', { name: 'Baz', color: 'green' }); assert.strictEqual(dbModule.update('widget', c.id, { color: 'yellow' }).color, 'yellow'); });
|
|
27
|
-
it('remove deletes row', () => { const c = dbModule.create('widget', { name: 'Del', color: 'gray' }); dbModule.remove('widget', c.id); assert.strictEqual(dbModule.findById('widget', c.id), null); });
|
|
28
|
-
it('remove returns null for missing', () => assert.strictEqual(dbModule.remove('widget', 'nonexistent-id'), null));
|
|
29
|
-
it('findAll with filters', () => { dbModule.create('widget', { name: 'R1', color: 'red' }); const result = dbModule.findAll('widget', { color: 'red' }); assert.ok(result.data.every((r) => r.color === 'red')); });
|
|
30
|
-
it('findAll with filter suffixes', () => { dbModule.create('widget', { name: 'FilterTest', color: 'green' }); const result = dbModule.findAll('widget', { color_neq: 'red' }); assert.ok(result.data.some((r) => r.color !== 'red')); });
|
|
31
|
-
it('findAll with ordering', () => { const result = dbModule.findAll('widget', {}, { orderBy: 'name', order: 'ASC' }); assert.ok(result.data.length >= 1); });
|
|
32
|
-
it('findAll with pagination', () => { const result = dbModule.findAll('widget', {}, { page: 1, perPage: 2 }); assert.ok(result.perPage === 2); assert.ok(result.currentPage === 1); });
|
|
33
|
-
it('findAllSimple returns raw array', () => { const rows = dbModule.findAllSimple('widget'); assert.ok(Array.isArray(rows)); });
|
|
22
|
+
it('create inserts a row', async () => { const r = await dbModule.create('widget', { name: 'Foo', color: 'red' }); assert.strictEqual(r.name, 'Foo'); assert.ok(typeof r.id === 'string' && r.id.length > 0); assert.ok(r.createdAt); assert.ok(r.updatedAt); });
|
|
23
|
+
it('findAll returns paginated result', async () => { const result = await dbModule.findAll('widget'); assert.ok(result.data.length >= 1); assert.ok(typeof result.total === 'number'); assert.ok(typeof result.currentPage === 'number'); });
|
|
24
|
+
it('findById works', async () => { const c = await dbModule.create('widget', { name: 'Bar', color: 'blue' }); assert.strictEqual((await dbModule.findById('widget', c.id)).name, 'Bar'); });
|
|
25
|
+
it('findById returns null for missing', async () => assert.strictEqual(await dbModule.findById('widget', 'nonexistent-id'), null));
|
|
26
|
+
it('update modifies row', async () => { const c = await dbModule.create('widget', { name: 'Baz', color: 'green' }); assert.strictEqual((await dbModule.update('widget', c.id, { color: 'yellow' })).color, 'yellow'); });
|
|
27
|
+
it('remove deletes row', async () => { const c = await dbModule.create('widget', { name: 'Del', color: 'gray' }); await dbModule.remove('widget', c.id); assert.strictEqual(await dbModule.findById('widget', c.id), null); });
|
|
28
|
+
it('remove returns null for missing', async () => assert.strictEqual(await dbModule.remove('widget', 'nonexistent-id'), null));
|
|
29
|
+
it('findAll with filters', async () => { await dbModule.create('widget', { name: 'R1', color: 'red' }); const result = await dbModule.findAll('widget', { color: 'red' }); assert.ok(result.data.every((r) => r.color === 'red')); });
|
|
30
|
+
it('findAll with filter suffixes', async () => { await dbModule.create('widget', { name: 'FilterTest', color: 'green' }); const result = await dbModule.findAll('widget', { color_neq: 'red' }); assert.ok(result.data.some((r) => r.color !== 'red')); });
|
|
31
|
+
it('findAll with ordering', async () => { const result = await dbModule.findAll('widget', {}, { orderBy: 'name', order: 'ASC' }); assert.ok(result.data.length >= 1); });
|
|
32
|
+
it('findAll with pagination', async () => { const result = await dbModule.findAll('widget', {}, { page: 1, perPage: 2 }); assert.ok(result.perPage === 2); assert.ok(result.currentPage === 1); });
|
|
33
|
+
it('findAllSimple returns raw array', async () => { const rows = await dbModule.findAllSimple('widget'); assert.ok(Array.isArray(rows)); });
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
describe('db – authenticable entities', () => {
|
|
37
37
|
let tmp;
|
|
38
38
|
|
|
39
|
-
before(() => {
|
|
39
|
+
before(async () => {
|
|
40
40
|
tmp = path.join(os.tmpdir(), `chadstart-auth-${Date.now()}.db`);
|
|
41
41
|
const core = buildCore({ name: 'T', entities: { Admin: { authenticable: true, properties: ['name'] } } });
|
|
42
|
-
dbModule.initDb(core, tmp);
|
|
42
|
+
await dbModule.initDb(core, tmp);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
after(() => { fs.unlinkSync(tmp); });
|
|
@@ -53,10 +53,10 @@ describe('db – authenticable entities', () => {
|
|
|
53
53
|
describe('db – belongsToMany junction tables', () => {
|
|
54
54
|
let tmp;
|
|
55
55
|
|
|
56
|
-
before(() => {
|
|
56
|
+
before(async () => {
|
|
57
57
|
tmp = path.join(os.tmpdir(), `chadstart-btm-${Date.now()}.db`);
|
|
58
58
|
const core = buildCore({ name: 'T', entities: { Player: { properties: ['n'], belongsToMany: ['Skill'] }, Skill: { properties: ['n'] } } });
|
|
59
|
-
dbModule.initDb(core, tmp);
|
|
59
|
+
await dbModule.initDb(core, tmp);
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
after(() => { fs.unlinkSync(tmp); });
|
|
@@ -70,71 +70,71 @@ describe('db – belongsToMany junction tables', () => {
|
|
|
70
70
|
describe('db – advanced filters', () => {
|
|
71
71
|
let tmp;
|
|
72
72
|
|
|
73
|
-
before(() => {
|
|
73
|
+
before(async () => {
|
|
74
74
|
tmp = path.join(os.tmpdir(), `chadstart-advfilter-${Date.now()}.db`);
|
|
75
75
|
const core = buildCore({
|
|
76
76
|
name: 'T',
|
|
77
77
|
entities: { Score: { properties: [{ name: 'value', type: 'integer' }, { name: 'tag', type: 'string' }] } },
|
|
78
78
|
});
|
|
79
|
-
dbModule.initDb(core, tmp);
|
|
80
|
-
dbModule.create('score', { value: 10, tag: 'alpha' });
|
|
81
|
-
dbModule.create('score', { value: 20, tag: 'bravo' });
|
|
82
|
-
dbModule.create('score', { value: 30, tag: 'charlie' });
|
|
83
|
-
dbModule.create('score', { value: 40, tag: 'delta' });
|
|
79
|
+
await dbModule.initDb(core, tmp);
|
|
80
|
+
await dbModule.create('score', { value: 10, tag: 'alpha' });
|
|
81
|
+
await dbModule.create('score', { value: 20, tag: 'bravo' });
|
|
82
|
+
await dbModule.create('score', { value: 30, tag: 'charlie' });
|
|
83
|
+
await dbModule.create('score', { value: 40, tag: 'delta' });
|
|
84
84
|
});
|
|
85
85
|
|
|
86
86
|
after(() => { fs.unlinkSync(tmp); });
|
|
87
87
|
|
|
88
|
-
it('_eq filter returns exact match', () => {
|
|
89
|
-
const result = dbModule.findAll('score', { tag_eq: 'alpha' });
|
|
88
|
+
it('_eq filter returns exact match', async () => {
|
|
89
|
+
const result = await dbModule.findAll('score', { tag_eq: 'alpha' });
|
|
90
90
|
assert.ok(result.data.every((r) => r.tag === 'alpha'));
|
|
91
91
|
assert.strictEqual(result.data.length, 1);
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
-
it('_gt filter returns rows greater than value', () => {
|
|
95
|
-
const result = dbModule.findAll('score', { value_gt: '15' });
|
|
94
|
+
it('_gt filter returns rows greater than value', async () => {
|
|
95
|
+
const result = await dbModule.findAll('score', { value_gt: '15' });
|
|
96
96
|
assert.ok(result.data.every((r) => r.value > 15));
|
|
97
97
|
assert.strictEqual(result.data.length, 3);
|
|
98
98
|
});
|
|
99
99
|
|
|
100
|
-
it('_gte filter returns rows >= value', () => {
|
|
101
|
-
const result = dbModule.findAll('score', { value_gte: '20' });
|
|
100
|
+
it('_gte filter returns rows >= value', async () => {
|
|
101
|
+
const result = await dbModule.findAll('score', { value_gte: '20' });
|
|
102
102
|
assert.ok(result.data.every((r) => r.value >= 20));
|
|
103
103
|
assert.strictEqual(result.data.length, 3);
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
-
it('_lt filter returns rows below value', () => {
|
|
107
|
-
const result = dbModule.findAll('score', { value_lt: '25' });
|
|
106
|
+
it('_lt filter returns rows below value', async () => {
|
|
107
|
+
const result = await dbModule.findAll('score', { value_lt: '25' });
|
|
108
108
|
assert.ok(result.data.every((r) => r.value < 25));
|
|
109
109
|
assert.strictEqual(result.data.length, 2);
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
-
it('_lte filter returns rows <= value', () => {
|
|
113
|
-
const result = dbModule.findAll('score', { value_lte: '20' });
|
|
112
|
+
it('_lte filter returns rows <= value', async () => {
|
|
113
|
+
const result = await dbModule.findAll('score', { value_lte: '20' });
|
|
114
114
|
assert.ok(result.data.every((r) => r.value <= 20));
|
|
115
115
|
assert.strictEqual(result.data.length, 2);
|
|
116
116
|
});
|
|
117
117
|
|
|
118
|
-
it('_like filter matches pattern', () => {
|
|
119
|
-
const result = dbModule.findAll('score', { tag_like: '%lph%' });
|
|
118
|
+
it('_like filter matches pattern', async () => {
|
|
119
|
+
const result = await dbModule.findAll('score', { tag_like: '%lph%' });
|
|
120
120
|
assert.ok(result.data.every((r) => r.tag.includes('lph')));
|
|
121
121
|
assert.strictEqual(result.data.length, 1);
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
-
it('_in filter returns rows matching any listed value', () => {
|
|
125
|
-
const result = dbModule.findAll('score', { tag_in: 'alpha,bravo' });
|
|
124
|
+
it('_in filter returns rows matching any listed value', async () => {
|
|
125
|
+
const result = await dbModule.findAll('score', { tag_in: 'alpha,bravo' });
|
|
126
126
|
assert.ok(result.data.every((r) => r.tag === 'alpha' || r.tag === 'bravo'));
|
|
127
127
|
assert.strictEqual(result.data.length, 2);
|
|
128
128
|
});
|
|
129
129
|
|
|
130
|
-
it('findAllSimple with filter returns matching rows', () => {
|
|
131
|
-
const rows = dbModule.findAllSimple('score', { tag: 'alpha' });
|
|
130
|
+
it('findAllSimple with filter returns matching rows', async () => {
|
|
131
|
+
const rows = await dbModule.findAllSimple('score', { tag: 'alpha' });
|
|
132
132
|
assert.ok(rows.every((r) => r.tag === 'alpha'));
|
|
133
133
|
assert.strictEqual(rows.length, 1);
|
|
134
134
|
});
|
|
135
135
|
|
|
136
|
-
it('findAllSimple with unknown filter key returns all rows', () => {
|
|
137
|
-
const rows = dbModule.findAllSimple('score', { nonexistent_col: 'xyz' });
|
|
136
|
+
it('findAllSimple with unknown filter key returns all rows', async () => {
|
|
137
|
+
const rows = await dbModule.findAllSimple('score', { nonexistent_col: 'xyz' });
|
|
138
138
|
assert.ok(Array.isArray(rows));
|
|
139
139
|
assert.ok(rows.length >= 4);
|
|
140
140
|
});
|
|
@@ -144,7 +144,7 @@ describe('db – relations', () => {
|
|
|
144
144
|
let tmp, post, commentNoPost, comment1, player, skill1, skill2;
|
|
145
145
|
let core;
|
|
146
146
|
|
|
147
|
-
before(() => {
|
|
147
|
+
before(async () => {
|
|
148
148
|
tmp = path.join(os.tmpdir(), `chadstart-rel-${Date.now()}.db`);
|
|
149
149
|
core = buildCore({
|
|
150
150
|
name: 'T',
|
|
@@ -155,73 +155,73 @@ describe('db – relations', () => {
|
|
|
155
155
|
Skill: { properties: ['label'] },
|
|
156
156
|
},
|
|
157
157
|
});
|
|
158
|
-
dbModule.initDb(core, tmp);
|
|
158
|
+
await dbModule.initDb(core, tmp);
|
|
159
159
|
|
|
160
|
-
post = dbModule.create('post', { title: 'Hello World' });
|
|
161
|
-
dbModule.create('comment', { body: 'Great!', post_id: post.id });
|
|
162
|
-
dbModule.create('comment', { body: 'Thanks', post_id: post.id });
|
|
163
|
-
commentNoPost = dbModule.create('comment', { body: 'Orphan', post_id: null });
|
|
164
|
-
comment1 = dbModule.create('comment', { body: 'Reply', post_id: post.id });
|
|
165
|
-
player = dbModule.create('player', { name: 'Alice' });
|
|
166
|
-
skill1 = dbModule.create('skill', { label: 'Jump' });
|
|
167
|
-
skill2 = dbModule.create('skill', { label: 'Swim' });
|
|
160
|
+
post = await dbModule.create('post', { title: 'Hello World' });
|
|
161
|
+
await dbModule.create('comment', { body: 'Great!', post_id: post.id });
|
|
162
|
+
await dbModule.create('comment', { body: 'Thanks', post_id: post.id });
|
|
163
|
+
commentNoPost = await dbModule.create('comment', { body: 'Orphan', post_id: null });
|
|
164
|
+
comment1 = await dbModule.create('comment', { body: 'Reply', post_id: post.id });
|
|
165
|
+
player = await dbModule.create('player', { name: 'Alice' });
|
|
166
|
+
skill1 = await dbModule.create('skill', { label: 'Jump' });
|
|
167
|
+
skill2 = await dbModule.create('skill', { label: 'Swim' });
|
|
168
168
|
});
|
|
169
169
|
|
|
170
170
|
after(() => { fs.unlinkSync(tmp); });
|
|
171
171
|
|
|
172
|
-
it('loadRelations: noop when row is null', () => {
|
|
173
|
-
const result = dbModule.loadRelations(null, core.entities.Comment, 'Post');
|
|
172
|
+
it('loadRelations: noop when row is null', async () => {
|
|
173
|
+
const result = await dbModule.loadRelations(null, core.entities.Comment, 'Post');
|
|
174
174
|
assert.strictEqual(result, null);
|
|
175
175
|
});
|
|
176
176
|
|
|
177
|
-
it('loadRelations: belongsTo resolves related row', () => {
|
|
177
|
+
it('loadRelations: belongsTo resolves related row', async () => {
|
|
178
178
|
const row = { ...comment1 };
|
|
179
|
-
dbModule.loadRelations(row, core.entities.Comment, 'Post');
|
|
179
|
+
await dbModule.loadRelations(row, core.entities.Comment, 'Post');
|
|
180
180
|
assert.ok(row.Post, 'related row should be attached');
|
|
181
181
|
assert.strictEqual(row.Post.id, post.id);
|
|
182
182
|
assert.strictEqual(row.Post.title, 'Hello World');
|
|
183
183
|
});
|
|
184
184
|
|
|
185
|
-
it('loadRelations: belongsTo with null FK sets null', () => {
|
|
185
|
+
it('loadRelations: belongsTo with null FK sets null', async () => {
|
|
186
186
|
const row = { ...commentNoPost };
|
|
187
|
-
dbModule.loadRelations(row, core.entities.Comment, 'Post');
|
|
187
|
+
await dbModule.loadRelations(row, core.entities.Comment, 'Post');
|
|
188
188
|
assert.strictEqual(row.Post, null);
|
|
189
189
|
});
|
|
190
190
|
|
|
191
|
-
it('loadRelations: hasMany (reverse) resolves children', () => {
|
|
191
|
+
it('loadRelations: hasMany (reverse) resolves children', async () => {
|
|
192
192
|
const row = { ...post };
|
|
193
|
-
dbModule.loadRelations(row, core.entities.Post, 'comment');
|
|
193
|
+
await dbModule.loadRelations(row, core.entities.Post, 'comment');
|
|
194
194
|
assert.ok(Array.isArray(row.comment));
|
|
195
195
|
assert.ok(row.comment.length >= 3);
|
|
196
196
|
assert.ok(row.comment.every((c) => c.post_id === post.id));
|
|
197
197
|
});
|
|
198
198
|
|
|
199
|
-
it('loadRelations: comma-separated names loads multiple relations', () => {
|
|
199
|
+
it('loadRelations: comma-separated names loads multiple relations', async () => {
|
|
200
200
|
const row = { ...comment1 };
|
|
201
|
-
dbModule.loadRelations(row, core.entities.Comment, 'Post,nonexistent');
|
|
201
|
+
await dbModule.loadRelations(row, core.entities.Comment, 'Post,nonexistent');
|
|
202
202
|
assert.ok(row.Post, 'Post relation should be loaded');
|
|
203
203
|
});
|
|
204
204
|
|
|
205
|
-
it('saveBelongsToMany: saves junction rows and loadRelations retrieves them', () => {
|
|
206
|
-
dbModule.saveBelongsToMany(core.entities.Player, player.id, { skillIds: [skill1.id, skill2.id] });
|
|
205
|
+
it('saveBelongsToMany: saves junction rows and loadRelations retrieves them', async () => {
|
|
206
|
+
await dbModule.saveBelongsToMany(core.entities.Player, player.id, { skillIds: [skill1.id, skill2.id] });
|
|
207
207
|
const row = { ...player };
|
|
208
|
-
dbModule.loadRelations(row, core.entities.Player, 'Skill');
|
|
208
|
+
await dbModule.loadRelations(row, core.entities.Player, 'Skill');
|
|
209
209
|
assert.ok(Array.isArray(row.Skill));
|
|
210
210
|
assert.strictEqual(row.Skill.length, 2);
|
|
211
211
|
});
|
|
212
212
|
|
|
213
|
-
it('saveBelongsToMany: clears and replaces existing junction rows', () => {
|
|
214
|
-
dbModule.saveBelongsToMany(core.entities.Player, player.id, { skillIds: [skill1.id] });
|
|
213
|
+
it('saveBelongsToMany: clears and replaces existing junction rows', async () => {
|
|
214
|
+
await dbModule.saveBelongsToMany(core.entities.Player, player.id, { skillIds: [skill1.id] });
|
|
215
215
|
const row = { ...player };
|
|
216
|
-
dbModule.loadRelations(row, core.entities.Player, 'Skill');
|
|
216
|
+
await dbModule.loadRelations(row, core.entities.Player, 'Skill');
|
|
217
217
|
assert.strictEqual(row.Skill.length, 1);
|
|
218
218
|
assert.strictEqual(row.Skill[0].id, skill1.id);
|
|
219
219
|
});
|
|
220
220
|
|
|
221
|
-
it('saveBelongsToMany: skips when no ids key in body', () => {
|
|
222
|
-
dbModule.saveBelongsToMany(core.entities.Player, player.id, {});
|
|
221
|
+
it('saveBelongsToMany: skips when no ids key in body', async () => {
|
|
222
|
+
await dbModule.saveBelongsToMany(core.entities.Player, player.id, {});
|
|
223
223
|
const row = { ...player };
|
|
224
|
-
dbModule.loadRelations(row, core.entities.Player, 'Skill');
|
|
224
|
+
await dbModule.loadRelations(row, core.entities.Player, 'Skill');
|
|
225
225
|
assert.strictEqual(row.Skill.length, 1);
|
|
226
226
|
});
|
|
227
227
|
});
|
package/test/groups.test.js
CHANGED
|
@@ -158,9 +158,9 @@ describe('groups – seeder generates group values', () => {
|
|
|
158
158
|
},
|
|
159
159
|
});
|
|
160
160
|
|
|
161
|
-
before(() => {
|
|
161
|
+
before(async () => {
|
|
162
162
|
tmp = path.join(os.tmpdir(), `chadstart-group-seed-${Date.now()}.db`);
|
|
163
|
-
dbModule.initDb(groupSeedCore, tmp);
|
|
163
|
+
await dbModule.initDb(groupSeedCore, tmp);
|
|
164
164
|
});
|
|
165
165
|
|
|
166
166
|
after(() => { fs.unlinkSync(tmp); });
|
|
@@ -170,7 +170,7 @@ describe('groups – seeder generates group values', () => {
|
|
|
170
170
|
const result = await seedAll(groupSeedCore);
|
|
171
171
|
assert.strictEqual(result.summary.Service, 3);
|
|
172
172
|
|
|
173
|
-
const rows = dbModule.findAll('service', {}, { perPage: 100 });
|
|
173
|
+
const rows = await dbModule.findAll('service', {}, { perPage: 100 });
|
|
174
174
|
assert.strictEqual(rows.total, 3);
|
|
175
175
|
|
|
176
176
|
for (const row of rows.data) {
|
|
@@ -201,10 +201,10 @@ describe('groups – seeder generates group values', () => {
|
|
|
201
201
|
groups: {},
|
|
202
202
|
});
|
|
203
203
|
const tmpNoGroup = path.join(os.tmpdir(), `chadstart-nogrp-${Date.now()}.db`);
|
|
204
|
-
dbModule.initDb(coreNoGroupDef, tmpNoGroup);
|
|
204
|
+
await dbModule.initDb(coreNoGroupDef, tmpNoGroup);
|
|
205
205
|
const result = await seedAll(coreNoGroupDef);
|
|
206
206
|
assert.strictEqual(result.summary.Item, 1);
|
|
207
|
-
const rows = dbModule.findAll('item', {}, { perPage: 10 });
|
|
207
|
+
const rows = await dbModule.findAll('item', {}, { perPage: 10 });
|
|
208
208
|
assert.ok(typeof rows.data[0].stuff === 'string');
|
|
209
209
|
assert.deepStrictEqual(JSON.parse(rows.data[0].stuff), []);
|
|
210
210
|
fs.unlinkSync(tmpNoGroup);
|