Skip to content

Commit

Permalink
Merge branch 'hotfix/2.1.11'
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffsampaio committed Jun 14, 2022
2 parents a3a2c71 + b15267e commit 5053dc3
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 6 deletions.
14 changes: 13 additions & 1 deletion lib/mapper/filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ function filters(query, options) {
delete query.start_at
delete query.end_at
delete query.period
let or_count = 0
for (const elem in query) {
if (query[elem] instanceof Array) {
query[elem].forEach(function (param) {
Expand All @@ -22,7 +23,18 @@ function filters(query, options) {
} else {
if (query[elem] instanceof Object) {
} else if (query[elem].includes(',')) {
result['$or'] = result['$or'].concat(splitByCommas(elem, query[elem]))
if (or_count === 0){
result['$or'] = result['$or'].concat(splitByCommas(elem, query[elem]))
}
else if (or_count === 1) {
result['$and'].push({'$or': result['$or']})
result['$and'].push({'$or': splitByCommas(elem, query[elem])})
result['$or'] = []
}
else{
result['$and'].push({'$or': splitByCommas(elem, query[elem])})
}
or_count++
} else {
Object.assign(result, processQuery(elem, query[elem]))
}
Expand Down
10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "query-strings-parser",
"version": "2.1.10",
"version": "2.1.11",
"description": "Middleware to transform query strings in a format that is recognized by the MongoDB, MySQL and other databases...",
"license": "MIT",
"main": "index.js",
Expand Down Expand Up @@ -45,10 +45,10 @@
},
"dependencies": {},
"devDependencies": {
"chai": "^4.3.4",
"express": "^4.17.1",
"mocha": "^9.1.3",
"chai": "^4.3.6",
"express": "^4.18.1",
"mocha": "^10.0.0",
"nyc": "^15.1.0",
"supertest": "^6.1.6"
"supertest": "^6.2.3"
}
}
77 changes: 77 additions & 0 deletions test/unit/filters.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,69 @@ describe('QueryString: Filters', function () {
})
})

context('when query filters have multiple values for multiple fields (status and sourcehealthentity_id)', function () {
it('should return a JSON with filter parameters containing a $AND filter with multiple $OR filters', function (done) {
const bedId = generateObjectId()
const requestStatusList = 'regulated,'
const sourceHealthEntityIds = `${generateObjectId()},${generateObjectId()}`
const result = filter.filters({
bed_id: bedId, status: requestStatusList, sourcehealthentity_id: sourceHealthEntityIds
}, default_options)

expect(result).to.have.property('$and')
expect(result['$and']).to.eql([
{ '$or': [{ status: requestStatusList.split(',')[0] }, { status: requestStatusList.split(',')[1] }] },
{
'$or': [
{ sourcehealthentity_id: sourceHealthEntityIds.split(',')[0] },
{ sourcehealthentity_id: sourceHealthEntityIds.split(',')[1] }
]
}])
expect(result.bed_id).to.eql(bedId)

done()
})
})

context('when query filters have multiple values for one field (status)', function () {
it('should return a JSON with filter parameters containing a $OR filter with multiple values', function (done) {
const bedId = generateObjectId()
const requestStatusList = 'regulated,'
const sourceHealthEntityId = generateObjectId()
const result = filter.filters({
bed_id: bedId, status: requestStatusList, sourcehealthentity_id: sourceHealthEntityId
}, default_options)
expect(result).to.not.have.property('$and')
expect(result).to.have.property('$or')
expect(result['$or']).to.eql([{ status: requestStatusList.split(',')[0] }, { status: requestStatusList.split(',')[1] }])
expect(result.bed_id).to.eql(bedId)
expect(result.sourcehealthentity_id).to.eql(sourceHealthEntityId)

done()
})
})

context('when query filters have multiple values for one field (sourcehealthentity_id)', function () {
it('should return a JSON with filter parameters containing a $OR filter with multiple values', function (done) {
const bedId = generateObjectId()
const requestStatus = 'regulated'
const sourceHealthEntityIds = `${generateObjectId()},${generateObjectId()}`
const result = filter.filters({
bed_id: bedId, status: requestStatus, sourcehealthentity_id: sourceHealthEntityIds
}, default_options)
expect(result).to.not.have.property('$and')
expect(result).to.have.property('$or')
expect(result['$or']).to.eql([
{ sourcehealthentity_id: sourceHealthEntityIds.split(',')[0] },
{ sourcehealthentity_id: sourceHealthEntityIds.split(',')[1] }
])
expect(result.bed_id).to.eql(bedId)
expect(result.status).to.eql(requestStatus)

done()
})
})

context('when query filters key contains blank space', function () {
it('should return a JSON with filters params, ignoring blank spaces', function (done) {
verify(filter.filters({ ' na me ': 'lucas', age: '30' }, default_options))
Expand Down Expand Up @@ -76,3 +139,17 @@ function verify(result) {
expect(result.name).to.eql('lucas')
expect(result.age).to.eql(30)
}

/**
* Randomly generates a valid 24-byte hex ID.
*
* @returns {string}
*/
function generateObjectId() {
const chars = 'abcdef0123456789'
let randS = ''
for (let i = 0; i < 24; i++) {
randS += chars.charAt(Math.floor(Math.random() * chars.length))
}
return randS
}

0 comments on commit 5053dc3

Please sign in to comment.