Skip to content

Commit c33ce2a

Browse files
authored
Merge pull request #58362 from daledah/fix/57696
fix: incorrect format of search query string
2 parents cb4e4bb + b830cea commit c33ce2a

File tree

2 files changed

+121
-27
lines changed

2 files changed

+121
-27
lines changed

src/libs/SearchQueryUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
397397
const amountFilter = buildAmountFilterQuery(filterValues);
398398
filtersString.push(amountFilter);
399399

400-
return filtersString.join(' ').trim();
400+
return filtersString.filter(Boolean).join(' ').trim();
401401
}
402402

403403
/**
Lines changed: 120 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable @typescript-eslint/naming-convention */
22
// we need "dirty" object key names in these tests
3-
import {getQueryWithUpdatedValues} from '@src/libs/SearchQueryUtils';
3+
import {buildQueryStringFromFilterFormValues, getQueryWithUpdatedValues} from '@src/libs/SearchQueryUtils';
4+
import type {SearchAdvancedFiltersForm} from '@src/types/form';
45

56
const personalDetailsFakeData = {
67
@@ -23,44 +24,137 @@ jest.mock('@libs/PersonalDetailsUtils', () => {
2324
// We don't want to test or mock the grammar and the parser, so we're simply defining this string directly here.
2425
const defaultQuery = `type:expense status:all sortBy:date sortOrder:desc`;
2526

26-
describe('getQueryWithUpdatedValues', () => {
27-
test('returns default query for empty value', () => {
28-
const userQuery = '';
27+
describe('SearchQueryUtils', () => {
28+
describe('getQueryWithUpdatedValues', () => {
29+
test('returns default query for empty value', () => {
30+
const userQuery = '';
2931

30-
const result = getQueryWithUpdatedValues(userQuery);
32+
const result = getQueryWithUpdatedValues(userQuery);
3133

32-
expect(result).toEqual(defaultQuery);
33-
});
34+
expect(result).toEqual(defaultQuery);
35+
});
3436

35-
test('returns query with updated amounts', () => {
36-
const userQuery = 'foo test amount:20000';
37+
test('returns query with updated amounts', () => {
38+
const userQuery = 'foo test amount:20000';
3739

38-
const result = getQueryWithUpdatedValues(userQuery);
40+
const result = getQueryWithUpdatedValues(userQuery);
3941

40-
expect(result).toEqual(`${defaultQuery} amount:2000000 foo test`);
41-
});
42+
expect(result).toEqual(`${defaultQuery} amount:2000000 foo test`);
43+
});
4244

43-
test('returns query with user emails substituted', () => {
44-
const userQuery = 'from:[email protected] hello';
45+
test('returns query with user emails substituted', () => {
46+
const userQuery = 'from:[email protected] hello';
4547

46-
const result = getQueryWithUpdatedValues(userQuery);
48+
const result = getQueryWithUpdatedValues(userQuery);
4749

48-
expect(result).toEqual(`${defaultQuery} from:12345 hello`);
49-
});
50+
expect(result).toEqual(`${defaultQuery} from:12345 hello`);
51+
});
5052

51-
test('returns query with user emails substituted and preserves user ids', () => {
52-
const userQuery = 'from:[email protected] to:112233';
53+
test('returns query with user emails substituted and preserves user ids', () => {
54+
const userQuery = 'from:[email protected] to:112233';
5355

54-
const result = getQueryWithUpdatedValues(userQuery);
56+
const result = getQueryWithUpdatedValues(userQuery);
5557

56-
expect(result).toEqual(`${defaultQuery} from:12345 to:112233`);
57-
});
58+
expect(result).toEqual(`${defaultQuery} from:12345 to:112233`);
59+
});
60+
61+
test('returns query with all of the fields correctly substituted', () => {
62+
const userQuery = 'from:9876,87654 to:[email protected] hello amount:150 test';
5863

59-
test('returns query with all of the fields correctly substituted', () => {
60-
const userQuery = 'from:9876,87654 to:[email protected] hello amount:150 test';
64+
const result = getQueryWithUpdatedValues(userQuery);
6165

62-
const result = getQueryWithUpdatedValues(userQuery);
66+
expect(result).toEqual(`${defaultQuery} from:9876,87654 to:78901 amount:15000 hello test`);
67+
});
68+
});
6369

64-
expect(result).toEqual(`${defaultQuery} from:9876,87654 to:78901 amount:15000 hello test`);
70+
describe('buildQueryStringFromFilterFormValues', () => {
71+
test('simple filter value', () => {
72+
const filterValues: Partial<SearchAdvancedFiltersForm> = {
73+
type: 'expense',
74+
status: 'all',
75+
policyID: '12345',
76+
lessThan: '100',
77+
};
78+
79+
const result = buildQueryStringFromFilterFormValues(filterValues);
80+
81+
expect(result).toEqual('sortBy:date sortOrder:desc type:expense status:all policyID:12345 amount<100');
82+
});
83+
84+
test('with Policy ID', () => {
85+
const filterValues: Partial<SearchAdvancedFiltersForm> = {
86+
policyID: '12345',
87+
};
88+
89+
const result = buildQueryStringFromFilterFormValues(filterValues);
90+
91+
expect(result).toEqual('sortBy:date sortOrder:desc policyID:12345');
92+
});
93+
94+
test('with keywords', () => {
95+
const filterValues: Partial<SearchAdvancedFiltersForm> = {
96+
type: 'expense',
97+
status: 'all',
98+
policyID: '67890',
99+
merchant: 'Amazon',
100+
description: 'Electronics',
101+
keyword: 'laptop',
102+
category: ['electronics', 'gadgets'],
103+
};
104+
105+
const result = buildQueryStringFromFilterFormValues(filterValues);
106+
107+
expect(result).toEqual('sortBy:date sortOrder:desc type:expense status:all policyID:67890 merchant:Amazon description:Electronics laptop category:electronics,gadgets');
108+
});
109+
110+
test('currencies and categories', () => {
111+
const filterValues: Partial<SearchAdvancedFiltersForm> = {
112+
type: 'expense',
113+
status: 'all',
114+
category: ['services', 'consulting'],
115+
currency: ['USD', 'EUR'],
116+
};
117+
118+
const result = buildQueryStringFromFilterFormValues(filterValues);
119+
120+
expect(result).toEqual('sortBy:date sortOrder:desc type:expense status:all category:services,consulting currency:USD,EUR');
121+
});
122+
123+
test('empty filter values', () => {
124+
const filterValues: Partial<SearchAdvancedFiltersForm> = {};
125+
126+
const result = buildQueryStringFromFilterFormValues(filterValues);
127+
128+
expect(result).toEqual('sortBy:date sortOrder:desc');
129+
});
130+
131+
test('array of from', () => {
132+
const filterValues: Partial<SearchAdvancedFiltersForm> = {
133+
type: 'expense',
134+
135+
136+
};
137+
const result = buildQueryStringFromFilterFormValues(filterValues);
138+
139+
expect(result).toEqual('sortBy:date sortOrder:desc type:expense from:[email protected],[email protected] to:[email protected]');
140+
});
141+
142+
test('complex filter values', () => {
143+
const filterValues: Partial<SearchAdvancedFiltersForm> = {
144+
type: 'expense',
145+
146+
147+
dateAfter: '2025-03-01',
148+
dateBefore: '2025-03-10',
149+
lessThan: '1000',
150+
greaterThan: '1',
151+
category: ['finance', 'insurance'],
152+
};
153+
const result = buildQueryStringFromFilterFormValues(filterValues);
154+
155+
expect(result).toEqual(
156+
'sortBy:date sortOrder:desc type:expense from:[email protected],[email protected] to:[email protected] category:finance,insurance date<2025-03-10 date>2025-03-01 amount>1 amount<1000',
157+
);
158+
});
65159
});
66160
});

0 commit comments

Comments
 (0)