EditHookPanel.constants.test.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { describe, expect, it } from 'vitest'
  2. import { FormSchema } from './EditHookPanel.constants'
  3. describe('EditHookPanel FormSchema', () => {
  4. it('rejects incomplete http_request hostnames', () => {
  5. const result = FormSchema.safeParse({
  6. name: 'Test hook',
  7. table_id: 'public.messages',
  8. http_method: 'POST' as const,
  9. timeout_ms: 1000,
  10. events: ['INSERT'],
  11. httpHeaders: [],
  12. httpParameters: [],
  13. function_type: 'http_request' as const,
  14. http_url: 'https://webhook',
  15. })
  16. expect(result.success).toBe(false)
  17. if (!result.success) {
  18. expect(
  19. result.error.issues.some((issue) => issue.message === 'Please provide a valid URL')
  20. ).toBe(true)
  21. }
  22. })
  23. it('rejects http_request URLs without an explicit protocol', () => {
  24. const result = FormSchema.safeParse({
  25. name: 'Test hook',
  26. table_id: 'public.messages',
  27. http_method: 'POST' as const,
  28. timeout_ms: 1000,
  29. events: ['INSERT'],
  30. httpHeaders: [],
  31. httpParameters: [],
  32. function_type: 'http_request' as const,
  33. http_url: 'hooks.example.com/webhook',
  34. })
  35. expect(result.success).toBe(false)
  36. if (!result.success) {
  37. expect(
  38. result.error.issues.some(
  39. (issue) => issue.message === 'Please prefix your URL with http:// or https://'
  40. )
  41. ).toBe(true)
  42. }
  43. })
  44. it('rejects key-only webhook headers', () => {
  45. const result = FormSchema.safeParse({
  46. name: 'Test hook',
  47. table_id: 'public.messages',
  48. http_method: 'POST' as const,
  49. timeout_ms: 1000,
  50. events: ['INSERT'],
  51. httpHeaders: [{ id: 'header-1', name: 'X-Test', value: '' }],
  52. httpParameters: [],
  53. function_type: 'http_request' as const,
  54. http_url: 'https://hooks.example.com/webhook',
  55. })
  56. expect(result.success).toBe(false)
  57. if (!result.success) {
  58. expect(
  59. result.error.issues.some((issue) => issue.message === 'Header value is required')
  60. ).toBe(true)
  61. }
  62. })
  63. it('rejects value-only webhook parameters', () => {
  64. const result = FormSchema.safeParse({
  65. name: 'Test hook',
  66. table_id: 'public.messages',
  67. http_method: 'POST' as const,
  68. timeout_ms: 1000,
  69. events: ['INSERT'],
  70. httpHeaders: [],
  71. httpParameters: [{ id: 'param-1', name: '', value: 'tenant' }],
  72. function_type: 'http_request' as const,
  73. http_url: 'https://hooks.example.com/webhook',
  74. })
  75. expect(result.success).toBe(false)
  76. if (!result.success) {
  77. expect(
  78. result.error.issues.some((issue) => issue.message === 'Parameter name is required')
  79. ).toBe(true)
  80. }
  81. })
  82. })