@genspectrum/dashboard-components 1.12.0 → 1.13.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 (57) hide show
  1. package/README.md +0 -7
  2. package/custom-elements.json +6 -25
  3. package/dist/components.d.ts +30 -36
  4. package/dist/components.js +943 -757
  5. package/dist/components.js.map +1 -1
  6. package/dist/util.d.ts +46 -30
  7. package/package.json +1 -5
  8. package/src/lapisApi/lapisApi.ts +21 -1
  9. package/src/lapisApi/lapisTypes.ts +36 -0
  10. package/src/preact/components/annotated-mutation.tsx +2 -2
  11. package/src/preact/{mutationsOverTime/mutations-over-time-grid.tsx → components/features-over-time-grid.tsx} +45 -52
  12. package/src/preact/genomeViewer/genome-data-viewer.tsx +2 -2
  13. package/src/preact/mutationsOverTime/MutationOverTimeData.ts +6 -4
  14. package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay/aminoAcidMutations.json +5482 -0
  15. package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay/aminoAcidMutationsOverTime.json +5496 -0
  16. package/src/preact/mutationsOverTime/__mockData__/byWeek/mutationsOverTime.json +7100 -0
  17. package/src/preact/mutationsOverTime/__mockData__/byWeek/nucleotideMutations.json +10122 -0
  18. package/src/preact/mutationsOverTime/__mockData__/defaultMockData/mutationsOverTime.json +12646 -0
  19. package/src/preact/mutationsOverTime/__mockData__/defaultMockData/nucleotideMutations.json +12632 -0
  20. package/src/preact/mutationsOverTime/__mockData__/request1800s/mutationsOverTime.json +16 -0
  21. package/src/preact/mutationsOverTime/__mockData__/request1800s/nucleotideMutations.json +11 -0
  22. package/src/preact/mutationsOverTime/__mockData__/withDisplayMutations/mutationsOverTime.json +52 -0
  23. package/src/preact/mutationsOverTime/getFilteredMutationsOverTime.spec.ts +3 -3
  24. package/src/preact/mutationsOverTime/mutations-over-time-grid-tooltip.tsx +3 -6
  25. package/src/preact/mutationsOverTime/mutations-over-time.stories.tsx +199 -12
  26. package/src/preact/mutationsOverTime/mutations-over-time.tsx +30 -35
  27. package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.tsx +30 -3
  28. package/src/query/queryDatesInDataset.ts +89 -0
  29. package/src/query/queryMutationsOverTime.spec.ts +526 -548
  30. package/src/query/queryMutationsOverTime.ts +21 -232
  31. package/src/query/queryQueriesOverTime.spec.ts +432 -0
  32. package/src/query/queryQueriesOverTime.ts +125 -0
  33. package/src/utilEntrypoint.ts +3 -1
  34. package/src/utils/mutations.spec.ts +6 -0
  35. package/src/utils/mutations.ts +1 -1
  36. package/src/utils/temporalClass.ts +4 -0
  37. package/src/web-components/visualization/gs-mutations-over-time.spec-d.ts +0 -3
  38. package/src/web-components/visualization/gs-mutations-over-time.stories.ts +283 -17
  39. package/src/web-components/visualization/gs-mutations-over-time.tsx +0 -9
  40. package/standalone-bundle/dashboard-components.js +8935 -8781
  41. package/standalone-bundle/dashboard-components.js.map +1 -1
  42. package/dist/assets/mutationOverTimeWorker-f8Kp0S6V.js.map +0 -1
  43. package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay.ts +0 -47170
  44. package/src/preact/mutationsOverTime/__mockData__/byWeek.ts +0 -54026
  45. package/src/preact/mutationsOverTime/__mockData__/defaultMockData.ts +0 -108385
  46. package/src/preact/mutationsOverTime/__mockData__/mockConversion.ts +0 -54
  47. package/src/preact/mutationsOverTime/__mockData__/noDataWhenNoMutationsAreInFilter.ts +0 -23
  48. package/src/preact/mutationsOverTime/__mockData__/noDataWhenThereAreNoDatesInFilter.ts +0 -23
  49. package/src/preact/mutationsOverTime/__mockData__/showsMessageWhenTooManyMutations.ts +0 -65527
  50. package/src/preact/mutationsOverTime/__mockData__/withDisplayMutations.ts +0 -352
  51. package/src/preact/mutationsOverTime/__mockData__/withGaps.ts +0 -298
  52. package/src/preact/mutationsOverTime/mutationOverTimeWorker.mock.ts +0 -33
  53. package/src/preact/mutationsOverTime/mutationOverTimeWorker.ts +0 -29
  54. package/src/preact/webWorkers/useWebWorker.ts +0 -74
  55. package/src/preact/webWorkers/workerFunction.ts +0 -30
  56. package/src/query/queryMutationsOverTimeNewEndpoint.spec.ts +0 -988
  57. package/standalone-bundle/assets/mutationOverTimeWorker-AhhjjklP.js.map +0 -1
@@ -1,988 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- import { queryMutationsOverTimeData } from './queryMutationsOverTime';
4
- import { DUMMY_LAPIS_URL, lapisRequestMocks } from '../../vitest.setup';
5
-
6
- describe('queryMutationsOverTimeNewEndpoint', () => {
7
- it('should fetch for a filter without date and sort by mutation and date', async () => {
8
- const lapisFilter = { field1: 'value1', field2: 'value2' };
9
- const dateField = 'dateField';
10
-
11
- lapisRequestMocks.aggregated(
12
- { ...lapisFilter, fields: [dateField] },
13
- {
14
- data: [
15
- { count: 1, [dateField]: '2023-01-01' },
16
- { count: 2, [dateField]: '2023-01-03' },
17
- ],
18
- },
19
- );
20
- lapisRequestMocks.multipleMutations(
21
- [
22
- {
23
- body: {
24
- ...lapisFilter,
25
- dateFieldFrom: '2023-01-01',
26
- dateFieldTo: '2023-01-03',
27
- minProportion: 0.001,
28
- },
29
- response: {
30
- data: [getSomeTestMutation(0.21, 6), getSomeOtherTestMutation(0.22, 4)],
31
- },
32
- },
33
- ],
34
- 'nucleotide',
35
- );
36
- const dateRanges = [
37
- {
38
- dateFrom: '2023-01-01',
39
- dateTo: '2023-01-01',
40
- },
41
- {
42
- dateFrom: '2023-01-02',
43
- dateTo: '2023-01-02',
44
- },
45
- {
46
- dateFrom: '2023-01-03',
47
- dateTo: '2023-01-03',
48
- },
49
- ];
50
- lapisRequestMocks.mutationsOverTime(
51
- [
52
- {
53
- body: {
54
- filters: lapisFilter,
55
- dateRanges,
56
- includeMutations: ['otherSequenceName:G234C', 'sequenceName:A123T'],
57
- dateField,
58
- },
59
- response: {
60
- data: {
61
- data: [
62
- [
63
- { count: 4, coverage: 10 },
64
- { count: 0, coverage: 10 },
65
- { count: 0, coverage: 10 },
66
- ],
67
- [
68
- { count: 1, coverage: 10 },
69
- { count: 2, coverage: 10 },
70
- { count: 3, coverage: 10 },
71
- ],
72
- ],
73
- dateRanges,
74
- mutations: ['otherSequenceName:G234C', 'sequenceName:A123T'],
75
- totalCountsByDateRange: [11, 12, 13],
76
- },
77
- },
78
- },
79
- ],
80
- 'nucleotide',
81
- );
82
-
83
- const { mutationOverTimeData, overallMutationData } = await queryMutationsOverTimeData({
84
- lapisFilter,
85
- sequenceType: 'nucleotide',
86
- lapis: DUMMY_LAPIS_URL,
87
- lapisDateField: dateField,
88
- granularity: 'day',
89
- useNewEndpoint: true,
90
- });
91
-
92
- const expectedData = [
93
- [
94
- { type: 'valueWithCoverage', count: 4, coverage: 10, totalCount: 11 },
95
- { type: 'valueWithCoverage', count: 0, coverage: 10, totalCount: 12 },
96
- { type: 'valueWithCoverage', count: 0, coverage: 10, totalCount: 13 },
97
- ],
98
- [
99
- { type: 'valueWithCoverage', count: 1, coverage: 10, totalCount: 11 },
100
- { type: 'valueWithCoverage', count: 2, coverage: 10, totalCount: 12 },
101
- { type: 'valueWithCoverage', count: 3, coverage: 10, totalCount: 13 },
102
- ],
103
- ];
104
- expect(mutationOverTimeData.getAsArray()).to.deep.equal(expectedData);
105
-
106
- const sequences = mutationOverTimeData.getFirstAxisKeys();
107
- expect(sequences[0].code).toBe('otherSequenceName:G234C');
108
- expect(sequences[1].code).toBe('sequenceName:A123T');
109
-
110
- const dates = mutationOverTimeData.getSecondAxisKeys();
111
- expect(dates[0].dateString).toBe('2023-01-01');
112
- expect(dates[1].dateString).toBe('2023-01-02');
113
- expect(dates[2].dateString).toBe('2023-01-03');
114
-
115
- expect(overallMutationData).to.deep.equal([
116
- {
117
- type: 'substitution',
118
- mutation: {
119
- valueAtReference: 'G',
120
- substitutionValue: 'C',
121
- position: 234,
122
- segment: 'otherSequenceName',
123
- code: 'otherSequenceName:G234C',
124
- type: 'substitution',
125
- },
126
- count: 4,
127
- proportion: 0.22,
128
- },
129
- {
130
- type: 'substitution',
131
- mutation: {
132
- valueAtReference: 'A',
133
- substitutionValue: 'T',
134
- position: 123,
135
- segment: 'sequenceName',
136
- code: 'sequenceName:A123T',
137
- type: 'substitution',
138
- },
139
- count: 6,
140
- proportion: 0.21,
141
- },
142
- ]);
143
- });
144
-
145
- it('should fetch for dates with no mutations', async () => {
146
- const lapisFilter = { field1: 'value1', field2: 'value2' };
147
- const dateField = 'dateField';
148
-
149
- lapisRequestMocks.aggregated(
150
- { ...lapisFilter, fields: [dateField] },
151
- {
152
- data: [
153
- { count: 1, [dateField]: '2023-01-01' },
154
- { count: 2, [dateField]: '2023-01-03' },
155
- ],
156
- },
157
- );
158
-
159
- lapisRequestMocks.multipleMutations(
160
- [
161
- {
162
- body: {
163
- ...lapisFilter,
164
- dateFieldFrom: '2023-01-01',
165
- dateFieldTo: '2023-01-03',
166
- minProportion: 0.001,
167
- },
168
- response: {
169
- data: [getSomeTestMutation(0.2, 4), getSomeOtherTestMutation(0.4, 4)],
170
- },
171
- },
172
- ],
173
- 'nucleotide',
174
- );
175
-
176
- const dateRanges = [
177
- {
178
- dateFrom: '2023-01-01',
179
- dateTo: '2023-01-01',
180
- },
181
- {
182
- dateFrom: '2023-01-02',
183
- dateTo: '2023-01-02',
184
- },
185
- {
186
- dateFrom: '2023-01-03',
187
- dateTo: '2023-01-03',
188
- },
189
- ];
190
-
191
- lapisRequestMocks.mutationsOverTime(
192
- [
193
- {
194
- body: {
195
- filters: lapisFilter,
196
- dateRanges,
197
- includeMutations: ['otherSequenceName:G234C', 'sequenceName:A123T'],
198
- dateField,
199
- },
200
- response: {
201
- data: {
202
- data: [
203
- [
204
- { count: 4, coverage: 10 },
205
- { count: 0, coverage: 10 },
206
- { count: 0, coverage: 10 },
207
- ],
208
- [
209
- { count: 1, coverage: 10 },
210
- { count: 0, coverage: 10 },
211
- { count: 3, coverage: 10 },
212
- ],
213
- ],
214
- dateRanges,
215
- mutations: ['otherSequenceName:G234C', 'sequenceName:A123T'],
216
- totalCountsByDateRange: [11, 0, 13],
217
- },
218
- },
219
- },
220
- ],
221
- 'nucleotide',
222
- );
223
-
224
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
225
- lapisFilter,
226
- sequenceType: 'nucleotide',
227
- lapis: DUMMY_LAPIS_URL,
228
- lapisDateField: dateField,
229
- granularity: 'day',
230
- useNewEndpoint: true,
231
- });
232
-
233
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([
234
- [
235
- { type: 'valueWithCoverage', count: 4, coverage: 10, totalCount: 11 },
236
- null,
237
- { type: 'valueWithCoverage', count: 0, coverage: 10, totalCount: 13 },
238
- ],
239
- [
240
- { type: 'valueWithCoverage', count: 1, coverage: 10, totalCount: 11 },
241
- null,
242
- { type: 'valueWithCoverage', count: 3, coverage: 10, totalCount: 13 },
243
- ],
244
- ]);
245
-
246
- const sequences = mutationOverTimeData.getFirstAxisKeys();
247
- expect(sequences[0].code).toBe('otherSequenceName:G234C');
248
- expect(sequences[1].code).toBe('sequenceName:A123T');
249
-
250
- const dates = mutationOverTimeData.getSecondAxisKeys();
251
- expect(dates[0].dateString).toBe('2023-01-01');
252
- expect(dates[1].dateString).toBe('2023-01-02');
253
- expect(dates[2].dateString).toBe('2023-01-03');
254
- });
255
-
256
- it('should return empty map when no mutations are found', async () => {
257
- const lapisFilter = { field1: 'value1', field2: 'value2' };
258
- const dateField = 'dateField';
259
-
260
- lapisRequestMocks.aggregated(
261
- { ...lapisFilter, fields: [dateField] },
262
- {
263
- data: [
264
- { count: 1, [dateField]: '2023-01-01' },
265
- { count: 2, [dateField]: '2023-01-03' },
266
- ],
267
- },
268
- );
269
-
270
- lapisRequestMocks.multipleMutations(
271
- [
272
- {
273
- body: {
274
- ...lapisFilter,
275
- dateFieldFrom: '2023-01-01',
276
- dateFieldTo: '2023-01-03',
277
- minProportion: 0.001,
278
- },
279
- response: {
280
- data: [],
281
- },
282
- },
283
- ],
284
- 'nucleotide',
285
- );
286
-
287
- const dateRanges = [
288
- {
289
- dateFrom: '2023-01-01',
290
- dateTo: '2023-01-01',
291
- },
292
- {
293
- dateFrom: '2023-01-02',
294
- dateTo: '2023-01-02',
295
- },
296
- {
297
- dateFrom: '2023-01-03',
298
- dateTo: '2023-01-03',
299
- },
300
- ];
301
-
302
- lapisRequestMocks.mutationsOverTime(
303
- [
304
- {
305
- body: {
306
- filters: lapisFilter,
307
- dateRanges,
308
- includeMutations: [],
309
- dateField,
310
- },
311
- response: {
312
- data: {
313
- data: [],
314
- dateRanges,
315
- mutations: [],
316
- totalCountsByDateRange: [],
317
- },
318
- },
319
- },
320
- ],
321
- 'nucleotide',
322
- );
323
-
324
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
325
- lapisFilter,
326
- sequenceType: 'nucleotide',
327
- lapis: DUMMY_LAPIS_URL,
328
- lapisDateField: dateField,
329
- granularity: 'day',
330
- useNewEndpoint: true,
331
- });
332
-
333
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([]);
334
- expect(mutationOverTimeData.getFirstAxisKeys()).to.deep.equal([]);
335
- const dates = mutationOverTimeData.getSecondAxisKeys();
336
- expect(dates.length).toBe(3);
337
- expect(dates[0].dateString).toBe('2023-01-01');
338
- expect(dates[1].dateString).toBe('2023-01-02');
339
- expect(dates[2].dateString).toBe('2023-01-03');
340
- });
341
-
342
- it('should use dateFrom from filter', async () => {
343
- const dateField = 'dateField';
344
- const lapisFilter = { field1: 'value1', field2: 'value2', [`${dateField}From`]: '2023-01-02' };
345
-
346
- lapisRequestMocks.aggregated(
347
- { ...lapisFilter, fields: [dateField] },
348
- {
349
- data: [
350
- { count: 1, [dateField]: '2023-01-01' },
351
- { count: 2, [dateField]: '2023-01-03' },
352
- ],
353
- },
354
- );
355
-
356
- lapisRequestMocks.multipleMutations(
357
- [
358
- {
359
- body: {
360
- ...lapisFilter,
361
- dateFieldFrom: '2023-01-02',
362
- dateFieldTo: '2023-01-03',
363
- minProportion: 0.001,
364
- },
365
- response: {
366
- data: [getSomeTestMutation(0.25, 5)],
367
- },
368
- },
369
- ],
370
- 'nucleotide',
371
- );
372
-
373
- const dateRanges = [
374
- {
375
- dateFrom: '2023-01-02',
376
- dateTo: '2023-01-02',
377
- },
378
- {
379
- dateFrom: '2023-01-03',
380
- dateTo: '2023-01-03',
381
- },
382
- ];
383
-
384
- lapisRequestMocks.mutationsOverTime(
385
- [
386
- {
387
- body: {
388
- filters: lapisFilter,
389
- dateRanges,
390
- includeMutations: ['sequenceName:A123T'],
391
- dateField,
392
- },
393
- response: {
394
- data: {
395
- data: [
396
- [
397
- { count: 2, coverage: 10 },
398
- { count: 3, coverage: 10 },
399
- ],
400
- ],
401
- dateRanges,
402
- mutations: ['sequenceName:A123T'],
403
- totalCountsByDateRange: [11, 12],
404
- },
405
- },
406
- },
407
- ],
408
- 'nucleotide',
409
- );
410
-
411
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
412
- lapisFilter,
413
- sequenceType: 'nucleotide',
414
- lapis: DUMMY_LAPIS_URL,
415
- lapisDateField: dateField,
416
- granularity: 'day',
417
- useNewEndpoint: true,
418
- });
419
-
420
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([
421
- [
422
- { type: 'valueWithCoverage', count: 2, coverage: 10, totalCount: 11 },
423
- { type: 'valueWithCoverage', count: 3, coverage: 10, totalCount: 12 },
424
- ],
425
- ]);
426
-
427
- const sequences = mutationOverTimeData.getFirstAxisKeys();
428
- expect(sequences[0].code).toBe('sequenceName:A123T');
429
-
430
- const dates = mutationOverTimeData.getSecondAxisKeys();
431
- expect(dates[0].dateString).toBe('2023-01-02');
432
- expect(dates[1].dateString).toBe('2023-01-03');
433
- });
434
-
435
- it('should use dateTo from filter', async () => {
436
- const dateField = 'dateField';
437
- const lapisFilter = { field1: 'value1', field2: 'value2', [`${dateField}To`]: '2023-01-02' };
438
-
439
- lapisRequestMocks.aggregated(
440
- { ...lapisFilter, fields: [dateField] },
441
- {
442
- data: [
443
- { count: 1, [dateField]: '2023-01-01' },
444
- { count: 2, [dateField]: '2023-01-03' },
445
- ],
446
- },
447
- );
448
-
449
- lapisRequestMocks.multipleMutations(
450
- [
451
- {
452
- body: {
453
- ...lapisFilter,
454
- dateFieldFrom: '2023-01-01',
455
- dateFieldTo: '2023-01-02',
456
- minProportion: 0.001,
457
- },
458
- response: {
459
- data: [getSomeTestMutation(0.15, 3)],
460
- },
461
- },
462
- ],
463
- 'nucleotide',
464
- );
465
-
466
- const dateRanges = [
467
- {
468
- dateFrom: '2023-01-01',
469
- dateTo: '2023-01-01',
470
- },
471
- {
472
- dateFrom: '2023-01-02',
473
- dateTo: '2023-01-02',
474
- },
475
- ];
476
-
477
- lapisRequestMocks.mutationsOverTime(
478
- [
479
- {
480
- body: {
481
- filters: lapisFilter,
482
- dateRanges,
483
- includeMutations: ['sequenceName:A123T'],
484
- dateField,
485
- },
486
- response: {
487
- data: {
488
- data: [
489
- [
490
- { count: 1, coverage: 10 },
491
- { count: 2, coverage: 10 },
492
- ],
493
- ],
494
- dateRanges,
495
- mutations: ['sequenceName:A123T'],
496
- totalCountsByDateRange: [11, 12],
497
- },
498
- },
499
- },
500
- ],
501
- 'nucleotide',
502
- );
503
-
504
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
505
- lapisFilter,
506
- sequenceType: 'nucleotide',
507
- lapis: DUMMY_LAPIS_URL,
508
- lapisDateField: dateField,
509
- granularity: 'day',
510
- useNewEndpoint: true,
511
- });
512
-
513
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([
514
- [
515
- { type: 'valueWithCoverage', count: 1, coverage: 10, totalCount: 11 },
516
- { type: 'valueWithCoverage', count: 2, coverage: 10, totalCount: 12 },
517
- ],
518
- ]);
519
-
520
- const sequences = mutationOverTimeData.getFirstAxisKeys();
521
- expect(sequences[0].code).toBe('sequenceName:A123T');
522
-
523
- const dates = mutationOverTimeData.getSecondAxisKeys();
524
- expect(dates[0].dateString).toBe('2023-01-01');
525
- expect(dates[1].dateString).toBe('2023-01-02');
526
- });
527
-
528
- it('should use date from filter', async () => {
529
- const dateField = 'dateField';
530
- const lapisFilter = { field1: 'value1', field2: 'value2', [dateField]: '2023-01-02' };
531
-
532
- lapisRequestMocks.aggregated(
533
- { ...lapisFilter, fields: [dateField] },
534
- {
535
- data: [
536
- { count: 1, [dateField]: '2023-01-01' },
537
- { count: 2, [dateField]: '2023-01-03' },
538
- ],
539
- },
540
- );
541
-
542
- lapisRequestMocks.multipleMutations(
543
- [
544
- {
545
- body: {
546
- ...lapisFilter,
547
- dateFieldFrom: '2023-01-02',
548
- dateFieldTo: '2023-01-02',
549
- minProportion: 0.001,
550
- },
551
- response: { data: [getSomeTestMutation(0.2, 2)] },
552
- },
553
- ],
554
- 'nucleotide',
555
- );
556
-
557
- const dateRanges = [
558
- {
559
- dateFrom: '2023-01-02',
560
- dateTo: '2023-01-02',
561
- },
562
- ];
563
-
564
- lapisRequestMocks.mutationsOverTime(
565
- [
566
- {
567
- body: {
568
- filters: lapisFilter,
569
- dateRanges,
570
- includeMutations: ['sequenceName:A123T'],
571
- dateField,
572
- },
573
- response: {
574
- data: {
575
- data: [[{ count: 2, coverage: 10 }]],
576
- dateRanges,
577
- mutations: ['sequenceName:A123T'],
578
- totalCountsByDateRange: [11],
579
- },
580
- },
581
- },
582
- ],
583
- 'nucleotide',
584
- );
585
-
586
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
587
- lapisFilter,
588
- sequenceType: 'nucleotide',
589
- lapis: DUMMY_LAPIS_URL,
590
- lapisDateField: dateField,
591
- granularity: 'day',
592
- useNewEndpoint: true,
593
- });
594
-
595
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([
596
- [{ type: 'valueWithCoverage', count: 2, coverage: 10, totalCount: 11 }],
597
- ]);
598
-
599
- const sequences = mutationOverTimeData.getFirstAxisKeys();
600
- expect(sequences[0].code).toBe('sequenceName:A123T');
601
-
602
- const dates = mutationOverTimeData.getSecondAxisKeys();
603
- expect(dates[0].dateString).toBe('2023-01-02');
604
- });
605
-
606
- it('should fetch data including the first and last day of the granularity', async () => {
607
- const lapisFilter = { field1: 'value1', field2: 'value2' };
608
- const dateField = 'dateField';
609
-
610
- lapisRequestMocks.aggregated(
611
- { ...lapisFilter, fields: [dateField] },
612
- {
613
- data: [
614
- { count: 1, [dateField]: '2023-01-05' },
615
- { count: 2, [dateField]: '2023-02-15' },
616
- ],
617
- },
618
- );
619
-
620
- lapisRequestMocks.multipleMutations(
621
- [
622
- {
623
- body: {
624
- ...lapisFilter,
625
- dateFieldFrom: '2023-01-01',
626
- dateFieldTo: '2023-02-28',
627
- minProportion: 0.001,
628
- },
629
- response: {
630
- data: [getSomeTestMutation(0.21, 6), getSomeOtherTestMutation(0.22, 4)],
631
- },
632
- },
633
- ],
634
- 'nucleotide',
635
- );
636
-
637
- const dateRanges = [
638
- {
639
- dateFrom: '2023-01-01',
640
- dateTo: '2023-01-31',
641
- },
642
- {
643
- dateFrom: '2023-02-01',
644
- dateTo: '2023-02-28',
645
- },
646
- ];
647
-
648
- lapisRequestMocks.mutationsOverTime(
649
- [
650
- {
651
- body: {
652
- filters: lapisFilter,
653
- dateRanges,
654
- includeMutations: ['otherSequenceName:G234C', 'sequenceName:A123T'],
655
- dateField,
656
- },
657
- response: {
658
- data: {
659
- data: [
660
- [
661
- { count: 2, coverage: 10 },
662
- { count: 3, coverage: 10 },
663
- ],
664
- [
665
- { count: 4, coverage: 10 },
666
- { count: 5, coverage: 10 },
667
- ],
668
- ],
669
- dateRanges,
670
- mutations: ['otherSequenceName:G234C', 'sequenceName:A123T'],
671
- totalCountsByDateRange: [11, 12],
672
- },
673
- },
674
- },
675
- ],
676
- 'nucleotide',
677
- );
678
-
679
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
680
- lapisFilter,
681
- sequenceType: 'nucleotide',
682
- lapis: DUMMY_LAPIS_URL,
683
- lapisDateField: dateField,
684
- granularity: 'month',
685
- useNewEndpoint: true,
686
- });
687
-
688
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([
689
- [
690
- { type: 'valueWithCoverage', count: 2, coverage: 10, totalCount: 11 },
691
- { type: 'valueWithCoverage', count: 3, coverage: 10, totalCount: 12 },
692
- ],
693
- [
694
- { type: 'valueWithCoverage', count: 4, coverage: 10, totalCount: 11 },
695
- { type: 'valueWithCoverage', count: 5, coverage: 10, totalCount: 12 },
696
- ],
697
- ]);
698
-
699
- const sequences = mutationOverTimeData.getFirstAxisKeys();
700
- expect(sequences[0].code).toBe('otherSequenceName:G234C');
701
- expect(sequences[1].code).toBe('sequenceName:A123T');
702
-
703
- const dates = mutationOverTimeData.getSecondAxisKeys();
704
- expect(dates[0].dateString).toBe('2023-01');
705
- expect(dates[1].dateString).toBe('2023-02');
706
- });
707
-
708
- it('should return empty data when there are no dates in filter', async () => {
709
- const lapisFilter = { field1: 'value1', field2: 'value2' };
710
- const dateField = 'dateField';
711
-
712
- lapisRequestMocks.aggregated(
713
- { ...lapisFilter, fields: [dateField] },
714
- {
715
- data: [],
716
- },
717
- );
718
-
719
- lapisRequestMocks.mutationsOverTime(
720
- [
721
- {
722
- body: {
723
- filters: lapisFilter,
724
- dateRanges: [],
725
- includeMutations: [],
726
- dateField,
727
- },
728
- response: {
729
- data: {
730
- data: [],
731
- dateRanges: [],
732
- mutations: [],
733
- totalCountsByDateRange: [],
734
- },
735
- },
736
- },
737
- ],
738
- 'nucleotide',
739
- );
740
-
741
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
742
- lapisFilter,
743
- sequenceType: 'nucleotide',
744
- lapis: DUMMY_LAPIS_URL,
745
- lapisDateField: dateField,
746
- granularity: 'month',
747
- useNewEndpoint: true,
748
- });
749
-
750
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([]);
751
-
752
- const sequences = mutationOverTimeData.getFirstAxisKeys();
753
- expect(sequences.length).toBe(0);
754
-
755
- const dates = mutationOverTimeData.getSecondAxisKeys();
756
- expect(dates.length).toBe(0);
757
- });
758
-
759
- it('should respect the includeMutations parameter', async () => {
760
- const lapisFilter = { field1: 'value1', field2: 'value2' };
761
- const dateField = 'dateField';
762
-
763
- lapisRequestMocks.aggregated(
764
- { ...lapisFilter, fields: [dateField] },
765
- {
766
- data: [
767
- { count: 1, [dateField]: '2023-01-05' },
768
- { count: 2, [dateField]: '2023-02-15' },
769
- ],
770
- },
771
- );
772
-
773
- lapisRequestMocks.multipleMutations(
774
- [
775
- {
776
- body: {
777
- ...lapisFilter,
778
- dateFieldFrom: '2023-01-01',
779
- dateFieldTo: '2023-02-28',
780
- minProportion: 0.001,
781
- },
782
- response: {
783
- data: [getSomeTestMutation(0.21, 6), getSomeOtherTestMutation(0.22, 4)],
784
- },
785
- },
786
- ],
787
- 'nucleotide',
788
- );
789
-
790
- const dateRanges = [
791
- {
792
- dateFrom: '2023-01-01',
793
- dateTo: '2023-01-31',
794
- },
795
- {
796
- dateFrom: '2023-02-01',
797
- dateTo: '2023-02-28',
798
- },
799
- ];
800
-
801
- lapisRequestMocks.mutationsOverTime(
802
- [
803
- {
804
- body: {
805
- filters: lapisFilter,
806
- dateRanges,
807
- includeMutations: ['A122T', 'otherSequenceName:G234C'],
808
- dateField,
809
- },
810
- response: {
811
- data: {
812
- data: [
813
- [
814
- { count: 0, coverage: 0 },
815
- { count: 0, coverage: 0 },
816
- ],
817
- [
818
- { count: 2, coverage: 10 },
819
- { count: 3, coverage: 10 },
820
- ],
821
- ],
822
- dateRanges,
823
- mutations: ['A122T', 'otherSequenceName:G234C'],
824
- totalCountsByDateRange: [11, 12],
825
- },
826
- },
827
- },
828
- ],
829
- 'nucleotide',
830
- );
831
-
832
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
833
- lapisFilter,
834
- sequenceType: 'nucleotide',
835
- lapis: DUMMY_LAPIS_URL,
836
- lapisDateField: dateField,
837
- granularity: 'month',
838
- useNewEndpoint: true,
839
- displayMutations: ['otherSequenceName:G234C', 'A122T'],
840
- });
841
-
842
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([
843
- [
844
- { type: 'belowThreshold', totalCount: 11 },
845
- { type: 'belowThreshold', totalCount: 12 },
846
- ],
847
- [
848
- { type: 'valueWithCoverage', count: 2, coverage: 10, totalCount: 11 },
849
- { type: 'valueWithCoverage', count: 3, coverage: 10, totalCount: 12 },
850
- ],
851
- ]);
852
-
853
- const sequences = mutationOverTimeData.getFirstAxisKeys();
854
- expect(sequences[0].code).toBe('A122T');
855
- expect(sequences[1].code).toBe('otherSequenceName:G234C');
856
-
857
- const dates = mutationOverTimeData.getSecondAxisKeys();
858
- expect(dates[0].dateString).toBe('2023-01');
859
- expect(dates[1].dateString).toBe('2023-02');
860
- });
861
-
862
- it('should return full mutation codes even if partial includeMutations are given', async () => {
863
- const lapisFilter = { field1: 'value1', field2: 'value2' };
864
- const dateField = 'dateField';
865
-
866
- lapisRequestMocks.aggregated(
867
- { ...lapisFilter, fields: [dateField] },
868
- {
869
- data: [
870
- { count: 1, [dateField]: '2023-01-05' },
871
- { count: 2, [dateField]: '2023-02-15' },
872
- ],
873
- },
874
- );
875
-
876
- lapisRequestMocks.multipleMutations(
877
- [
878
- {
879
- body: {
880
- ...lapisFilter,
881
- dateFieldFrom: '2023-01-01',
882
- dateFieldTo: '2023-02-28',
883
- minProportion: 0.001,
884
- },
885
- response: {
886
- data: [getSomeTestMutation(0.21, 6), getSomeOtherTestMutation(0.22, 4)],
887
- },
888
- },
889
- ],
890
- 'nucleotide',
891
- );
892
-
893
- const dateRanges = [
894
- {
895
- dateFrom: '2023-01-01',
896
- dateTo: '2023-01-31',
897
- },
898
- {
899
- dateFrom: '2023-02-01',
900
- dateTo: '2023-02-28',
901
- },
902
- ];
903
-
904
- lapisRequestMocks.mutationsOverTime(
905
- [
906
- {
907
- body: {
908
- filters: lapisFilter,
909
- dateRanges,
910
- includeMutations: ['122', 'otherSequenceName:G234C'],
911
- dateField,
912
- },
913
- response: {
914
- data: {
915
- data: [
916
- [
917
- { count: 0, coverage: 0 },
918
- { count: 0, coverage: 0 },
919
- ],
920
- [
921
- { count: 2, coverage: 10 },
922
- { count: 3, coverage: 10 },
923
- ],
924
- ],
925
- dateRanges,
926
- mutations: ['A122T', 'otherSequenceName:G234C'],
927
- totalCountsByDateRange: [11, 12],
928
- },
929
- },
930
- },
931
- ],
932
- 'nucleotide',
933
- );
934
-
935
- const { mutationOverTimeData } = await queryMutationsOverTimeData({
936
- lapisFilter,
937
- sequenceType: 'nucleotide',
938
- lapis: DUMMY_LAPIS_URL,
939
- lapisDateField: dateField,
940
- granularity: 'month',
941
- useNewEndpoint: true,
942
- displayMutations: ['otherSequenceName:G234C', '122'],
943
- });
944
-
945
- expect(mutationOverTimeData.getAsArray()).to.deep.equal([
946
- [
947
- { type: 'belowThreshold', totalCount: 11 },
948
- { type: 'belowThreshold', totalCount: 12 },
949
- ],
950
- [
951
- { type: 'valueWithCoverage', count: 2, coverage: 10, totalCount: 11 },
952
- { type: 'valueWithCoverage', count: 3, coverage: 10, totalCount: 12 },
953
- ],
954
- ]);
955
-
956
- const sequences = mutationOverTimeData.getFirstAxisKeys();
957
- expect(sequences[0].code).toBe('A122T');
958
- expect(sequences[1].code).toBe('otherSequenceName:G234C');
959
-
960
- const dates = mutationOverTimeData.getSecondAxisKeys();
961
- expect(dates[0].dateString).toBe('2023-01');
962
- expect(dates[1].dateString).toBe('2023-02');
963
- });
964
-
965
- function getSomeTestMutation(proportion: number, count: number) {
966
- return {
967
- mutation: 'sequenceName:A123T',
968
- proportion,
969
- count,
970
- sequenceName: 'sequenceName',
971
- mutationFrom: 'A',
972
- mutationTo: 'T',
973
- position: 123,
974
- };
975
- }
976
-
977
- function getSomeOtherTestMutation(proportion: number, count: number) {
978
- return {
979
- mutation: 'otherSequenceName:G234C',
980
- proportion,
981
- count,
982
- sequenceName: 'otherSequenceName',
983
- mutationFrom: 'G',
984
- mutationTo: 'C',
985
- position: 234,
986
- };
987
- }
988
- });