Skip to content

Commit 4333529

Browse files
authored
feat: expose utils to parse filters (#683)
1 parent bb84d47 commit 4333529

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

src/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ const PieStatGetter = require('./services/pie-stat-getter');
2323
const LineStatGetter = require('./services/line-stat-getter');
2424
const LeaderboardStatGetter = require('./services/leaderboard-stat-getter');
2525
const QueryStatGetter = require('./services/query-stat-getter');
26+
const FiltersParser = require('./services/filters-parser');
2627

2728
const RecordsDecorator = require('./utils/records-decorator');
29+
const makeParseFilter = require('./public/parse-filter');
2830

2931
const REGEX_VERSION = /(\d+\.)?(\d+\.)?(\*|\d+)/;
3032

@@ -47,6 +49,8 @@ exports.RecordCreator = Interface.RecordCreator;
4749
exports.RecordRemover = Interface.RecordRemover;
4850
exports.RecordsRemover = Interface.RecordsRemover;
4951
exports.RecordSerializer = Interface.RecordSerializer;
52+
exports.BaseOperatorDateParser = Interface.BaseOperatorDateParser;
53+
exports.parseFilter = makeParseFilter(FiltersParser, exports);
5054

5155
exports.PUBLIC_ROUTES = Interface.PUBLIC_ROUTES;
5256

src/public/parse-filter.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
function makeParseFilter(FiltersParser, publicExports) {
2+
/**
3+
* @param {*} filter
4+
* @param {*} modelSchema
5+
* @param {string} timezone
6+
* @returns {Promise<any>} Sequelize condition
7+
*/
8+
return function parseFilter(filter, modelSchema, timezone) {
9+
if (!publicExports.opts) throw new Error('Liana must be initialized before using parseFilter');
10+
11+
const parser = new FiltersParser(modelSchema, timezone, publicExports.opts);
12+
13+
return parser.perform(JSON.stringify(filter));
14+
};
15+
}
16+
17+
module.exports = makeParseFilter;

test/public/parse-filter.test.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
const makeParseFilter = require('../../src/public/parse-filter');
2+
3+
describe('parseFilter', () => {
4+
function setup() {
5+
const perform = jest.fn();
6+
7+
const FakeFiltersParser = jest.fn(function FakeClass() {
8+
this.perform = perform;
9+
});
10+
11+
return { FakeFiltersParser, perform };
12+
}
13+
14+
it('should create the parser and call perform', async () => {
15+
expect.assertions(3);
16+
17+
const { FakeFiltersParser, perform } = setup();
18+
19+
const opts = { Sequelize: 'fake' };
20+
const parseFilter = makeParseFilter(FakeFiltersParser, { opts });
21+
perform.mockResolvedValue('parsed-filter');
22+
23+
const filter = { operator: 'equal', value: 'hello', field: 'label' };
24+
const modelSchema = { label: {} };
25+
const timezone = 'Europe/Paris';
26+
const result = await parseFilter(filter, modelSchema, timezone);
27+
28+
expect(result).toBe('parsed-filter');
29+
expect(FakeFiltersParser).toHaveBeenCalledWith(modelSchema, timezone, opts);
30+
expect(perform).toHaveBeenCalledWith(JSON.stringify(filter));
31+
});
32+
33+
it('should throw an error when the liana is not initialized', () => {
34+
expect.assertions(1);
35+
36+
const { FakeFiltersParser } = setup();
37+
38+
const parseFilter = makeParseFilter(FakeFiltersParser, {});
39+
40+
expect(() => parseFilter({}, {}, 'Europe/Paris'))
41+
.toThrow('Liana must be initialized before using parseFilter');
42+
});
43+
});

0 commit comments

Comments
 (0)