http-url.test.ts62 lines · main
1import { describe, expect, it } from 'vitest'
2
3import { httpEndpointUrlSchema, isValidHttpEndpointUrl } from './http-url'
4
5const schema = httpEndpointUrlSchema({
6 requiredMessage: 'required',
7 invalidMessage: 'invalid',
8 prefixMessage: 'prefix',
9})
10
11describe('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
26describe('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})