52 lines
2.5 KiB
TypeScript
52 lines
2.5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { compile } from './compile';
|
|
import type { Group } from './types';
|
|
|
|
describe('compile', () => {
|
|
it('quotes text is', () => {
|
|
const g: Group = { match: 'all', children: [{ field: 'genre', operator: 'is', value: 'Horror' }] };
|
|
expect(compile(g)).toBe('genre:"Horror"');
|
|
});
|
|
|
|
it('emits NOT for isNot', () => {
|
|
const g: Group = { match: 'all', children: [{ field: 'genre', operator: 'isNot', value: 'Horror' }] };
|
|
expect(compile(g)).toBe('NOT genre:"Horror"');
|
|
});
|
|
|
|
it('wildcards contains and startsWith', () => {
|
|
expect(compile({ match: 'all', children: [{ field: 'title', operator: 'contains', value: 'night' }] })).toBe('title:*night*');
|
|
expect(compile({ match: 'all', children: [{ field: 'title', operator: 'startsWith', value: 'The' }] })).toBe('title:The*');
|
|
});
|
|
|
|
it('quotes fulltext matches / notMatches (distinct from text contains)', () => {
|
|
expect(compile({ match: 'all', children: [{ field: 'plot', operator: 'matches', value: 'car chase' }] })).toBe('plot:"car chase"');
|
|
expect(compile({ match: 'all', children: [{ field: 'plot', operator: 'notMatches', value: 'car' }] })).toBe('NOT plot:"car"');
|
|
});
|
|
|
|
it('emits numeric ranges', () => {
|
|
expect(compile({ match: 'all', children: [{ field: 'minutes', operator: 'gt', value: '30' }] })).toBe('minutes:{30 TO *}');
|
|
expect(compile({ match: 'all', children: [{ field: 'minutes', operator: 'lt', value: '90' }] })).toBe('minutes:{* TO 90}');
|
|
expect(compile({ match: 'all', children: [{ field: 'minutes', operator: 'between', value: '30', value2: '90' }] })).toBe('minutes:[30 TO 90]');
|
|
expect(compile({ match: 'all', children: [{ field: 'minutes', operator: 'eq', value: '42' }] })).toBe('minutes:42');
|
|
});
|
|
|
|
it('emits date ranges', () => {
|
|
expect(compile({ match: 'all', children: [{ field: 'release_date', operator: 'after', value: '2000-01-01' }] })).toBe('release_date:{2000-01-01 TO *}');
|
|
expect(compile({ match: 'all', children: [{ field: 'release_date', operator: 'before', value: '2010-01-01' }] })).toBe('release_date:{* TO 2010-01-01}');
|
|
});
|
|
|
|
it('joins by AND / OR and parenthesizes nested groups', () => {
|
|
const g: Group = {
|
|
match: 'all',
|
|
children: [
|
|
{ field: 'type', operator: 'is', value: 'movie' },
|
|
{ match: 'any', children: [
|
|
{ field: 'genre', operator: 'is', value: 'Horror' },
|
|
{ field: 'genre', operator: 'is', value: 'Thriller' }
|
|
] }
|
|
]
|
|
};
|
|
expect(compile(g)).toBe('type:"movie" AND (genre:"Horror" OR genre:"Thriller")');
|
|
});
|
|
});
|