Skip to content

Commit 33a6092

Browse files
committed
[O2B-1506] Run duration filter tests + backend
1 parent 7fade60 commit 33a6092

5 files changed

Lines changed: 79 additions & 7 deletions

File tree

lib/domain/dtos/filters/LhcFillsFilterDto.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ exports.LhcFillsFilterDto = Joi.object({
2323
'any.invalid': '{{#message}}',
2424
}),
2525
beamDurationOperator: Joi.string().trim().min(1).max(2),
26+
runDuration: Joi.string().trim().min(8).max(8).custom(validateTime).messages({
27+
'any.invalid': '{{#message}}',
28+
}),
29+
runDurationOperator: Joi.string().trim().min(1).max(2),
2630
});

lib/public/views/LhcFills/ActiveColumns/lhcFillsActiveColumns.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,17 +140,17 @@ export const lhcFillsActiveColumns = {
140140
visible: true,
141141
size: 'w-8',
142142
format: (duration) => formatDuration(duration),
143-
filter: (lhcFillModel) => runDurationFilter(
144-
lhcFillModel.filteringModel.get('runDuration'),
145-
lhcFillModel.getRunDurationOperator(),
146-
(value) => lhcFillModel.setRunDurationOperator(value),
147-
),
148143
},
149144
runsCoverage: {
150145
name: 'Total runs duration',
151146
visible: true,
152147
size: 'w-8',
153148
format: (duration) => formatDuration(duration),
149+
filter: (lhcFillModel) => runDurationFilter(
150+
lhcFillModel.filteringModel.get('runDuration'),
151+
lhcFillModel.getRunDurationOperator(),
152+
(value) => lhcFillModel.setRunDurationOperator(value),
153+
),
154154
},
155155
efficiency: {
156156
name: 'Fill Efficiency',

lib/usecases/lhcFill/GetAllLhcFillsUseCase.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ class GetAllLhcFillsUseCase {
4242

4343
const queryBuilder = new QueryBuilder();
4444

45+
let associatedStatisticsRequired = false;
46+
4547
if (filter) {
46-
const { beamsMode, fillNumbers, beamDurationOperator, beamDuration } = filter;
48+
const { beamsMode, fillNumbers, beamDurationOperator, beamDuration, runDurationOperator, runDuration } = filter;
4749
if (beamsMode) {
4850
switch (beamsMode) {
4951
case 'STABLE BEAMS':
@@ -89,6 +91,12 @@ class GetAllLhcFillsUseCase {
8991
}
9092
}
9193

94+
// Run duration filter and corresponding operator.
95+
if (runDuration && runDurationOperator) {
96+
associatedStatisticsRequired = true;
97+
queryBuilder.whereAssociation('statistics', 'runsCoverage').applyOperator(runDurationOperator, runDuration);
98+
}
99+
92100
// Beam duration filter and corresponding operator.
93101
if (beamDuration && beamDurationOperator) {
94102
queryBuilder.where('stableBeamsDuration').applyOperator(beamDurationOperator, beamDuration);
@@ -101,6 +109,11 @@ class GetAllLhcFillsUseCase {
101109
where: { definition: RunDefinition.PHYSICS },
102110
required: false,
103111
});
112+
queryBuilder.include({
113+
association: 'statistics',
114+
required: associatedStatisticsRequired,
115+
});
116+
104117
queryBuilder.orderBy('fillNumber', 'desc');
105118
queryBuilder.limit(limit);
106119
queryBuilder.offset(offset);

test/lib/usecases/lhcFill/GetAllLhcFillsUseCase.test.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,55 @@ module.exports = () => {
150150
expect(lhcFill.stableBeamsDuration).greaterThan(100)
151151
});
152152
})
153+
154+
it('should only contain specified total run duration, > 04:00:00', async () => {
155+
getAllLhcFillsDto.query = { filter: { runDuration: '14400', runDurationOperator: '>' } };
156+
const { lhcFills } = await new GetAllLhcFillsUseCase().execute(getAllLhcFillsDto)
157+
158+
expect(lhcFills).to.be.an('array').and.lengthOf(1)
159+
lhcFills.forEach((lhcFill) => {
160+
expect(lhcFill.runDuration).greaterThan(14400)
161+
});
162+
})
163+
164+
it('should only contain specified total run duration, >= 05:00:00', async () => {
165+
getAllLhcFillsDto.query = { filter: { runDuration: '18000', runDurationOperator: '>=' } };
166+
const { lhcFills } = await new GetAllLhcFillsUseCase().execute(getAllLhcFillsDto)
167+
168+
expect(lhcFills).to.be.an('array').and.lengthOf(1)
169+
lhcFills.forEach((lhcFill) => {
170+
expect(lhcFill.runDuration).greaterThan(18000)
171+
});
172+
})
173+
174+
it('should only contain specified total run duration, = 05:00:00', async () => {
175+
getAllLhcFillsDto.query = { filter: { runDuration: '18000', runDurationOperator: '=' } };
176+
const { lhcFills } = await new GetAllLhcFillsUseCase().execute(getAllLhcFillsDto)
177+
178+
expect(lhcFills).to.be.an('array').and.lengthOf(1)
179+
lhcFills.forEach((lhcFill) => {
180+
expect(lhcFill.runDuration).greaterThan(18000)
181+
});
182+
})
183+
184+
185+
it('should only contain specified total run duration, <= 05:00:00', async () => {
186+
getAllLhcFillsDto.query = { filter: { runDuration: '18000', runDurationOperator: '<=' } };
187+
const { lhcFills } = await new GetAllLhcFillsUseCase().execute(getAllLhcFillsDto)
188+
189+
expect(lhcFills).to.be.an('array').and.lengthOf(1)
190+
lhcFills.forEach((lhcFill) => {
191+
expect(lhcFill.runDuration).greaterThan(18000)
192+
});
193+
})
194+
195+
it('should only contain specified total run duration, < 06:30:59', async () => {
196+
getAllLhcFillsDto.query = { filter: { runDuration: '23459', runDurationOperator: '<' } };
197+
const { lhcFills } = await new GetAllLhcFillsUseCase().execute(getAllLhcFillsDto)
198+
199+
expect(lhcFills).to.be.an('array').and.lengthOf(1)
200+
lhcFills.forEach((lhcFill) => {
201+
expect(lhcFill.runDuration).greaterThan(23459)
202+
});
203+
})
153204
};

test/public/lhcFills/overview.test.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,9 @@ module.exports = () => {
270270
const filterSBExpect = { selector: 'div.items-baseline:nth-child(2) > div:nth-child(1)', value: 'Stable Beams Only' };
271271
const filterFillNRExpect = {selector: 'div.items-baseline:nth-child(1) > div:nth-child(1)', value: 'Fill #'}
272272
const filterSBDurationExpect = {selector: 'div.items-baseline:nth-child(3) > div:nth-child(1)', value: 'SB Duration'}
273-
const filterSBDurationPlaceholderExpect = {selector: 'input.w-100:nth-child(2)', value: 'e.g 16:14:15 (HH:MM:SS)'}
273+
const filterSBDurationPlaceholderExpect = {selector: '.beam-duration-filter', value: 'e.g 16:14:15 (HH:MM:SS)'}
274+
const filterRunDurationExpect = {selector: 'div.flex-row:nth-child(4) > div:nth-child(1)', value: 'Total runs duration'}
275+
const filterRunDurationPlaceholderExpect = {selector: '.run-duration-filter', value: 'e.g 16:14:15 (HH:MM:SS)'}
274276

275277

276278
await goToPage(page, 'lhc-fill-overview');
@@ -280,6 +282,8 @@ module.exports = () => {
280282
await expectInnerText(page, filterFillNRExpect.selector, filterFillNRExpect.value);
281283
await expectInnerText(page, filterSBDurationExpect.selector, filterSBDurationExpect.value);
282284
await expectAttributeValue(page, filterSBDurationPlaceholderExpect.selector, 'placeholder', filterSBDurationPlaceholderExpect.value);
285+
await expectInnerText(page, filterRunDurationExpect.selector, filterRunDurationExpect.value);
286+
await expectAttributeValue(page, filterRunDurationPlaceholderExpect.selector, 'placeholder', filterRunDurationPlaceholderExpect.value);
283287
});
284288

285289

0 commit comments

Comments
 (0)