diff --git a/core/streams/create.int.test.js b/core/streams/create.int.test.js index 718a00cc7..86c6799a6 100644 --- a/core/streams/create.int.test.js +++ b/core/streams/create.int.test.js @@ -471,4 +471,44 @@ describe('POST /streams', () => { expect(projectAfterCreated.minLongitude).toBe(stream.longitude) expect(projectAfterCreated.maxLongitude).toBe(stream.longitude) }) + + test('Can create site with similar name (hyphen to underscore)', async () => { + const project = { id: 'p123p', createdById: seedValues.primaryUserId, name: 'Primary User Project' } + await models.Project.create(project) + await models.UserProjectRole.create({ user_id: seedValues.primaryUserId, project_id: project.id, role_id: seedValues.roleAdmin }) + const stream1 = { id: 'jagu1', createdById: seedValues.primaryUserId, name: 'Jaguar-Station', latitude: null, longitude: -4.5, projectId: project.id } + await models.Stream.create(stream1) + + const requestBody = { + name: 'Jaguar_Station', + project_id: project.id + } + + const response = await request(app).post('/').send(requestBody) + + expect(response.statusCode).toBe(201) + const id = response.header.location.replace('/streams/', '') + const stream = await models.Stream.findByPk(id) + expect(stream.name).toBe(requestBody.name) + }) + + test('Can create site with similar name (2 hyphen to 1 underscore)', async () => { + const project = { id: 'p123p', createdById: seedValues.primaryUserId, name: 'Primary User Project' } + await models.Project.create(project) + await models.UserProjectRole.create({ user_id: seedValues.primaryUserId, project_id: project.id, role_id: seedValues.roleAdmin }) + const stream1 = { id: 'jagu1', createdById: seedValues.primaryUserId, name: 'Jaguar-Station-1', latitude: null, longitude: -4.5, projectId: project.id } + await models.Stream.create(stream1) + + const requestBody = { + name: 'Jaguar_Station-1', + project_id: project.id + } + + const response = await request(app).post('/').send(requestBody) + + expect(response.statusCode).toBe(201) + const id = response.header.location.replace('/streams/', '') + const stream = await models.Stream.findByPk(id) + expect(stream.name).toBe(requestBody.name) + }) }) diff --git a/core/streams/dao/index.js b/core/streams/dao/index.js index f4e9e4da9..741eff2b9 100644 --- a/core/streams/dao/index.js +++ b/core/streams/dao/index.js @@ -116,7 +116,7 @@ async function query (filters, options = {}) { if (filters.names) { where.name = { [Sequelize.Op.iLike]: { - [Sequelize.Op.any]: filters.names.map(n => `${n.replace(/^\*/, '%').replace(/\*$/, '%')}`) + [Sequelize.Op.any]: filters.names.map(n => `${n.replace(/(_|%|\\)/g, '\\$1').replace(/^\*/, '%').replace(/\*$/, '%')}`) } } } @@ -127,7 +127,7 @@ async function query (filters, options = {}) { }, name: { [Sequelize.Op.iLike]: { - [Sequelize.Op.any]: filters.namesOrIds.map(n => `${n.replace(/^\*/, '%').replace(/\*$/, '%')}`) + [Sequelize.Op.any]: filters.namesOrIds.map(n => `${n.replace(/(_|%|\\)/g, '\\$1').replace(/^\*/, '%').replace(/\*$/, '%')}`) } } } diff --git a/core/streams/update.int.test.js b/core/streams/update.int.test.js index 5e3a2ecba..afd28ede9 100644 --- a/core/streams/update.int.test.js +++ b/core/streams/update.int.test.js @@ -410,4 +410,34 @@ describe('PATCH /streams/:id', () => { expect(projectAfterUpdated.minLongitude).toBe(stream2.longitude) expect(projectAfterUpdated.maxLongitude).toBe(stream2.longitude) }) + + test('Can update site with similar name (hyphen to underscore)', async () => { + const project = { id: 'p123p', createdById: seedValues.primaryUserId, name: 'Primary User Project' } + await models.Project.create(project) + await models.UserProjectRole.create({ user_id: seedValues.primaryUserId, project_id: project.id, role_id: seedValues.roleAdmin }) + const stream1 = { id: 'jagu1', createdById: seedValues.primaryUserId, name: 'Jaguar-Station', latitude: null, longitude: -4.5, projectId: project.id } + await models.Stream.create(stream1) + const requestBody = { name: 'Jaguar_Station' } + + const response = await request(app).patch(`/${stream1.id}`).send(requestBody) + + expect(response.statusCode).toBe(204) + const stream = await models.Stream.findByPk(stream1.id) + expect(stream.name).toBe(requestBody.name) + }) + + test('Can update site with similar name (2 hyphen to 1 underscore)', async () => { + const project = { id: 'p123p', createdById: seedValues.primaryUserId, name: 'Primary User Project' } + await models.Project.create(project) + await models.UserProjectRole.create({ user_id: seedValues.primaryUserId, project_id: project.id, role_id: seedValues.roleAdmin }) + const stream1 = { id: 'jagu1', createdById: seedValues.primaryUserId, name: 'Jaguar-Station-1', latitude: null, longitude: -4.5, projectId: project.id } + await models.Stream.create(stream1) + const requestBody = { name: 'Jaguar_Station-1' } + + const response = await request(app).patch(`/${stream1.id}`).send(requestBody) + + expect(response.statusCode).toBe(204) + const stream = await models.Stream.findByPk(stream1.id) + expect(stream.name).toBe(requestBody.name) + }) })