CreateCronJobSheet.constants.test.ts 2.7 KB

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