diff --git a/packages/toolkit/src/query/tests/utils.test.ts b/packages/toolkit/src/query/tests/utils.test.ts index 4b111b2a0..25bec07f0 100644 --- a/packages/toolkit/src/query/tests/utils.test.ts +++ b/packages/toolkit/src/query/tests/utils.test.ts @@ -74,31 +74,25 @@ describe('isDocumentVisible', () => { }) describe('joinUrls', () => { - test('correctly joins variations of relative urls', () => { - expect(joinUrls('/api/', '/banana')).toBe('/api/banana') - expect(joinUrls('/api/', 'banana')).toBe('/api/banana') - - expect(joinUrls('/api', 'banana')).toBe('/api/banana') - expect(joinUrls('/api', '/banana/')).toBe('/api/banana/') - - expect(joinUrls('', '/banana')).toBe('/banana') - expect(joinUrls('', 'banana')).toBe('banana') - }) - - test('correctly joins variations of absolute urls', () => { - expect(joinUrls('https://example.com/api', 'banana')).toBe( - 'https://example.com/api/banana' - ) - expect(joinUrls('https://example.com/api', '/banana')).toBe( - 'https://example.com/api/banana' - ) - - expect(joinUrls('https://example.com/api/', 'banana')).toBe( - 'https://example.com/api/banana' - ) - expect(joinUrls('https://example.com/api/', '/banana/')).toBe( - 'https://example.com/api/banana/' - ) + test.each([ + ['/api/', '/banana', '/api/banana'], + ['/api/', 'banana', '/api/banana'], + ['/api', '/banana', '/api/banana'], + ['/api', 'banana', '/api/banana'], + ['', '/banana', '/banana'], + ['', 'banana', 'banana'], + ['api', '?a=1', 'api?a=1'], + ['api/', '?a=1', 'api/?a=1'], + ['api', 'banana?a=1', 'api/banana?a=1'], + ['api/', 'banana?a=1', 'api/banana?a=1'], + ['https://example.com/api', 'banana', 'https://example.com/api/banana'], + ['https://example.com/api', '/banana', 'https://example.com/api/banana'], + ['https://example.com/api/', 'banana', 'https://example.com/api/banana'], + ['https://example.com/api/', '/banana', 'https://example.com/api/banana'], + ['https://example.com/api/', 'https://example.org', 'https://example.org'], + ['https://example.com/api/', '//example.org', '//example.org'], + ])('%s and %s join to %s', (base, url, expected) => { + expect(joinUrls(base, url)).toBe(expected) }) }) diff --git a/packages/toolkit/src/query/utils/joinUrls.ts b/packages/toolkit/src/query/utils/joinUrls.ts index f67533861..2087351df 100644 --- a/packages/toolkit/src/query/utils/joinUrls.ts +++ b/packages/toolkit/src/query/utils/joinUrls.ts @@ -18,8 +18,9 @@ export function joinUrls( return url } + const delimiter = base.endsWith('/') || !url.startsWith('?') ? '/' : '' base = withoutTrailingSlash(base) url = withoutLeadingSlash(url) - return `${base}/${url}` + return `${base}${delimiter}${url}`; }