1import { sortBlocks, isOverlapping } from './helpers';
2
3// Number of blocks in data: 8.
4const overlapCaseData = {
5  blocks: [
6    {
7      compaction: {
8        level: 1,
9        sources: ['01EWZCKPP4K0WYRTZC9RPRM5QK'],
10      },
11      minTime: 1608034200000,
12      maxTime: 1608034500000,
13      stats: {
14        numSamples: 6634538,
15        numSeries: 2334,
16        numChunks: 51057,
17      },
18      thanos: {
19        downsample: {
20          resolution: 0,
21        },
22        labels: {
23          monitor: 'prometheus_one',
24        },
25        source: 'sidecar',
26      },
27      ulid: '01EWZCKPP4K0WYRTZC9RPRM5QK',
28      version: 1,
29    },
30
31    {
32      compaction: {
33        level: 1,
34        sources: ['01ESK5B1WQB6QEZQ4P0YCQXEC4'],
35      },
36      minTime: 1608034200000,
37      maxTime: 1608034500000,
38      stats: {
39        numSamples: 6634538,
40        numSeries: 2334,
41        numChunks: 51057,
42      },
43      thanos: {
44        downsample: {
45          resolution: 0,
46        },
47        labels: {
48          monitor: 'prometheus_one',
49        },
50        source: 'sidecar',
51      },
52      ulid: '01ESK5B1WQB6QEZQ4P0YCQXEC4',
53      version: 1,
54    },
55    {
56      compaction: {
57        level: 1,
58        sources: ['01ET8F8C73GGXH279R6YMTWFHY'],
59      },
60      minTime: 1608034500000,
61      maxTime: 1608034800000,
62      stats: {
63        numSamples: 6979750,
64        numSeries: 2333,
65        numChunks: 58325,
66      },
67      thanos: {
68        downsample: {
69          resolution: 0,
70        },
71        labels: {
72          monitor: 'prometheus_one',
73        },
74        source: 'sidecar',
75      },
76      ulid: '01ET8F8C73GGXH279R6YMTWFHY',
77      version: 1,
78    },
79    {
80      compaction: {
81        level: 1,
82        sources: ['01EWZCA2CFC5CPJE8CF9TXBW9H'],
83      },
84      minTime: 1608034500000,
85      maxTime: 1608034800000,
86      stats: {
87        numSamples: 6979750,
88        numSeries: 2333,
89        numChunks: 58325,
90      },
91      thanos: {
92        downsample: {
93          resolution: 0,
94        },
95        labels: {
96          monitor: 'prometheus_one',
97        },
98        source: 'sidecar',
99      },
100      ulid: '01EWZCA2CFC5CPJE8CF9TXBW9H',
101      version: 1,
102    },
103    {
104      compaction: {
105        level: 1,
106        sources: ['01EXYEAS52VZW5G1FPV4NPH2D1'],
107      },
108      minTime: 1608034500000,
109      maxTime: 1608034800000,
110      stats: {
111        numSamples: 6979750,
112        numSeries: 2333,
113        numChunks: 58325,
114      },
115      thanos: {
116        downsample: {
117          resolution: 0,
118        },
119        labels: {
120          monitor: 'prometheus_one',
121        },
122        source: 'sidecar',
123      },
124      ulid: '01EXYEAS52VZW5G1FPV4NPH2D1',
125      version: 1,
126    },
127    {
128      compaction: {
129        level: 1,
130        sources: ['01EWZCC9E998R19K8FKSTWP776'],
131      },
132      minTime: 1608034400000,
133      maxTime: 1608034700000,
134      stats: {
135        numSamples: 6979750,
136        numSeries: 2333,
137        numChunks: 58325,
138      },
139      thanos: {
140        downsample: {
141          resolution: 0,
142        },
143        labels: {
144          monitor: 'prometheus_one',
145        },
146        source: 'sidecar',
147      },
148      ulid: '01EWZCC9E998R19K8FKSTWP776',
149      version: 1,
150    },
151    {
152      compaction: {
153        level: 1,
154        sources: ['01EXYE0YB9JYCT48B6673H4YNS'],
155      },
156      minTime: 1608034600000,
157      maxTime: 1608034800000,
158      stats: {
159        numSamples: 6979750,
160        numSeries: 2333,
161        numChunks: 58325,
162      },
163      thanos: {
164        downsample: {
165          resolution: 0,
166        },
167        labels: {
168          monitor: 'prometheus_one',
169        },
170        source: 'sidecar',
171      },
172      ulid: '01EXYE0YB9JYCT48B6673H4YNS',
173      version: 1,
174    },
175    {
176      compaction: {
177        level: 1,
178        sources: ['01EEF8AGCHTPJ1MZ8KH0SEJZ4E'],
179      },
180      minTime: 1608034250000,
181      maxTime: 1608034350000,
182      stats: {
183        numSamples: 6979750,
184        numSeries: 2333,
185        numChunks: 58325,
186      },
187      thanos: {
188        downsample: {
189          resolution: 0,
190        },
191        labels: {
192          monitor: 'prometheus_one',
193        },
194        source: 'sidecar',
195      },
196      ulid: '01EEF8AGCHTPJ1MZ8KH0SEJZ4E',
197      version: 1,
198    },
199  ],
200  label: 'monitor',
201};
202
203const sorted = sortBlocks(overlapCaseData.blocks, overlapCaseData.label);
204const source = 'prometheus_one';
205
206describe('overlapping blocks', () => {
207  it('has 1 source', () => {
208    expect(Object.keys(sorted)).toHaveLength(1);
209  });
210
211  it('has 1 level-resolution', () => {
212    expect(Object.keys(sorted[source])).toHaveLength(1);
213  });
214
215  const rows = Object.values(sorted[source])[0];
216  it('has 5 rows', () => {
217    expect(rows).toHaveLength(5);
218  });
219
220  it('renders 2 blocks in first row', () => {
221    expect(rows[0]).toHaveLength(2);
222  });
223
224  it('renders 2 blocks in second row', () => {
225    expect(rows[1]).toHaveLength(2);
226  });
227
228  it('renders 2 blocks in third row', () => {
229    expect(rows[2]).toHaveLength(2);
230  });
231
232  it('renders 1 block in fourth row', () => {
233    expect(rows[3]).toHaveLength(1);
234  });
235
236  it('renders 1 block in fifth row', () => {
237    expect(rows[4]).toHaveLength(1);
238  });
239});
240
241describe('isOverlapping helper', () => {
242  const b = overlapCaseData.blocks[0];
243  it('should return true for perfectly overlapping blocks', () => {
244    expect(isOverlapping({ ...b, minTime: 10, maxTime: 20 }, { ...b, minTime: 10, maxTime: 20 })).toBe(true);
245  });
246
247  it('should return true for partially overlapping blocks', () => {
248    expect(isOverlapping({ ...b, minTime: 10, maxTime: 20 }, { ...b, minTime: 15, maxTime: 25 })).toBe(true);
249  });
250
251  it('should return false for non-overlapping blocks', () => {
252    expect(isOverlapping({ ...b, minTime: 10, maxTime: 20 }, { ...b, minTime: 30, maxTime: 40 })).toBe(false);
253  });
254
255  it('should return false if second block starts where first ends (a.maxTime == b.minTime)', () => {
256    expect(isOverlapping({ ...b, minTime: 10, maxTime: 20 }, { ...b, minTime: 20, maxTime: 30 })).toBe(false);
257  });
258});
259