feathers-adapter-vitest 0.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.
@@ -0,0 +1,581 @@
1
+ import assert from 'node:assert';
2
+ import { describe, beforeEach, afterEach, beforeAll } from 'vitest';
3
+ export default (test, app, _errors, serviceName, idProp) => {
4
+ describe(' Methods', () => {
5
+ let doug;
6
+ let service;
7
+ beforeEach(async () => {
8
+ service = app.service(serviceName);
9
+ doug = await app.service(serviceName).create({
10
+ name: 'Doug',
11
+ age: 32,
12
+ });
13
+ });
14
+ afterEach(async () => {
15
+ try {
16
+ await app.service(serviceName).remove(doug[idProp]);
17
+ }
18
+ catch {
19
+ // Ignore errors
20
+ }
21
+ });
22
+ describe('get', () => {
23
+ test('.get', async () => {
24
+ const data = await service.get(doug[idProp]);
25
+ assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`);
26
+ assert.strictEqual(data.name, 'Doug', 'data.name matches');
27
+ assert.strictEqual(data.age, 32, 'data.age matches');
28
+ });
29
+ test('.get + $select', async () => {
30
+ const data = await service.get(doug[idProp], {
31
+ query: { $select: ['name'] },
32
+ });
33
+ assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`);
34
+ assert.strictEqual(data.name, 'Doug', 'data.name matches');
35
+ assert.ok(!data.age, 'data.age is falsy');
36
+ });
37
+ test('.get + id + query', async () => {
38
+ try {
39
+ await service.get(doug[idProp], {
40
+ query: { name: 'Tester' },
41
+ });
42
+ throw new Error('Should never get here');
43
+ }
44
+ catch (error) {
45
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
46
+ }
47
+ });
48
+ test('.get + NotFound', async () => {
49
+ try {
50
+ await service.get('568225fbfe21222432e836ff');
51
+ throw new Error('Should never get here');
52
+ }
53
+ catch (error) {
54
+ assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error');
55
+ }
56
+ });
57
+ test('.get + id + query id', async () => {
58
+ const alice = await service.create({
59
+ name: 'Alice',
60
+ age: 12,
61
+ });
62
+ try {
63
+ await service.get(doug[idProp], {
64
+ query: { [idProp]: alice[idProp] },
65
+ });
66
+ throw new Error('Should never get here');
67
+ }
68
+ catch (error) {
69
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
70
+ }
71
+ await service.remove(alice[idProp]);
72
+ });
73
+ });
74
+ describe('find', () => {
75
+ test('.find', async () => {
76
+ const data = await service.find();
77
+ assert.ok(Array.isArray(data), 'Data is an array');
78
+ assert.strictEqual(data.length, 1, 'Got one entry');
79
+ });
80
+ });
81
+ describe('remove', () => {
82
+ test('.remove', async () => {
83
+ const data = await service.remove(doug[idProp]);
84
+ assert.strictEqual(data.name, 'Doug', 'data.name matches');
85
+ });
86
+ test('.remove + $select', async () => {
87
+ const data = await service.remove(doug[idProp], {
88
+ query: { $select: ['name'] },
89
+ });
90
+ assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`);
91
+ assert.strictEqual(data.name, 'Doug', 'data.name matches');
92
+ assert.ok(!data.age, 'data.age is falsy');
93
+ });
94
+ test('.remove + id + query', async () => {
95
+ try {
96
+ await service.remove(doug[idProp], {
97
+ query: { name: 'Tester' },
98
+ });
99
+ throw new Error('Should never get here');
100
+ }
101
+ catch (error) {
102
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
103
+ }
104
+ });
105
+ test('.remove + multi', async () => {
106
+ try {
107
+ await service.remove(null);
108
+ throw new Error('Should never get here');
109
+ }
110
+ catch (error) {
111
+ assert.strictEqual(error.name, 'MethodNotAllowed', 'Removing multiple without option set throws MethodNotAllowed');
112
+ }
113
+ service.options.multi = ['remove'];
114
+ await service.create({ name: 'Dave', age: 29, created: true });
115
+ await service.create({
116
+ name: 'David',
117
+ age: 3,
118
+ created: true,
119
+ });
120
+ const data = await service.remove(null, {
121
+ query: { created: true },
122
+ });
123
+ assert.strictEqual(data.length, 2);
124
+ const names = data.map((person) => person.name);
125
+ assert.ok(names.includes('Dave'), 'Dave removed');
126
+ assert.ok(names.includes('David'), 'David removed');
127
+ });
128
+ test('.remove + multi no pagination', async () => {
129
+ try {
130
+ await service.remove(doug[idProp]);
131
+ }
132
+ catch {
133
+ // Ignore errors
134
+ }
135
+ const count = 14;
136
+ const defaultPaginate = 10;
137
+ assert.ok(count > defaultPaginate, 'count is bigger than default pagination');
138
+ const multiBefore = service.options.multi;
139
+ const paginateBefore = service.options.paginate;
140
+ try {
141
+ service.options.multi = true;
142
+ service.options.paginate = {
143
+ default: defaultPaginate,
144
+ max: 100,
145
+ };
146
+ const emptyItems = await service.find({ paginate: false });
147
+ assert.strictEqual(emptyItems.length, 0, 'no items before');
148
+ const createdItems = await service.create(Array.from(Array(count)).map((_, i) => ({
149
+ name: `name-${i}`,
150
+ age: 3,
151
+ created: true,
152
+ })));
153
+ assert.strictEqual(createdItems.length, count, `created ${count} items`);
154
+ const foundItems = await service.find({ paginate: false });
155
+ assert.strictEqual(foundItems.length, count, `created ${count} items`);
156
+ const foundPaginatedItems = await service.find({});
157
+ assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated items');
158
+ const allItems = await service.remove(null, {
159
+ query: { created: true },
160
+ });
161
+ assert.strictEqual(allItems.length, count, `removed all ${count} items`);
162
+ }
163
+ finally {
164
+ await service.remove(null, {
165
+ query: { created: true },
166
+ paginate: false,
167
+ });
168
+ service.options.multi = multiBefore;
169
+ service.options.paginate = paginateBefore;
170
+ }
171
+ });
172
+ test('.remove + id + query id', async () => {
173
+ const alice = await service.create({
174
+ name: 'Alice',
175
+ age: 12,
176
+ });
177
+ try {
178
+ await service.remove(doug[idProp], {
179
+ query: { [idProp]: alice[idProp] },
180
+ });
181
+ throw new Error('Should never get here');
182
+ }
183
+ catch (error) {
184
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
185
+ }
186
+ await service.remove(alice[idProp]);
187
+ });
188
+ });
189
+ describe('update', () => {
190
+ test('.update', async () => {
191
+ const originalData = { [idProp]: doug[idProp], name: 'Dougler' };
192
+ const originalCopy = Object.assign({}, originalData);
193
+ const data = await service.update(doug[idProp], originalData);
194
+ assert.deepStrictEqual(originalData, originalCopy, 'data was not modified');
195
+ assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`);
196
+ assert.strictEqual(data.name, 'Dougler', 'data.name matches');
197
+ assert.ok(!data.age, 'data.age is falsy');
198
+ });
199
+ test('.update + $select', async () => {
200
+ const originalData = {
201
+ [idProp]: doug[idProp],
202
+ name: 'Dougler',
203
+ age: 10,
204
+ };
205
+ const data = await service.update(doug[idProp], originalData, {
206
+ query: { $select: ['name'] },
207
+ });
208
+ assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`);
209
+ assert.strictEqual(data.name, 'Dougler', 'data.name matches');
210
+ assert.ok(!data.age, 'data.age is falsy');
211
+ });
212
+ test('.update + id + query', async () => {
213
+ try {
214
+ await service.update(doug[idProp], {
215
+ name: 'Dougler',
216
+ }, {
217
+ query: { name: 'Tester' },
218
+ });
219
+ throw new Error('Should never get here');
220
+ }
221
+ catch (error) {
222
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
223
+ }
224
+ });
225
+ test('.update + NotFound', async () => {
226
+ try {
227
+ await service.update('568225fbfe21222432e836ff', {
228
+ name: 'NotFound',
229
+ });
230
+ throw new Error('Should never get here');
231
+ }
232
+ catch (error) {
233
+ assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error');
234
+ }
235
+ });
236
+ test('.update + query + NotFound', async () => {
237
+ const dave = await service.create({ name: 'Dave' });
238
+ try {
239
+ await service.update(dave[idProp], { name: 'UpdatedDave' }, { query: { name: 'NotDave' } });
240
+ throw new Error('Should never get here');
241
+ }
242
+ catch (error) {
243
+ assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error');
244
+ }
245
+ await service.remove(dave[idProp]);
246
+ });
247
+ test('.update + id + query id', async () => {
248
+ const alice = await service.create({
249
+ name: 'Alice',
250
+ age: 12,
251
+ });
252
+ try {
253
+ await service.update(doug[idProp], {
254
+ name: 'Dougler',
255
+ age: 33,
256
+ }, {
257
+ query: { [idProp]: alice[idProp] },
258
+ });
259
+ throw new Error('Should never get here');
260
+ }
261
+ catch (error) {
262
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
263
+ }
264
+ await service.remove(alice[idProp]);
265
+ });
266
+ });
267
+ describe('patch', () => {
268
+ test('.patch', async () => {
269
+ const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' };
270
+ const originalCopy = Object.assign({}, originalData);
271
+ const data = await service.patch(doug[idProp], originalData);
272
+ assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified');
273
+ assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`);
274
+ assert.strictEqual(data.name, 'PatchDoug', 'data.name matches');
275
+ assert.strictEqual(data.age, 32, 'data.age matches');
276
+ });
277
+ test('.patch + $select', async () => {
278
+ const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' };
279
+ const data = await service.patch(doug[idProp], originalData, {
280
+ query: { $select: ['name'] },
281
+ });
282
+ assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`);
283
+ assert.strictEqual(data.name, 'PatchDoug', 'data.name matches');
284
+ assert.ok(!data.age, 'data.age is falsy');
285
+ });
286
+ test('.patch + id + query', async () => {
287
+ try {
288
+ await service.patch(doug[idProp], {
289
+ name: 'id patched doug',
290
+ }, {
291
+ query: { name: 'Tester' },
292
+ });
293
+ throw new Error('Should never get here');
294
+ }
295
+ catch (error) {
296
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
297
+ }
298
+ });
299
+ test('.patch multiple', async () => {
300
+ try {
301
+ await service.patch(null, {});
302
+ throw new Error('Should never get here');
303
+ }
304
+ catch (error) {
305
+ assert.strictEqual(error.name, 'MethodNotAllowed', 'Removing multiple without option set throws MethodNotAllowed');
306
+ }
307
+ const params = {
308
+ query: { created: true },
309
+ };
310
+ const dave = await service.create({
311
+ name: 'Dave',
312
+ age: 29,
313
+ created: true,
314
+ });
315
+ const david = await service.create({
316
+ name: 'David',
317
+ age: 3,
318
+ created: true,
319
+ });
320
+ service.options.multi = ['patch'];
321
+ const data = await service.patch(null, {
322
+ age: 2,
323
+ }, params);
324
+ assert.strictEqual(data.length, 2, 'returned two entries');
325
+ assert.strictEqual(data[0].age, 2, 'First entry age was updated');
326
+ assert.strictEqual(data[1].age, 2, 'Second entry age was updated');
327
+ await service.remove(dave[idProp]);
328
+ await service.remove(david[idProp]);
329
+ });
330
+ test('.patch multiple no pagination', async () => {
331
+ try {
332
+ await service.remove(doug[idProp]);
333
+ }
334
+ catch {
335
+ // Ignore errors
336
+ }
337
+ const count = 14;
338
+ const defaultPaginate = 10;
339
+ assert.ok(count > defaultPaginate, 'count is bigger than default pagination');
340
+ const multiBefore = service.options.multi;
341
+ const paginateBefore = service.options.paginate;
342
+ let ids = undefined;
343
+ try {
344
+ service.options.multi = true;
345
+ service.options.paginate = {
346
+ default: defaultPaginate,
347
+ max: 100,
348
+ };
349
+ const emptyItems = await service.find({ paginate: false });
350
+ assert.strictEqual(emptyItems.length, 0, 'no items before');
351
+ const createdItems = await service.create(Array.from(Array(count)).map((_, i) => ({
352
+ name: `name-${i}`,
353
+ age: 3,
354
+ created: true,
355
+ })));
356
+ assert.strictEqual(createdItems.length, count, `created ${count} items`);
357
+ ids = createdItems.map((item) => item[idProp]);
358
+ const foundItems = await service.find({ paginate: false });
359
+ assert.strictEqual(foundItems.length, count, `created ${count} items`);
360
+ const foundPaginatedItems = await service.find({});
361
+ assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated data');
362
+ const allItems = await service.patch(null, { age: 4 }, { query: { created: true } });
363
+ assert.strictEqual(allItems.length, count, `patched all ${count} items`);
364
+ }
365
+ finally {
366
+ service.options.multi = multiBefore;
367
+ service.options.paginate = paginateBefore;
368
+ if (ids) {
369
+ await Promise.all(ids.map((id) => service.remove(id)));
370
+ }
371
+ }
372
+ });
373
+ test('.patch multi query same', async () => {
374
+ const service = app.service(serviceName);
375
+ const multiBefore = service.options.multi;
376
+ service.options.multi = true;
377
+ const params = {
378
+ query: { age: { $lt: 10 } },
379
+ };
380
+ const dave = await service.create({
381
+ name: 'Dave',
382
+ age: 8,
383
+ created: true,
384
+ });
385
+ const david = await service.create({
386
+ name: 'David',
387
+ age: 4,
388
+ created: true,
389
+ });
390
+ const data = await service.patch(null, {
391
+ age: 2,
392
+ }, params);
393
+ assert.strictEqual(data.length, 2, 'returned two entries');
394
+ assert.strictEqual(data[0].age, 2, 'First entry age was updated');
395
+ assert.strictEqual(data[1].age, 2, 'Second entry age was updated');
396
+ await service.remove(dave[idProp]);
397
+ await service.remove(david[idProp]);
398
+ service.options.multi = multiBefore;
399
+ });
400
+ test('.patch multi query changed', async () => {
401
+ const service = app.service(serviceName);
402
+ const multiBefore = service.options.multi;
403
+ service.options.multi = true;
404
+ const params = {
405
+ query: { age: 10 },
406
+ };
407
+ const dave = await service.create({
408
+ name: 'Dave',
409
+ age: 10,
410
+ created: true,
411
+ });
412
+ const david = await service.create({
413
+ name: 'David',
414
+ age: 10,
415
+ created: true,
416
+ });
417
+ const data = await service.patch(null, {
418
+ age: 2,
419
+ }, params);
420
+ assert.strictEqual(data.length, 2, 'returned two entries');
421
+ assert.strictEqual(data[0].age, 2, 'First entry age was updated');
422
+ assert.strictEqual(data[1].age, 2, 'Second entry age was updated');
423
+ await service.remove(dave[idProp]);
424
+ await service.remove(david[idProp]);
425
+ service.options.multi = multiBefore;
426
+ });
427
+ test('.patch + NotFound', async () => {
428
+ try {
429
+ await service.patch('568225fbfe21222432e836ff', {
430
+ name: 'PatchDoug',
431
+ });
432
+ throw new Error('Should never get here');
433
+ }
434
+ catch (error) {
435
+ assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error');
436
+ }
437
+ });
438
+ test('.patch + query + NotFound', async () => {
439
+ const dave = await service.create({ name: 'Dave' });
440
+ try {
441
+ await service.patch(dave[idProp], { name: 'PatchedDave' }, { query: { name: 'NotDave' } });
442
+ throw new Error('Should never get here');
443
+ }
444
+ catch (error) {
445
+ assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error');
446
+ }
447
+ await service.remove(dave[idProp]);
448
+ });
449
+ test('.patch + id + query id', async () => {
450
+ const alice = await service.create({
451
+ name: 'Alice',
452
+ age: 12,
453
+ });
454
+ try {
455
+ await service.patch(doug[idProp], {
456
+ age: 33,
457
+ }, {
458
+ query: { [idProp]: alice[idProp] },
459
+ });
460
+ throw new Error('Should never get here');
461
+ }
462
+ catch (error) {
463
+ assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error');
464
+ }
465
+ await service.remove(alice[idProp]);
466
+ });
467
+ });
468
+ describe('create', () => {
469
+ test('.create', async () => {
470
+ const originalData = {
471
+ name: 'Bill',
472
+ age: 40,
473
+ };
474
+ const originalCopy = Object.assign({}, originalData);
475
+ const data = await service.create(originalData);
476
+ assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified');
477
+ assert.ok(data instanceof Object, 'data is an object');
478
+ assert.strictEqual(data.name, 'Bill', 'data.name matches');
479
+ await service.remove(data[idProp]);
480
+ });
481
+ test('.create ignores query', async () => {
482
+ const originalData = {
483
+ name: 'Billy',
484
+ age: 42,
485
+ };
486
+ const data = await service.create(originalData, {
487
+ query: {
488
+ name: 'Dave',
489
+ },
490
+ });
491
+ assert.strictEqual(data.name, 'Billy', 'data.name matches');
492
+ await service.remove(data[idProp]);
493
+ });
494
+ test('.create + $select', async () => {
495
+ const originalData = {
496
+ name: 'William',
497
+ age: 23,
498
+ };
499
+ const data = await service.create(originalData, {
500
+ query: { $select: ['name'] },
501
+ });
502
+ assert.ok(idProp in data, 'data has id');
503
+ assert.strictEqual(data.name, 'William', 'data.name matches');
504
+ assert.ok(!data.age, 'data.age is falsy');
505
+ await service.remove(data[idProp]);
506
+ });
507
+ test('.create multi', async () => {
508
+ try {
509
+ await service.create([], {});
510
+ throw new Error('Should never get here');
511
+ }
512
+ catch (error) {
513
+ assert.strictEqual(error.name, 'MethodNotAllowed', 'Removing multiple without option set throws MethodNotAllowed');
514
+ }
515
+ const items = [
516
+ {
517
+ name: 'Gerald',
518
+ age: 18,
519
+ },
520
+ {
521
+ name: 'Herald',
522
+ age: 18,
523
+ },
524
+ ];
525
+ service.options.multi = ['create', 'patch'];
526
+ const data = await service.create(items);
527
+ assert.ok(Array.isArray(data), 'data is an array');
528
+ assert.ok(typeof data[0][idProp] !== 'undefined', 'id is set');
529
+ assert.strictEqual(data[0].name, 'Gerald', 'first name matches');
530
+ assert.ok(typeof data[1][idProp] !== 'undefined', 'id is set');
531
+ assert.strictEqual(data[1].name, 'Herald', 'second name macthes');
532
+ await service.remove(data[0][idProp]);
533
+ await service.remove(data[1][idProp]);
534
+ });
535
+ });
536
+ describe("doesn't call public methods internally", () => {
537
+ let throwing;
538
+ beforeAll(() => {
539
+ throwing = Object.assign(Object.create(app.service(serviceName)), {
540
+ get store() {
541
+ return app.service(serviceName).store;
542
+ },
543
+ find() {
544
+ throw new Error('find method called');
545
+ },
546
+ get() {
547
+ throw new Error('get method called');
548
+ },
549
+ create() {
550
+ throw new Error('create method called');
551
+ },
552
+ update() {
553
+ throw new Error('update method called');
554
+ },
555
+ patch() {
556
+ throw new Error('patch method called');
557
+ },
558
+ remove() {
559
+ throw new Error('remove method called');
560
+ },
561
+ });
562
+ });
563
+ test('internal .find', () => app.service(serviceName).find.call(throwing));
564
+ test('internal .get', () => service.get.call(throwing, doug[idProp]));
565
+ test('internal .create', async () => {
566
+ const bob = await service.create.call(throwing, {
567
+ name: 'Bob',
568
+ age: 25,
569
+ });
570
+ await service.remove(bob[idProp]);
571
+ });
572
+ test('internal .update', () => service.update.call(throwing, doug[idProp], {
573
+ name: 'Dougler',
574
+ }));
575
+ test('internal .patch', () => service.patch.call(throwing, doug[idProp], {
576
+ name: 'PatchDoug',
577
+ }));
578
+ test('internal .remove', () => service.remove.call(throwing, doug[idProp]));
579
+ });
580
+ });
581
+ };
@@ -0,0 +1,3 @@
1
+ import type { AdapterSyntaxTest } from './declarations.js';
2
+ declare const _default: (test: AdapterSyntaxTest, app: any, _errors: any, serviceName: string, idProp: string) => void;
3
+ export default _default;