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/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
  });
@@ -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);