diff --git a/src/utils/parseQuery.ts b/src/utils/parseQuery.ts index 2061cbe..fbe52ef 100644 --- a/src/utils/parseQuery.ts +++ b/src/utils/parseQuery.ts @@ -14,7 +14,9 @@ export const parseQuery = (queries: MicroCMSQueries): string => { const queryString = new URLSearchParams( Object.entries(queries).reduce( (acc, [key, value]) => { - acc[key] = String(value); + if (value !== undefined) { + acc[key] = String(value); + } return acc; }, {} as Record, diff --git a/tests/utils/parseQuery.test.ts b/tests/utils/parseQuery.test.ts index b35892e..32e785b 100644 --- a/tests/utils/parseQuery.test.ts +++ b/tests/utils/parseQuery.test.ts @@ -7,14 +7,45 @@ describe('parseQuery', () => { limit: 100, fields: ['id', 'title'], orders: 'publishedAt', - }) + }), ).toBe('limit=100&fields=id%2Ctitle&orders=publishedAt'); }); + test('Throws an error if a non-object is specified', () => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error expect(() => parseQuery('')).toThrowError( - new Error('queries is not object') + new Error('queries is not object'), ); }); + + test('Undefined values are removed from the query string', () => { + expect( + parseQuery({ + limit: 100, + fields: undefined, + orders: 'publishedAt', + }), + ).toBe('limit=100&orders=publishedAt'); + }); + + test('Multiple undefined values are removed from the query string', () => { + expect( + parseQuery({ + limit: undefined, + fields: undefined, + orders: 'publishedAt', + }), + ).toBe('orders=publishedAt'); + }); + + test('All undefined values results in an empty query string', () => { + expect( + parseQuery({ + limit: undefined, + fields: undefined, + orders: undefined, + }), + ).toBe(''); + }); });