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