Skip to content

Commit c34056c

Browse files
committed
[O2B-1520] Improve run number range validation and add tests
Removed strict rejection of empty entries in run number filters, allowing filters like '103,,' to be processed. Added comprehensive tests for valid and invalid run number ranges, including edge cases with empty entries and invalid formats, to ensure correct API and use case behaviour.
1 parent 916dcae commit c34056c

3 files changed

Lines changed: 63 additions & 5 deletions

File tree

lib/utilities/rangeUtils.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@ export const validateRange = (value, helpers) => {
2727
const numbers = value.split(',').map((number) => number.trim());
2828

2929
for (const number of numbers) {
30-
// Check for empty strings (e.g., from trailing commas or double commas)
31-
if (number === '') {
32-
return helpers.error(RANGE_INVALID, { message: 'Empty value found' });
33-
}
34-
3530
if (number.includes('-')) {
3631
// Check if '-' occurs more than once in this part of the range
3732
if (number.lastIndexOf('-') !== number.indexOf('-')) {

test/api/environments.test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,42 @@ module.exports = () => {
236236
expect(environments[0].id).to.be.equal('TDI59So3d');
237237
expect(environments[1].id).to.be.equal('Dxi029djX');
238238
});
239+
240+
it('should successfully filter environments when run number filter contains empty entries', async () => {
241+
const response = await request(server).get('/api/environments?filter[runNumbers]=103,,');
242+
243+
expect(response.status).to.equal(200);
244+
const environments = response.body.data;
245+
expect(environments).to.have.lengthOf(1);
246+
expect(environments[0].id).to.be.equal('TDI59So3d');
247+
});
248+
249+
it('should return 400 for an invalid run number range, first number greater than second', async () => {
250+
const response = await request(server).get('/api/environments?filter[runNumbers]=105-100');
251+
252+
expect(response.status).to.equal(400);
253+
const { errors } = response.body;
254+
const rangeError = errors.find((err) => err.source.pointer === '/data/attributes/query/filter/runNumbers');
255+
expect(rangeError.detail).to.equal('Invalid range: 105-100');
256+
});
257+
258+
it('should return 400 for an invalid run number range, negative start number', async () => {
259+
const response = await request(server).get('/api/environments?filter[runNumbers]=-100-105');
260+
261+
expect(response.status).to.equal(400);
262+
const { errors } = response.body;
263+
const rangeError = errors.find((err) => err.source.pointer === '/data/attributes/query/filter/runNumbers');
264+
expect(rangeError.detail).to.equal('Invalid range: -100-105');
265+
});
266+
267+
it('should return 400 for an invalid run number range, no start number', async () => {
268+
const response = await request(server).get('/api/environments?filter[runNumbers]=-105');
269+
270+
expect(response.status).to.equal(400);
271+
const { errors } = response.body;
272+
const rangeError = errors.find((err) => err.source.pointer === '/data/attributes/query/filter/runNumbers');
273+
expect(rangeError.detail).to.equal('Invalid range: -105');
274+
});
239275
});
240276
describe('POST /api/environments', () => {
241277
it('should return 201 if valid data is provided', async () => {

test/lib/usecases/environment/GetAllEnvironmentsUseCase.test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,33 @@ module.exports = () => {
162162
expect(environments.map(({ id }) => id)).to.have.members(['TDI59So3d', 'Dxi029djX']);
163163
});
164164

165+
it('should successfully filter environments on a run number range spanning multiple environments', async () => {
166+
getAllEnvsDto.query = { filter: { runNumbers: '100-103' } };
167+
const { environments } = await new GetAllEnvironmentsUseCase().execute(getAllEnvsDto);
168+
169+
expect(environments).to.be.an('array');
170+
expect(environments.length).to.be.equal(2);
171+
expect(environments.map(({ id }) => id)).to.have.members(['Dxi029djX', 'TDI59So3d']);
172+
});
173+
174+
it('should successfully filter environments on a single-value run number range', async () => {
175+
getAllEnvsDto.query = { filter: { runNumbers: '105-105' } };
176+
const { environments } = await new GetAllEnvironmentsUseCase().execute(getAllEnvsDto);
177+
178+
expect(environments).to.be.an('array');
179+
expect(environments.length).to.be.equal(1);
180+
expect(environments[0].id).to.be.equal('TDI59So3d');
181+
});
182+
183+
it('should successfully filter environments when run number filter includes empty entries', async () => {
184+
getAllEnvsDto.query = { filter: { runNumbers: '103, ' } };
185+
const { environments } = await new GetAllEnvironmentsUseCase().execute(getAllEnvsDto);
186+
187+
expect(environments).to.be.an('array');
188+
expect(environments.length).to.be.equal(1);
189+
expect(environments[0].id).to.be.equal('TDI59So3d');
190+
});
191+
165192
it('should successfully filter environments on created from and to', async () => {
166193
const from = Date.now() - 24 * 60 * 60 * 1000; // environment from 24h ago which was created by CreateEnvironmentUseCase.test.js
167194
const to = Date.now() - 10;

0 commit comments

Comments
 (0)