feat: add unit tests for parseUrl function to validate URL parsing logic
This commit is contained in:
75
lib/core/serializer/url-serializer.test.ts
Normal file
75
lib/core/serializer/url-serializer.test.ts
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import { describe, expect, it, vi } from 'vitest'
|
||||||
|
import { parseUrl } from './url-serializer'
|
||||||
|
|
||||||
|
const dummyQueryParser = (s: string) => ({ raw: s })
|
||||||
|
|
||||||
|
describe('parseUrl', () => {
|
||||||
|
it('parses a full absolute URL', () => {
|
||||||
|
const result = parseUrl({
|
||||||
|
str: 'https://example.com:8080/foo/bar?x=1#frag',
|
||||||
|
parseQuery: dummyQueryParser,
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
protocol: 'https',
|
||||||
|
hostname: 'example.com',
|
||||||
|
paths: ['foo', 'bar'],
|
||||||
|
port: 8080,
|
||||||
|
fragment: 'frag',
|
||||||
|
queries: { raw: '?x=1' },
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('parses a relative path without protocol or hostname', () => {
|
||||||
|
const result = parseUrl({
|
||||||
|
str: '/some/path',
|
||||||
|
parseQuery: dummyQueryParser,
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
paths: ['some', 'path'],
|
||||||
|
queries: Object.create(null),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('parses relative slash-only path with query and fragment', () => {
|
||||||
|
const parser = vi.fn(dummyQueryParser)
|
||||||
|
const result = parseUrl({
|
||||||
|
str: '/?a=1#b',
|
||||||
|
parseQuery: parser,
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.paths).toEqual([])
|
||||||
|
expect(result.queries).toEqual({ raw: '?a=1' })
|
||||||
|
expect(parser).toHaveBeenCalledOnce()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('parses protocol-relative URL (//host/...)', () => {
|
||||||
|
const result = parseUrl({
|
||||||
|
str: '//foo.com/bar',
|
||||||
|
parseQuery: dummyQueryParser,
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
hostname: 'foo.com',
|
||||||
|
paths: ['bar'],
|
||||||
|
queries: Object.create(null),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws if the string is not a valid URL', () => {
|
||||||
|
expect(() =>
|
||||||
|
parseUrl({ str: 'not a url', parseQuery: dummyQueryParser }),
|
||||||
|
).toThrowError('Invalid URL')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('omits protocol and hostname when not applicable', () => {
|
||||||
|
const r1 = parseUrl({ str: '/', parseQuery: dummyQueryParser })
|
||||||
|
expect(r1.protocol).toBeUndefined()
|
||||||
|
expect(r1.hostname).toBeUndefined()
|
||||||
|
|
||||||
|
const r2 = parseUrl({ str: '//host', parseQuery: dummyQueryParser })
|
||||||
|
expect(r2.protocol).toBeUndefined()
|
||||||
|
expect(r2.hostname).toBe('host')
|
||||||
|
})
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user