CreateCronJobSheet.constants.test.ts99 lines · main
1import { describe, expect, it } from 'vitest'
2
3import { FormSchema } from './CreateCronJobSheet.constants'
4
5describe('CreateCronJobSheet FormSchema', () => {
6 it('rejects incomplete http_request hostnames', () => {
7 const result = FormSchema.safeParse({
8 name: 'Send webhook',
9 supportsSeconds: false,
10 schedule: '* * * * *',
11 values: {
12 type: 'http_request' as const,
13 method: 'POST' as const,
14 endpoint: 'https://webhook',
15 timeoutMs: 1000,
16 httpHeaders: [],
17 snippet: '',
18 },
19 })
20
21 expect(result.success).toBe(false)
22 if (!result.success) {
23 expect(
24 result.error.issues.some((issue) => issue.message === 'Please provide a valid URL')
25 ).toBe(true)
26 }
27 })
28
29 it('rejects http_request URLs without an explicit protocol', () => {
30 const result = FormSchema.safeParse({
31 name: 'Send webhook',
32 supportsSeconds: false,
33 schedule: '* * * * *',
34 values: {
35 type: 'http_request' as const,
36 method: 'POST' as const,
37 endpoint: 'hooks.example.com/webhook',
38 timeoutMs: 1000,
39 httpHeaders: [],
40 snippet: '',
41 },
42 })
43
44 expect(result.success).toBe(false)
45 if (!result.success) {
46 expect(
47 result.error.issues.some(
48 (issue) => issue.message === 'Please prefix your URL with http:// or https://'
49 )
50 ).toBe(true)
51 }
52 })
53
54 it('rejects key-only http_request headers', () => {
55 const result = FormSchema.safeParse({
56 name: 'Send webhook',
57 supportsSeconds: false,
58 schedule: '* * * * *',
59 values: {
60 type: 'http_request' as const,
61 method: 'POST' as const,
62 endpoint: 'https://hooks.example.com/webhook',
63 timeoutMs: 1000,
64 httpHeaders: [{ name: 'X-Test', value: '' }],
65 snippet: '',
66 },
67 })
68
69 expect(result.success).toBe(false)
70 if (!result.success) {
71 expect(
72 result.error.issues.some((issue) => issue.message === 'Header value is required')
73 ).toBe(true)
74 }
75 })
76
77 it('rejects value-only edge function headers', () => {
78 const result = FormSchema.safeParse({
79 name: 'Invoke edge function',
80 supportsSeconds: false,
81 schedule: '* * * * *',
82 values: {
83 type: 'edge_function' as const,
84 method: 'POST' as const,
85 edgeFunctionName: 'my-function',
86 timeoutMs: 1000,
87 httpHeaders: [{ name: '', value: 'test-value' }],
88 snippet: '',
89 },
90 })
91
92 expect(result.success).toBe(false)
93 if (!result.success) {
94 expect(result.error.issues.some((issue) => issue.message === 'Header name is required')).toBe(
95 true
96 )
97 }
98 })
99})