@lilaquadrat/studio 11.5.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.
Files changed (48) hide show
  1. package/lib/src/Immutable.class.d.ts +5 -1
  2. package/lib/src/Immutable.class.js +16 -1
  3. package/lib/src/Immutable.class.js.map +1 -1
  4. package/lib/src/helpers/cacheHelper.js +4 -0
  5. package/lib/src/helpers/cacheHelper.js.map +1 -1
  6. package/lib/src/interfaces/Participant.d.ts +1 -1
  7. package/lib/src/interfaces/Participant.js +1 -1
  8. package/lib/src/interfaces/Participant.js.map +1 -1
  9. package/lib/src/models/customers.model.js +17 -0
  10. package/lib/src/models/customers.model.js.map +1 -1
  11. package/lib/src/models/history.model.js +25 -6
  12. package/lib/src/models/history.model.js.map +1 -1
  13. package/lib/src/models/lists.model.js +2 -0
  14. package/lib/src/models/lists.model.js.map +1 -1
  15. package/lib/src/models/listsParticipants.model.js +13 -3
  16. package/lib/src/models/listsParticipants.model.js.map +1 -1
  17. package/lib/src/services/customers.service.d.ts +2 -1
  18. package/lib/src/services/customers.service.js +33 -1
  19. package/lib/src/services/customers.service.js.map +1 -1
  20. package/lib/src/services/history.service.d.ts +4 -4
  21. package/lib/src/services/history.service.js +50 -53
  22. package/lib/src/services/history.service.js.map +1 -1
  23. package/lib/src/services/listParticipants.service.d.ts +16 -1
  24. package/lib/src/services/listParticipants.service.js +69 -10
  25. package/lib/src/services/listParticipants.service.js.map +1 -1
  26. package/lib/src/services/lists.service.js +4 -4
  27. package/lib/src/services/lists.service.js.map +1 -1
  28. package/lib/src/services/structures.service.d.ts +4 -0
  29. package/lib/src/services/structures.service.js +4 -1
  30. package/lib/src/services/structures.service.js.map +1 -1
  31. package/lib/tests/cacheHelper.spec.js +4 -0
  32. package/lib/tests/cacheHelper.spec.js.map +1 -1
  33. package/lib/tests/customersServiceUpdateMe.spec.d.ts +1 -0
  34. package/lib/tests/customersServiceUpdateMe.spec.js +276 -0
  35. package/lib/tests/customersServiceUpdateMe.spec.js.map +1 -0
  36. package/lib/tests/immutableClass.spec.d.ts +1 -0
  37. package/lib/tests/immutableClass.spec.js +552 -0
  38. package/lib/tests/immutableClass.spec.js.map +1 -0
  39. package/lib/tests/listParticipantsHistory.spec.d.ts +1 -0
  40. package/lib/tests/listParticipantsHistory.spec.js +90 -0
  41. package/lib/tests/listParticipantsHistory.spec.js.map +1 -0
  42. package/lib/tests/listParticipantsMembersSelfService.spec.d.ts +1 -0
  43. package/lib/tests/listParticipantsMembersSelfService.spec.js +241 -0
  44. package/lib/tests/listParticipantsMembersSelfService.spec.js.map +1 -0
  45. package/lib/tests/listParticipantsServiceGetMyLists.spec.d.ts +1 -0
  46. package/lib/tests/listParticipantsServiceGetMyLists.spec.js +55 -0
  47. package/lib/tests/listParticipantsServiceGetMyLists.spec.js.map +1 -0
  48. package/package.json +2 -2
@@ -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,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,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": "11.5.2",
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.51.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",