@lilaquadrat/studio 11.4.2 → 12.0.0
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/lib/services.d.ts +2 -1
- package/lib/services.js +2 -1
- package/lib/services.js.map +1 -1
- package/lib/src/Immutable.class.d.ts +5 -1
- package/lib/src/Immutable.class.js +16 -1
- package/lib/src/Immutable.class.js.map +1 -1
- package/lib/src/helpers/cacheHelper.js +4 -0
- package/lib/src/helpers/cacheHelper.js.map +1 -1
- package/lib/src/interfaces/Participant.d.ts +1 -1
- package/lib/src/interfaces/Participant.js +1 -1
- package/lib/src/interfaces/Participant.js.map +1 -1
- package/lib/src/models/customers.model.js +17 -0
- package/lib/src/models/customers.model.js.map +1 -1
- package/lib/src/models/history.model.js +25 -6
- package/lib/src/models/history.model.js.map +1 -1
- package/lib/src/models/license.model.js +5 -25
- package/lib/src/models/license.model.js.map +1 -1
- package/lib/src/models/lists.model.js +2 -0
- package/lib/src/models/lists.model.js.map +1 -1
- package/lib/src/models/listsParticipants.model.js +13 -3
- package/lib/src/models/listsParticipants.model.js.map +1 -1
- package/lib/src/services/customers.service.d.ts +2 -1
- package/lib/src/services/customers.service.js +33 -1
- package/lib/src/services/customers.service.js.map +1 -1
- package/lib/src/services/history.service.d.ts +4 -4
- package/lib/src/services/history.service.js +50 -53
- package/lib/src/services/history.service.js.map +1 -1
- package/lib/src/services/license.service.d.ts +11 -0
- package/lib/src/services/license.service.js +28 -0
- package/lib/src/services/license.service.js.map +1 -0
- package/lib/src/services/listParticipants.service.d.ts +16 -1
- package/lib/src/services/listParticipants.service.js +69 -10
- package/lib/src/services/listParticipants.service.js.map +1 -1
- package/lib/src/services/lists.service.js +4 -4
- package/lib/src/services/lists.service.js.map +1 -1
- package/lib/src/services/structures.service.d.ts +4 -0
- package/lib/src/services/structures.service.js +4 -1
- package/lib/src/services/structures.service.js.map +1 -1
- package/lib/tests/cacheHelper.spec.js +4 -0
- package/lib/tests/cacheHelper.spec.js.map +1 -1
- package/lib/tests/customersServiceUpdateMe.spec.d.ts +1 -0
- package/lib/tests/customersServiceUpdateMe.spec.js +276 -0
- package/lib/tests/customersServiceUpdateMe.spec.js.map +1 -0
- package/lib/tests/immutableClass.spec.d.ts +1 -0
- package/lib/tests/immutableClass.spec.js +552 -0
- package/lib/tests/immutableClass.spec.js.map +1 -0
- package/lib/tests/licenseModel.spec.d.ts +1 -0
- package/lib/tests/licenseModel.spec.js +43 -0
- package/lib/tests/licenseModel.spec.js.map +1 -0
- package/lib/tests/licenseService.spec.d.ts +1 -0
- package/lib/tests/licenseService.spec.js +47 -0
- package/lib/tests/licenseService.spec.js.map +1 -0
- package/lib/tests/listParticipantsHistory.spec.d.ts +1 -0
- package/lib/tests/listParticipantsHistory.spec.js +90 -0
- package/lib/tests/listParticipantsHistory.spec.js.map +1 -0
- package/lib/tests/listParticipantsMembersSelfService.spec.d.ts +1 -0
- package/lib/tests/listParticipantsMembersSelfService.spec.js +241 -0
- package/lib/tests/listParticipantsMembersSelfService.spec.js.map +1 -0
- package/lib/tests/listParticipantsServiceGetMyLists.spec.d.ts +1 -0
- package/lib/tests/listParticipantsServiceGetMyLists.spec.js +55 -0
- package/lib/tests/listParticipantsServiceGetMyLists.spec.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, it } from '@jest/globals';
|
|
2
|
+
import Models from '../src/classes/models.class';
|
|
3
|
+
import LicenseModel from '../src/models/license.model';
|
|
4
|
+
const models = new Models();
|
|
5
|
+
models.register('license', LicenseModel);
|
|
6
|
+
const validLicense = {
|
|
7
|
+
id: 'starter',
|
|
8
|
+
name: 'Starter',
|
|
9
|
+
};
|
|
10
|
+
describe('LicenseModel', () => {
|
|
11
|
+
it('accepts a license with only id and name', () => {
|
|
12
|
+
expect(LicenseModel.validate(validLicense, 'create')).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it('accepts availability on create', () => {
|
|
15
|
+
expect(LicenseModel.validate({ ...validLicense, available: true }, 'create')).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
it('requires an id and name', () => {
|
|
18
|
+
expect(LicenseModel.validate({ name: 'Starter' }, 'create')).toBe(false);
|
|
19
|
+
expect(LicenseModel.validate({ id: 'starter' }, 'create')).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
it('allows only availability and description to change', () => {
|
|
22
|
+
expect(LicenseModel.validate({ available: true, description: 'updated' }, 'change')).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it('requires availability on change', () => {
|
|
25
|
+
expect(LicenseModel.validate({ description: 'updated' }, 'change')).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it('rejects edits to immutable terms and the id', () => {
|
|
28
|
+
expect(LicenseModel.validate({ available: true, monthlyCost: 5 }, 'change')).toBe(false);
|
|
29
|
+
expect(LicenseModel.validate({ available: true, id: 'other' }, 'change')).toBe(false);
|
|
30
|
+
expect(LicenseModel.validate({ available: true, includedApps: ['editor'] }, 'change')).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
it('marks the id as immutable', () => {
|
|
33
|
+
expect(LicenseModel.immutable).toContain('id');
|
|
34
|
+
});
|
|
35
|
+
it('defines a unique license id', () => {
|
|
36
|
+
expect(LicenseModel.indexes).toContainEqual(expect.objectContaining({
|
|
37
|
+
key: { id: 1 },
|
|
38
|
+
unique: true,
|
|
39
|
+
name: 'license_unique-v1',
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=licenseModel.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licenseModel.spec.js","sourceRoot":"","sources":["../../tests/licenseModel.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, jest } from '@jest/globals';
|
|
2
|
+
import { ObjectId } from 'mongodb';
|
|
3
|
+
import LicenseModel from '../src/models/license.model';
|
|
4
|
+
import LicenseService from '../src/services/license.service';
|
|
5
|
+
describe('LicenseService', () => {
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
jest.restoreAllMocks();
|
|
8
|
+
});
|
|
9
|
+
it('gets a license by its unique id', async () => {
|
|
10
|
+
const findOne = jest.fn().mockResolvedValue(null);
|
|
11
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
12
|
+
await LicenseService.single('free');
|
|
13
|
+
expect(findOne).toHaveBeenCalledWith({ id: 'free' }, { projection: { history: 0 } });
|
|
14
|
+
});
|
|
15
|
+
it('lists licenses sorted by name', async () => {
|
|
16
|
+
const toArray = jest.fn().mockResolvedValue([]);
|
|
17
|
+
const sort = jest.fn().mockReturnValue({ toArray });
|
|
18
|
+
const find = jest.fn().mockReturnValue({ sort });
|
|
19
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ find });
|
|
20
|
+
await LicenseService.list();
|
|
21
|
+
expect(find).toHaveBeenCalledWith();
|
|
22
|
+
expect(sort).toHaveBeenCalledWith({ name: 1 });
|
|
23
|
+
expect(toArray).toHaveBeenCalledWith();
|
|
24
|
+
});
|
|
25
|
+
it('changes a license by its unique id', async () => {
|
|
26
|
+
const _id = new ObjectId();
|
|
27
|
+
const findOne = jest.fn().mockResolvedValue({ _id });
|
|
28
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
29
|
+
const immutable = jest.spyOn(LicenseService, 'immutable').mockResolvedValue({});
|
|
30
|
+
await LicenseService.change('free', { available: true }, 'user', 'app');
|
|
31
|
+
expect(immutable).toHaveBeenCalledWith(_id, { available: true }, 'user', 'change', 'app');
|
|
32
|
+
});
|
|
33
|
+
it('rejects changing a missing license', async () => {
|
|
34
|
+
const findOne = jest.fn().mockResolvedValue(null);
|
|
35
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
36
|
+
await expect(LicenseService.change('free', { available: true }, 'user', 'app')).rejects.toThrow('LICENSE_NOT_FOUND');
|
|
37
|
+
});
|
|
38
|
+
it('removes a license by its unique id', async () => {
|
|
39
|
+
const _id = new ObjectId();
|
|
40
|
+
const findOne = jest.fn().mockResolvedValue({ _id });
|
|
41
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
42
|
+
const remove = jest.spyOn(LicenseService, 'delete').mockResolvedValue({ acknowledged: true, deletedCount: 1 });
|
|
43
|
+
await LicenseService.remove('free', 'user', 'app');
|
|
44
|
+
expect(remove).toHaveBeenCalledWith(_id, 'user', 'app');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=licenseService.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licenseService.spec.js","sourceRoot":"","sources":["../../tests/licenseService.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,YAAY,MAAM,6BAA6B,CAAC;AACvD,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAE7D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAE9B,SAAS,CAAC,GAAG,EAAE;QAEb,IAAI,CAAC,eAAe,EAAE,CAAC;IAEzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAkD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAClG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAW,CAAC,CAAC;QAE5E,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAkD,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,EAAW,CAAC,CAAC;QAEzE,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE5B,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAEzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAElD,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAkD,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAW,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,iBAAiB,CAAC,EAAW,CAAC,CAAC;QAEzF,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAExE,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAElD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAkD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAClG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAW,CAAC,CAAC;QAE5E,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEvH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAElD,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAkD,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAW,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAE/G,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAE1D,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, jest } from '@jest/globals';
|
|
2
|
+
import { ObjectId } from 'mongodb';
|
|
3
|
+
import HistoryModel from '../src/models/history.model.js';
|
|
4
|
+
import HistoryService from '../src/services/history.service.js';
|
|
5
|
+
import ListParticipantsService from '../src/services/listParticipants.service.js';
|
|
6
|
+
const listId = new ObjectId();
|
|
7
|
+
const participantId = new ObjectId();
|
|
8
|
+
const customerId = new ObjectId();
|
|
9
|
+
const options = { company: 'company', project: 'project', user: 'admin', app: 'lists' };
|
|
10
|
+
describe('participant history feed', () => {
|
|
11
|
+
const countDocuments = jest.fn();
|
|
12
|
+
const toArray = jest.fn();
|
|
13
|
+
const aggregate = jest.fn();
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
countDocuments.mockResolvedValue(0);
|
|
16
|
+
toArray.mockResolvedValue([]);
|
|
17
|
+
aggregate.mockReturnValue({ toArray });
|
|
18
|
+
jest.spyOn(HistoryModel, 'db', 'get').mockReturnValue({ countDocuments, aggregate });
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
jest.restoreAllMocks();
|
|
22
|
+
jest.clearAllMocks();
|
|
23
|
+
});
|
|
24
|
+
it('scopes count and rows to the same tenant, project, model and list before paging', async () => {
|
|
25
|
+
countDocuments.mockResolvedValue(42);
|
|
26
|
+
await ListParticipantsService.listHistory(listId, undefined, options, 20, 20);
|
|
27
|
+
const filter = { company: 'company', project: 'project', 'history.model': 'listParticipants', list: listId };
|
|
28
|
+
expect(countDocuments).toHaveBeenCalledWith(filter);
|
|
29
|
+
const pipeline = aggregate.mock.calls[0][0];
|
|
30
|
+
expect(pipeline.slice(0, 4)).toEqual([
|
|
31
|
+
{ $match: filter },
|
|
32
|
+
{ $sort: { _id: -1 } },
|
|
33
|
+
{ $skip: 20 },
|
|
34
|
+
{ $limit: 20 },
|
|
35
|
+
]);
|
|
36
|
+
expect(pipeline[4]).toMatchObject({ $lookup: { from: 'me' } });
|
|
37
|
+
expect(pipeline).toContainEqual({
|
|
38
|
+
$addFields: {
|
|
39
|
+
'history.user': {
|
|
40
|
+
$cond: [
|
|
41
|
+
{ $eq: ['$history.origin', 'member'] },
|
|
42
|
+
'$history.user',
|
|
43
|
+
{ $concat: ['$userData.lastname', ', ', '$userData.prename'] },
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
expect(pipeline.slice(-4)).toEqual(ListParticipantsService.customerLookup);
|
|
49
|
+
expect(pipeline).not.toContainEqual({ $project: { project: 1, id: 1, company: 1, history: 1 } });
|
|
50
|
+
});
|
|
51
|
+
it('keeps recorded member edits, cancellation and deletion snapshots in the response', async () => {
|
|
52
|
+
const snapshots = [
|
|
53
|
+
{ state: 'canceled', history: { reason: 'delete', parent: participantId, user: 'admin' } },
|
|
54
|
+
{ state: 'canceled', history: { reason: 'change', parent: participantId, user: 'member-account', origin: 'member' } },
|
|
55
|
+
{ state: 'reserved', 's-shirt-size': 'L', history: { reason: 'change', parent: participantId, user: 'member-account', origin: 'member' } },
|
|
56
|
+
].map((snapshot) => ({ ...snapshot, _id: new ObjectId(), list: listId, user: customerId }));
|
|
57
|
+
countDocuments.mockResolvedValue(3);
|
|
58
|
+
toArray.mockResolvedValue(snapshots);
|
|
59
|
+
const result = await ListParticipantsService.listHistory(listId, undefined, options);
|
|
60
|
+
expect(result).toEqual({ all: 3, data: snapshots, count: 3 });
|
|
61
|
+
expect(aggregate.mock.calls[0][0].slice(0, 4)).toEqual([
|
|
62
|
+
{ $match: { company: 'company', project: 'project', 'history.model': 'listParticipants', list: listId } },
|
|
63
|
+
{ $sort: { _id: -1 } },
|
|
64
|
+
{ $skip: 0 },
|
|
65
|
+
{ $limit: 20 },
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
it('applies an optional reason to both the list feed count and rows', async () => {
|
|
69
|
+
await ListParticipantsService.listHistory(listId, 'change', options);
|
|
70
|
+
const filter = { company: 'company', project: 'project', 'history.model': 'listParticipants', 'history.reason': 'change', list: listId };
|
|
71
|
+
expect(countDocuments).toHaveBeenCalledWith(filter);
|
|
72
|
+
expect(aggregate.mock.calls[0][0][0]).toEqual({ $match: filter });
|
|
73
|
+
});
|
|
74
|
+
it('uses the updated model argument in both general history feed methods', async () => {
|
|
75
|
+
await HistoryService.list('company', undefined, 'listParticipants', 'participant-1', 'change', 'members', -1, 20, 0);
|
|
76
|
+
const companyFilter = { company: 'company', 'history.model': 'listParticipants', id: 'participant-1', 'history.reason': 'change', 'history.app': 'members' };
|
|
77
|
+
expect(countDocuments).toHaveBeenNthCalledWith(1, companyFilter);
|
|
78
|
+
expect(aggregate.mock.calls[0][0][0]).toEqual({ $match: companyFilter });
|
|
79
|
+
await HistoryService.singleList('company', 'project', participantId, 'listParticipants', 'change', undefined, -1, 30, 30);
|
|
80
|
+
const participantFilter = { company: 'company', project: 'project', 'history.model': 'listParticipants', 'history.parent': participantId, 'history.reason': 'change' };
|
|
81
|
+
expect(countDocuments).toHaveBeenNthCalledWith(2, participantFilter);
|
|
82
|
+
expect(aggregate.mock.calls[1][0].slice(0, 4)).toEqual([
|
|
83
|
+
{ $match: participantFilter },
|
|
84
|
+
{ $sort: { _id: -1 } },
|
|
85
|
+
{ $skip: 30 },
|
|
86
|
+
{ $limit: 30 },
|
|
87
|
+
]);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=listParticipantsHistory.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listParticipantsHistory.spec.js","sourceRoot":"","sources":["../../tests/listParticipantsHistory.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, it, jest } from '@jest/globals';
|
|
2
|
+
import mongodb from 'mongo-mock';
|
|
3
|
+
import { ObjectId } from 'mongodb';
|
|
4
|
+
import Models from '../src/classes/models.class.js';
|
|
5
|
+
import ListParticipantsModel from '../src/models/listsParticipants.model.js';
|
|
6
|
+
import ListsModel from '../src/models/lists.model.js';
|
|
7
|
+
import CustomersModel from '../src/models/customers.model.js';
|
|
8
|
+
import HistoryModel from '../src/models/history.model.js';
|
|
9
|
+
import StructureModel from '../src/models/structure.model.js';
|
|
10
|
+
import ListParticipantsService from '../src/services/listParticipants.service.js';
|
|
11
|
+
import StructureService from '../src/services/structures.service.js';
|
|
12
|
+
const customerId = new ObjectId();
|
|
13
|
+
const listId = new ObjectId();
|
|
14
|
+
const participantId = new ObjectId();
|
|
15
|
+
const options = { user: 'member-account', app: 'member-app', company: 'company', project: 'project' };
|
|
16
|
+
const customer = {
|
|
17
|
+
_id: customerId,
|
|
18
|
+
id: 'customer-1',
|
|
19
|
+
type: 'person',
|
|
20
|
+
company: options.company,
|
|
21
|
+
prename: 'Anna',
|
|
22
|
+
name: 'Müller',
|
|
23
|
+
email: 'member@example.org',
|
|
24
|
+
emailConfirmed: true,
|
|
25
|
+
accounts: [{ account: options.user, app: options.app, project: options.project }],
|
|
26
|
+
history: { source: 'public-app', version: 0 },
|
|
27
|
+
};
|
|
28
|
+
const participant = {
|
|
29
|
+
_id: participantId,
|
|
30
|
+
list: listId,
|
|
31
|
+
user: customerId,
|
|
32
|
+
category: 'cat-1',
|
|
33
|
+
state: 'reserved',
|
|
34
|
+
agreements: [],
|
|
35
|
+
company: options.company,
|
|
36
|
+
project: options.project,
|
|
37
|
+
history: { source: 'public-app', version: 0 },
|
|
38
|
+
};
|
|
39
|
+
const list = {
|
|
40
|
+
_id: listId,
|
|
41
|
+
name: 'Sommerfest',
|
|
42
|
+
mode: 'reservation',
|
|
43
|
+
state: 'open',
|
|
44
|
+
company: options.company,
|
|
45
|
+
project: options.project,
|
|
46
|
+
participants: { selfService: true },
|
|
47
|
+
agreements: [],
|
|
48
|
+
history: { source: 'public-app', version: 0 },
|
|
49
|
+
};
|
|
50
|
+
const structures = [
|
|
51
|
+
{
|
|
52
|
+
_id: new ObjectId(),
|
|
53
|
+
id: 's-string-1',
|
|
54
|
+
model: 'listsParticipants',
|
|
55
|
+
company: options.company,
|
|
56
|
+
project: options.project,
|
|
57
|
+
type: 'string',
|
|
58
|
+
question: 'T-Shirt size',
|
|
59
|
+
max: 20,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
_id: new ObjectId(),
|
|
63
|
+
id: 's-select-1',
|
|
64
|
+
model: 'listsParticipants',
|
|
65
|
+
company: options.company,
|
|
66
|
+
project: options.project,
|
|
67
|
+
type: 'select',
|
|
68
|
+
question: 'Meal',
|
|
69
|
+
options: [{ value: 'a', text: 'A' }, { value: 'b', text: 'B' }],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
_id: new ObjectId(),
|
|
73
|
+
id: 's-bool-1',
|
|
74
|
+
model: 'listsParticipants',
|
|
75
|
+
company: options.company,
|
|
76
|
+
project: options.project,
|
|
77
|
+
type: 'boolean',
|
|
78
|
+
question: 'Vegetarian',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
_id: new ObjectId(),
|
|
82
|
+
id: 's-number-1',
|
|
83
|
+
model: 'listsParticipants',
|
|
84
|
+
company: options.company,
|
|
85
|
+
project: options.project,
|
|
86
|
+
type: 'number',
|
|
87
|
+
question: 'Guests',
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
describe('member list entry self-service', () => {
|
|
91
|
+
let client;
|
|
92
|
+
beforeAll(async () => {
|
|
93
|
+
mongodb.max_delay = 0;
|
|
94
|
+
client = await mongodb.MongoClient.connect('mongodb://localhost:27017/member-list-entry-tests');
|
|
95
|
+
const models = new Models();
|
|
96
|
+
models.register('listParticipants', ListParticipantsModel);
|
|
97
|
+
models.register('lists', ListsModel);
|
|
98
|
+
models.register('customers', CustomersModel);
|
|
99
|
+
models.register('history', HistoryModel);
|
|
100
|
+
models.register('structures', StructureModel);
|
|
101
|
+
await Promise.all(models.injectDatabaseConnection(client, undefined, true));
|
|
102
|
+
StructureService.injectAjv(models.ajv);
|
|
103
|
+
const collection = ListParticipantsModel.db;
|
|
104
|
+
// mongo-mock returns the old driver result wrapper; production MongoDB returns the document.
|
|
105
|
+
jest.spyOn(collection, 'findOneAndUpdate').mockImplementation((async (filter, update) => {
|
|
106
|
+
await collection.updateOne(filter, update);
|
|
107
|
+
return collection.findOne(filter);
|
|
108
|
+
}));
|
|
109
|
+
});
|
|
110
|
+
beforeEach(async () => {
|
|
111
|
+
for (const collection of [ListParticipantsModel.db, ListsModel.db, CustomersModel.db, HistoryModel.db, StructureModel.db]) {
|
|
112
|
+
while (await collection.countDocuments({}))
|
|
113
|
+
await collection.deleteOne({});
|
|
114
|
+
}
|
|
115
|
+
// structuredClone would turn the nested ObjectIds into plain objects, so rebuild the reference fields
|
|
116
|
+
await CustomersModel.db.insertOne({ ...customer, _id: customerId });
|
|
117
|
+
await ListParticipantsModel.db.insertOne({ ...participant, _id: participantId, list: listId, user: customerId });
|
|
118
|
+
await ListsModel.db.insertOne({ ...list, _id: listId });
|
|
119
|
+
for (const structure of structures) {
|
|
120
|
+
await StructureModel.db.insertOne({ ...structure });
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
afterAll(async () => {
|
|
124
|
+
jest.restoreAllMocks();
|
|
125
|
+
await client.close();
|
|
126
|
+
});
|
|
127
|
+
const savedParticipant = () => ListParticipantsModel.db.findOne({ _id: participantId });
|
|
128
|
+
it('cancels the own entry and records the member origin without sending an email', async () => {
|
|
129
|
+
const email = jest.spyOn(ListParticipantsService, 'sendStateAndAudienceAwareEmail');
|
|
130
|
+
const result = await ListParticipantsService.membersState(listId, options.user, 'canceled', options);
|
|
131
|
+
const saved = await savedParticipant();
|
|
132
|
+
const history = await HistoryModel.db.findOne({ 'history.parent': participantId });
|
|
133
|
+
expect(saved).toMatchObject({ state: 'canceled' });
|
|
134
|
+
expect(result).toMatchObject({ state: 'canceled' });
|
|
135
|
+
expect(history).toMatchObject({
|
|
136
|
+
state: 'canceled',
|
|
137
|
+
history: {
|
|
138
|
+
origin: 'member',
|
|
139
|
+
user: options.user,
|
|
140
|
+
app: options.app,
|
|
141
|
+
reason: 'change',
|
|
142
|
+
model: 'listParticipants',
|
|
143
|
+
version: 1,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
expect(email).not.toHaveBeenCalled();
|
|
147
|
+
});
|
|
148
|
+
it('never stores a previously canceled state back through admin states', async () => {
|
|
149
|
+
await expect(ListParticipantsService.membersState(listId, options.user, 'confirmed', options)).rejects.toThrow('VALIDATION_FAILED');
|
|
150
|
+
expect(await savedParticipant()).toMatchObject({ state: 'reserved' });
|
|
151
|
+
expect(await HistoryModel.db.countDocuments({})).toBe(0);
|
|
152
|
+
});
|
|
153
|
+
it('refuses to cancel or edit a blocked entry', async () => {
|
|
154
|
+
await ListParticipantsModel.db.updateOne({ _id: participantId }, { $set: { state: 'blocked' } });
|
|
155
|
+
await expect(ListParticipantsService.membersState(listId, options.user, 'canceled', options)).rejects.toThrow('VALIDATION_FAILED');
|
|
156
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'blue' }, options)).rejects.toThrow('VALIDATION_FAILED');
|
|
157
|
+
expect(await savedParticipant()).toMatchObject({ state: 'blocked' });
|
|
158
|
+
});
|
|
159
|
+
it('refuses to cancel or edit an already canceled entry', async () => {
|
|
160
|
+
await ListParticipantsModel.db.updateOne({ _id: participantId }, { $set: { state: 'canceled' } });
|
|
161
|
+
await expect(ListParticipantsService.membersState(listId, options.user, 'canceled', options)).rejects.toThrow('VALIDATION_FAILED');
|
|
162
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'blue' }, options)).rejects.toThrow('VALIDATION_FAILED');
|
|
163
|
+
expect(await savedParticipant()).toMatchObject({ state: 'canceled' });
|
|
164
|
+
expect(await savedParticipant()).not.toHaveProperty('s-string-1');
|
|
165
|
+
});
|
|
166
|
+
it('persists a structure answer without sending an email', async () => {
|
|
167
|
+
const email = jest.spyOn(ListParticipantsService, 'sendStateAndAudienceAwareEmail');
|
|
168
|
+
const result = await ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'blue' }, options);
|
|
169
|
+
const saved = await savedParticipant();
|
|
170
|
+
const history = await HistoryModel.db.findOne({ 'history.parent': participantId });
|
|
171
|
+
expect(saved).toMatchObject({ 's-string-1': 'blue' });
|
|
172
|
+
expect(result).toMatchObject({ 's-string-1': 'blue' });
|
|
173
|
+
expect(history?.history).toMatchObject({ origin: 'member', model: 'listParticipants' });
|
|
174
|
+
expect(email).not.toHaveBeenCalled();
|
|
175
|
+
});
|
|
176
|
+
it('rejects structure keys that are not part of the project structures', async () => {
|
|
177
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-unknown-1': 'x' }, options)).rejects.toThrow('VALIDATION_FAILED');
|
|
178
|
+
expect(await HistoryModel.db.countDocuments({})).toBe(0);
|
|
179
|
+
expect(await savedParticipant()).not.toHaveProperty('s-unknown-1');
|
|
180
|
+
});
|
|
181
|
+
it('rejects structure values that violate their validated type', async () => {
|
|
182
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-select-1': 'z' }, options)).rejects.toThrow('VALIDATION_FAILED');
|
|
183
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'x'.repeat(21) }, options)).rejects.toThrow('VALIDATION_FAILED');
|
|
184
|
+
expect(await HistoryModel.db.countDocuments({})).toBe(0);
|
|
185
|
+
});
|
|
186
|
+
it('rejects an empty structure update', async () => {
|
|
187
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, {}, options)).rejects.toThrow('VALIDATION_FAILED');
|
|
188
|
+
});
|
|
189
|
+
it('removes a previously set structure answer when it is omitted', async () => {
|
|
190
|
+
await ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'blue' }, options);
|
|
191
|
+
expect(await savedParticipant()).toMatchObject({ 's-string-1': 'blue' });
|
|
192
|
+
await ListParticipantsService.membersStructures(listId, options.user, { 's-select-1': 'a' }, options);
|
|
193
|
+
expect(await savedParticipant()).not.toHaveProperty('s-string-1');
|
|
194
|
+
});
|
|
195
|
+
it('does not store falsy structure values', async () => {
|
|
196
|
+
await ListParticipantsService.membersStructures(listId, options.user, { 's-bool-1': false, 's-number-1': 0 }, options);
|
|
197
|
+
const saved = await savedParticipant();
|
|
198
|
+
expect(saved).not.toHaveProperty('s-bool-1');
|
|
199
|
+
expect(saved).not.toHaveProperty('s-number-1');
|
|
200
|
+
});
|
|
201
|
+
it('rejects an entry that does not belong to the account', async () => {
|
|
202
|
+
await ListParticipantsModel.db.updateOne({ _id: participantId }, { $set: { user: new ObjectId() } });
|
|
203
|
+
await expect(ListParticipantsService.membersState(listId, options.user, 'canceled', options)).rejects.toThrow('PARTICIPANT_NOT_FOUND');
|
|
204
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'blue' }, options)).rejects.toThrow('PARTICIPANT_NOT_FOUND');
|
|
205
|
+
});
|
|
206
|
+
it('rejects when the account resolves to no customer', async () => {
|
|
207
|
+
await expect(ListParticipantsService.membersState(listId, 'unknown-account', 'canceled', options)).rejects.toThrow('CUSTOMER_NOT_FOUND');
|
|
208
|
+
});
|
|
209
|
+
it('accepts the self service flag in the list change schema', () => {
|
|
210
|
+
const listChange = {
|
|
211
|
+
name: 'Sommerfest',
|
|
212
|
+
categories: [{ _id: new ObjectId(), name: 'Standard', price: { amount: 0, currency: 'EUR' } }],
|
|
213
|
+
agreements: [{ contentId: 'agreement-1', text: 'Terms' }],
|
|
214
|
+
participants: { selfService: true },
|
|
215
|
+
};
|
|
216
|
+
expect(ListsModel.validate(listChange, 'change')).toBe(true);
|
|
217
|
+
expect(ListsModel.validate({ ...listChange, participants: { selfService: 'yes' } }, 'change')).toBe(false);
|
|
218
|
+
});
|
|
219
|
+
it('refuses member actions when the list does not enable self service', async () => {
|
|
220
|
+
await ListsModel.db.updateOne({ _id: listId }, { $set: { participants: {} } });
|
|
221
|
+
await expect(ListParticipantsService.membersState(listId, options.user, 'canceled', options)).rejects.toThrow('LIST_SELF_SERVICE_DISABLED');
|
|
222
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'blue' }, options)).rejects.toThrow('LIST_SELF_SERVICE_DISABLED');
|
|
223
|
+
expect(await savedParticipant()).toMatchObject({ state: 'reserved' });
|
|
224
|
+
expect(await HistoryModel.db.countDocuments({})).toBe(0);
|
|
225
|
+
});
|
|
226
|
+
it('refuses member actions when the list is missing', async () => {
|
|
227
|
+
await ListsModel.db.deleteOne({ _id: listId });
|
|
228
|
+
await expect(ListParticipantsService.membersState(listId, options.user, 'canceled', options)).rejects.toThrow('LIST_SELF_SERVICE_DISABLED');
|
|
229
|
+
await expect(ListParticipantsService.membersStructures(listId, options.user, { 's-string-1': 'blue' }, options)).rejects.toThrow('LIST_SELF_SERVICE_DISABLED');
|
|
230
|
+
});
|
|
231
|
+
it('frees a slot by excluding canceled entries from the category occupancy count', async () => {
|
|
232
|
+
const toArray = jest.fn().mockResolvedValue([]);
|
|
233
|
+
const aggregate = jest.fn().mockReturnValue({ toArray });
|
|
234
|
+
jest.spyOn(ListsModel, 'db', 'get').mockReturnValue({ aggregate });
|
|
235
|
+
await ListParticipantsService.hasOpenSlotForCategory(listId, 'cat-1', options);
|
|
236
|
+
const pipeline = aggregate.mock.calls[0][0];
|
|
237
|
+
const lookup = pipeline.find((stage) => stage.$lookup?.from === 'listParticipants');
|
|
238
|
+
expect(lookup.$lookup.pipeline[0].$match.state.$nin).toEqual(['blocked', 'notuseful', 'canceled']);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
//# sourceMappingURL=listParticipantsMembersSelfService.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listParticipantsMembersSelfService.spec.js","sourceRoot":"","sources":["../../tests/listParticipantsMembersSelfService.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jest, describe, it, expect, afterEach } from '@jest/globals';
|
|
2
|
+
import { ObjectId } from 'mongodb';
|
|
3
|
+
import listParticipantsService from '../src/services/listParticipants.service';
|
|
4
|
+
import ListParticipantsModel from '../src/models/listsParticipants.model';
|
|
5
|
+
const baseOptions = { skip: 0, limit: 20 };
|
|
6
|
+
describe('ListParticipantsService.getMyListsQuery', () => {
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
jest.restoreAllMocks();
|
|
9
|
+
});
|
|
10
|
+
const capturePipeline = () => {
|
|
11
|
+
const toArray = jest.fn().mockResolvedValue([]);
|
|
12
|
+
const aggregate = jest.fn().mockReturnValue({ toArray });
|
|
13
|
+
jest.spyOn(ListParticipantsModel, 'db', 'get').mockReturnValue({ aggregate });
|
|
14
|
+
return aggregate;
|
|
15
|
+
};
|
|
16
|
+
it('returns an empty result when there are no memberships', async () => {
|
|
17
|
+
const aggregate = capturePipeline();
|
|
18
|
+
const result = await listParticipantsService.getMyListsQuery(new ObjectId(), {}, baseOptions);
|
|
19
|
+
expect(result).toEqual({ all: 0, data: [], count: 0 });
|
|
20
|
+
expect(aggregate).toHaveBeenCalledTimes(1);
|
|
21
|
+
});
|
|
22
|
+
it('omits the list match stage when no filters are provided', async () => {
|
|
23
|
+
const aggregate = capturePipeline();
|
|
24
|
+
await listParticipantsService.getMyListsQuery(new ObjectId(), {}, baseOptions);
|
|
25
|
+
const pipeline = aggregate.mock.calls[0][0];
|
|
26
|
+
const hasListMatch = pipeline.some((stage) => stage.$match && ('listData.state' in stage.$match
|
|
27
|
+
|| 'listData.mode' in stage.$match
|
|
28
|
+
|| '$or' in stage.$match));
|
|
29
|
+
expect(hasListMatch).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it('filters by list name, state and mode', async () => {
|
|
32
|
+
const aggregate = capturePipeline();
|
|
33
|
+
await listParticipantsService.getMyListsQuery(new ObjectId(), { name: 'foo', state: 'open', mode: 'contact' }, baseOptions);
|
|
34
|
+
const pipeline = aggregate.mock.calls[0][0];
|
|
35
|
+
const listMatch = pipeline.find((stage) => stage.$match && 'listData.state' in stage.$match);
|
|
36
|
+
expect(listMatch).toEqual({
|
|
37
|
+
$match: {
|
|
38
|
+
'listData.state': 'open',
|
|
39
|
+
'listData.mode': 'contact',
|
|
40
|
+
$or: [
|
|
41
|
+
{ 'listData.name': { $regex: 'foo', $options: 'i' } },
|
|
42
|
+
{ 'listData.location': { $regex: 'foo', $options: 'i' } },
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('matches only the provided filter', async () => {
|
|
48
|
+
const aggregate = capturePipeline();
|
|
49
|
+
await listParticipantsService.getMyListsQuery(new ObjectId(), { state: 'closed' }, baseOptions);
|
|
50
|
+
const pipeline = aggregate.mock.calls[0][0];
|
|
51
|
+
const listMatch = pipeline.find((stage) => stage.$match && 'listData.state' in stage.$match);
|
|
52
|
+
expect(listMatch).toEqual({ $match: { 'listData.state': 'closed' } });
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=listParticipantsServiceGetMyLists.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listParticipantsServiceGetMyLists.spec.js","sourceRoot":"","sources":["../../tests/listParticipantsServiceGetMyLists.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lilaquadrat/studio",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "12.0.0",
|
|
4
4
|
"description": "classes and tools for STUDIO",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
},
|
|
119
119
|
"dependencies": {
|
|
120
120
|
"@google/genai": "^1.42.0",
|
|
121
|
-
"@lilaquadrat/interfaces": "^1.
|
|
121
|
+
"@lilaquadrat/interfaces": "^1.53.1",
|
|
122
122
|
"@lilaquadrat/storage-sdk": "^0.1.15",
|
|
123
123
|
"@nats-io/jetstream": "^3.2.0",
|
|
124
124
|
"@nats-io/transport-node": "^3.2.0",
|