CreateCronJobSheet.constants.test.ts99 lines · main
| 1 | import { describe, expect, it } from 'vitest' |
| 2 | |
| 3 | import { FormSchema } from './CreateCronJobSheet.constants' |
| 4 | |
| 5 | describe('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 | }) |