http-url.test.ts62 lines · main
| 1 | import { describe, expect, it } from 'vitest' |
| 2 | |
| 3 | import { httpEndpointUrlSchema, isValidHttpEndpointUrl } from './http-url' |
| 4 | |
| 5 | const schema = httpEndpointUrlSchema({ |
| 6 | requiredMessage: 'required', |
| 7 | invalidMessage: 'invalid', |
| 8 | prefixMessage: 'prefix', |
| 9 | }) |
| 10 | |
| 11 | describe('isValidHttpEndpointUrl', () => { |
| 12 | it('accepts valid http and https endpoints', () => { |
| 13 | expect(isValidHttpEndpointUrl('https://api.supabase.com/webhooks')).toBe(true) |
| 14 | expect(isValidHttpEndpointUrl('http://localhost:3000/hooks')).toBe(true) |
| 15 | expect(isValidHttpEndpointUrl('https://127.0.0.1:4318/v1/logs')).toBe(true) |
| 16 | expect(isValidHttpEndpointUrl('https://[::1]:4318/v1/logs')).toBe(true) |
| 17 | }) |
| 18 | |
| 19 | it('rejects invalid endpoint URLs', () => { |
| 20 | expect(isValidHttpEndpointUrl('https://webhook')).toBe(false) |
| 21 | expect(isValidHttpEndpointUrl('ftp://api.supabase.com/webhooks')).toBe(false) |
| 22 | expect(isValidHttpEndpointUrl('not a url')).toBe(false) |
| 23 | }) |
| 24 | }) |
| 25 | |
| 26 | describe('httpEndpointUrlSchema', () => { |
| 27 | it('rejects empty values', () => { |
| 28 | const result = schema.safeParse('') |
| 29 | |
| 30 | expect(result.success).toBe(false) |
| 31 | if (!result.success) { |
| 32 | expect(result.error.issues[0].message).toBe('required') |
| 33 | } |
| 34 | }) |
| 35 | |
| 36 | it('rejects URLs without an http or https prefix', () => { |
| 37 | const result = schema.safeParse('api.supabase.com/webhooks') |
| 38 | |
| 39 | expect(result.success).toBe(false) |
| 40 | if (!result.success) { |
| 41 | expect(result.error.issues[0].message).toBe('prefix') |
| 42 | } |
| 43 | }) |
| 44 | |
| 45 | it('rejects incomplete hostnames', () => { |
| 46 | const result = schema.safeParse('https://webhook') |
| 47 | |
| 48 | expect(result.success).toBe(false) |
| 49 | if (!result.success) { |
| 50 | expect(result.error.issues[0].message).toBe('invalid') |
| 51 | } |
| 52 | }) |
| 53 | |
| 54 | it('accepts valid endpoints after trimming', () => { |
| 55 | const result = schema.safeParse(' https://api.supabase.com/webhooks ') |
| 56 | |
| 57 | expect(result.success).toBe(true) |
| 58 | if (result.success) { |
| 59 | expect(result.data).toBe('https://api.supabase.com/webhooks') |
| 60 | } |
| 61 | }) |
| 62 | }) |