Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "rsql-query-builder",
"version": "1.1.1",
"version": "1.1.2",
"description": "Library for building RSQL query strings.",
"main": "dist/index.js",
"module": "dist/index.mjs",
Expand Down
42 changes: 38 additions & 4 deletions src/RSQLBuilder.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { describe, it, expect } from 'vitest';
import RSQLBuilder from './RSQLBuilder';
import { RSQLBuilder } from './';

describe('RSQLBuilder', () => {
it("Test operator Equal ('==')", () => {
expect(new RSQLBuilder().equal('name', 'Filip').toString()).toBe('name=="Filip"');
expect(new RSQLBuilder().equal('age', 30).toString()).toBe('age==30');
expect(new RSQLBuilder().equal('weight', 68.3).toString()).toBe('weight==68.3');
expect(new RSQLBuilder().equal('adult', true).toString()).toBe('adult==true');
expect(new RSQLBuilder().equal('created', new Date('2022-04-23T05:46:17.497Z')).toString()).toBe(
'created==2022-04-23T05:46:17.497Z'
Expand All @@ -15,6 +16,8 @@ describe('RSQLBuilder', () => {
it("Test operator Not Equal ('!=')", () => {
expect(new RSQLBuilder().notEqual('name', 'Filip').toString()).toBe('name!="Filip"');
expect(new RSQLBuilder().notEqual('age', 30).toString()).toBe('age!=30');
expect(new RSQLBuilder().notEqual('weight', 68.3).toString()).toBe('weight!=68.3');
expect(new RSQLBuilder().notEqual('adult', false).toString()).toBe('adult!=false');
expect(new RSQLBuilder().notEqual('adult', true).toString()).toBe('adult!=true');
expect(new RSQLBuilder().notEqual('created', new Date('2022-04-23T05:46:17.497Z')).toString()).toBe(
'created!=2022-04-23T05:46:17.497Z'
Expand All @@ -24,12 +27,12 @@ describe('RSQLBuilder', () => {

it("Test operator In ('=in=')", () => {
expect(new RSQLBuilder().in('name', ['Filip', 'John']).toString()).toBe('name=in=("Filip","John")');
expect(new RSQLBuilder().in('name', [30, 45]).toString()).toBe('name=in=(30,45)');
expect(new RSQLBuilder().in('name', [30, 45, 55.5]).toString()).toBe('name=in=(30,45,55.5)');
});

it("Test operator Not In ('=out=')", () => {
expect(new RSQLBuilder().notIn('name', ['Filip', 'John']).toString()).toBe('name=out=("Filip","John")');
expect(new RSQLBuilder().notIn('name', [30, 45]).toString()).toBe('name=out=(30,45)');
expect(new RSQLBuilder().notIn('name', [30, 45, 55.5]).toString()).toBe('name=out=(30,45,55.5)');
});

it("Test operator Less Than ('=lt=')", () => {
Expand All @@ -54,7 +57,38 @@ describe('RSQLBuilder', () => {
});

it("Test logic operator OR (',')", () => {
expect(new RSQLBuilder().and().toString()).toBe(';');
expect(new RSQLBuilder().or().toString()).toBe(',');
expect(new RSQLBuilder().equal('name', 'John').or().equal('age', 30).toString()).toBe('name=="John",age==30');
});

it("Test default logic operator AND (';')", () => {
expect(new RSQLBuilder({ defaultLogicOperator: 'and' }).and().toString()).toBe(';');
expect(new RSQLBuilder({ defaultLogicOperator: 'and' }).equal('name', 'John').equal('age', 30).toString()).toBe(
'name=="John";age==30'
);
});

it("Test default logic operator OR (',')", () => {
expect(new RSQLBuilder({ defaultLogicOperator: 'or' }).or().toString()).toBe(',');
expect(new RSQLBuilder({ defaultLogicOperator: 'or' }).equal('name', 'John').equal('age', 30).toString()).toBe(
'name=="John",age==30'
);
});

it('Test prevent consecutive occurence of logic operators', () => {
expect(new RSQLBuilder().and().or().and().and().or().or().and().toString()).toBe(';');
expect(
new RSQLBuilder().equal('name', 'John').and().or().and().and().or().or().and().equal('age', 30).toString()
).toBe('name=="John";age==30');
});

it('Test isEmpty() and reset()', () => {
expect(new RSQLBuilder().isEmpty()).toBe(true);
expect(new RSQLBuilder().equal('name', 'John').and().equal('age', 30).reset().isEmpty()).toBe(true);
expect(new RSQLBuilder().equal('name', 'John').and().equal('age', 30).isEmpty()).toBe(false);
});

it('Test group()', () => {
expect(new RSQLBuilder().equal('name', 'John').and().group(new RSQLBuilder().equal('age', 30).or().equal('age', null)).toString()).toBe('name==\"John\";(age==30,age==null)');
});
});
2 changes: 1 addition & 1 deletion src/RSQLBuilderBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class RSQLBuilderBase<TSelector extends string, TCustomComparisonOperator extend
): string {
if (value === null) return 'null';
if (typeof value === 'string') return '"' + this.escapeString(value) + '"';
if (typeof value === 'number') return value.toFixed();
if (typeof value === 'number') return value.toString();
if (typeof value === 'boolean') return value === true ? 'true' : 'false';
if (value instanceof Date) return value.toISOString();
throw new Error('Unhandled value type.');
Expand Down
Loading