UNPKG

query-strings-parser

Version:

Middleware to transform query strings in a format that is recognized by the MongoDB, MySQL and other databases...

253 lines (219 loc) 10.2 kB
const expect = require('chai').expect const index = require('../../index') describe('QueryString: Parsers', function () { describe('parseFields()', function () { context('when use parse without default fields', function () { it('should return parse query fields', function () { const query = '?fields=name,age,created_at' verifyFields(index.parseFields(query, {})) }) }) context('when query is passed as object', function () { it('should return parse query fields', function () { const query = { fields: 'name,age,created_at' } verifyFields(index.parseFields(query, {})) }) }) context('when use parse with default fields', function () { it('should return parse query fields merged with default fields', function () { const query = '?fields=name,age,created_at' const parsed_params = index.parseFields(query, { _id: 0 }) verifyFields(parsed_params) expect(parsed_params).to.have.property('_id') expect(parsed_params._id).to.eql(0) }) }) }) describe('parseSort()', function () { context('when use parse without default sort', function () { it('should return parse query sort', function () { const query = '?sort=name,-age,created_at' verifySort(index.parseSort(query, {})) }) }) context('when query is passed as object', function () { it('should return parse query sort', function () { const query = { sort: 'name,-age,created_at' } verifySort(index.parseSort(query, {})) }) }) context('when use parse with default sort', function () { it('should return parse query sort merged with default sort', function () { const query = '?sort=name,-age,created_at' const parsed_params = index.parseSort(query, { _id: 'desc' }) verifySort(index.parseSort(query, { _id: 'desc' })) expect(parsed_params).to.have.property('_id') expect(parsed_params._id).to.eql('desc') }) }) }) describe('parsePagination()', function () { context('when use parse without default pagination', function () { it('should return parse query pagination', function () { const query = '?limit=20&page=3' verifyPage(index.parsePagination(query, {}, true)) }) }) context('when query is passed as object', function () { it('should return parse query pagination', function () { const query = { limit: '20', page: '3' } verifyPage(index.parsePagination(query, {}, true)) }) }) context('when use parse with default pagination', function () { it('should return parse query pagination', function () { const query = '?page=3' verifyPage(index.parsePagination(query, { limit: 20 }, true)) }) }) }) describe('parseFilters()', function () { context('when use parse without default filters', function () { it('should return parse query filter', function () { const query = '?name=lucas&age=30' verifyFilter(index.parseFilter(query, {})) }) }) context('when query is passed as object', function () { it('should return parse query filter', function () { const query = { name: 'lucas', age: '30' } verifyFilter(index.parseFilter(query, {})) }) }) context('when use parse with default filters', function () { it('should return parse query filters merge with default filters', function () { const query = '?name=lucas&age=30' const result = index.parseFilter(query, { 'job': 'Engineer' }) verifyFilter(result) expect(result).to.have.property('job') expect(result.job).to.eql('Engineer') }) }) }) describe('parseDate()', function () { context('when use parse without default date fields', function () { it('should return parse query date', function () { const query = '?start_at=2019-02-05T00:00:00&end_at=2019-02-05T23:59:59' verifyDate(index.parseDate(query, {})) }) }) context('when query is passed as object', function () { it('should return parse query date', function () { const query = { start_at: '2019-02-05T00:00:00', end_at: '2019-02-05T23:59:59' } verifyDate(index.parseDate(query, {})) }) }) context('when use parse with default date fields', function () { it('should return parse query date merge with default date', function () { const query = '?start_at=2019-02-05T00:00:00&end_at=2019-02-05T23:59:59' const result = index.parseDate(query, { start_at: 'created_at', end_at: 'created_at' }) verifyDate(result) }) }) }) describe('parser()', function () { context('when parser is used with defaults options', function () { it('should return object with fields, sort, filters, pagination and original query', function () { verifyParser(index.parser('')) }) it('should return parse query fields', function () { const query = '?fields=name,age,created_at' verifyFields(index.parser(query).fields) }) it('should return parse query sort', function () { const query = '?sort=name,-age,created_at' verifySort(index.parser(query).sort) }) it('should return parse query pagination', function () { const query = '?limit=20&skip=3' const result = index.parser(query) expect(result.pagination).to.have.property('limit', 20) expect(result.pagination).to.have.property('skip', 3) }) it('should return parse query filter', function () { const query = '?name=lucas&age=30' verifyFilter(index.parser(query).filters) }) it('should return parse query date', function () { const query = '?start_at=2019-02-05T00:00:00&end_at=2019-02-05T23:59:59' verifyDate(index.parser(query).filters) }) }) context('when parser is used with custom options', function () { it('should return parse query fields merged with default fields', function () { const query = '?fields=name,age,created_at' const result = index.parser(query, { fields: { _id: 0 } }) verifyFields(result.fields) expect(result.fields).to.have.property('_id', 0) }) it('should return parsing query classification merged with custom classification', function () { const query = '?sort=name,-age,created_at' const result = index.parser(query, { sort: { _id: -1 } }) expect(result.sort).to.have.property('_id', -1) }) it('should return parse query pagination', function () { const query = '?page=3' verifyPage(index.parser(query, { pagination: { limit: 20 } }, { use_page: true } ).pagination) }) it('should return parse query filters merge with custom filters', function () { const query = '?name=lucas&age=30' const result = index.parser(query, { filters: { 'job': 'Engineer' } }) verifyFilter(result.filters) expect(result.filters).to.have.property('job', 'Engineer') }) it('should return parse query date merge with default date', function () { const query = '?start_at=2019-02-05T00:00:00&end_at=2019-02-05T23:59:59' const result = index.parser( query, {}, { date_fields: { start_at: 'timestamp', end_at: 'timestamp' } }) expect(result.filters.$and[0]).to.have.all.keys('timestamp') expect(result.filters.$and[1]).to.have.all.keys('timestamp') }) }) }) }) function verifyFields(result) { expect(result).to.have.property('name') expect(result).to.have.property('age') expect(result).to.have.property('created_at') expect(result.name).to.eql(1) expect(result.age).to.eql(1) expect(result.created_at).to.eql(1) } function verifySort(result) { expect(result).to.have.property('name') expect(result).to.have.property('age') expect(result).to.have.property('created_at') expect(result.name).to.eql(1) expect(result.age).to.eql(-1) expect(result.created_at).to.eql(1) } function verifyPage(result) { expect(result).to.have.property('limit') expect(result).to.have.property('page') expect(result.limit).to.eql(20) expect(result.page).to.eql(3) } function verifyFilter(result) { expect(result).to.have.property('name') expect(result).to.have.property('age') expect(result.name).to.eql('lucas') expect(result.age).to.eql(30) } function verifyDate(result) { expect(result).to.have.property('$and') expect(result.$and).to.have.lengthOf(2) expect(result.$and[0]).to.have.all.keys('created_at') expect(result.$and[1]).to.have.all.keys('created_at') } function verifyParser(result) { expect(result).to.have.property('fields') expect(result).to.have.property('sort') expect(result).to.have.property('filters') expect(result).to.have.property('pagination') expect(result).to.have.property('original') }