UtilityTabResults.utils.test.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { describe, expect, it } from 'vitest'
  2. import { getSqlErrorLines } from './UtilityTabResults.utils'
  3. describe('getSqlErrorLines', () => {
  4. it('returns formattedError lines when present', () => {
  5. const lines = getSqlErrorLines({
  6. message: 'permission denied for table users',
  7. formattedError:
  8. 'ERROR: 42501: permission denied for table users\n' +
  9. 'HINT: To grant access to anon on a specific table:\n' +
  10. ' GRANT SELECT ON TABLE public.users TO anon;',
  11. })
  12. expect(lines).toEqual([
  13. 'ERROR: 42501: permission denied for table users',
  14. 'HINT: To grant access to anon on a specific table:',
  15. ' GRANT SELECT ON TABLE public.users TO anon;',
  16. ])
  17. })
  18. it('strips empty lines from formattedError', () => {
  19. const lines = getSqlErrorLines({
  20. formattedError: 'ERROR: boom\n\nHINT: retry\n',
  21. })
  22. expect(lines).toEqual(['ERROR: boom', 'HINT: retry'])
  23. })
  24. it('falls back to message lines when formattedError is missing and message is multi-line', () => {
  25. const lines = getSqlErrorLines({
  26. message:
  27. 'ERROR: 42501: permission denied for table users\n' +
  28. 'HINT: To grant access to anon on a specific table:\n' +
  29. ' GRANT SELECT ON TABLE public.users TO anon;',
  30. })
  31. expect(lines).toEqual([
  32. 'ERROR: 42501: permission denied for table users',
  33. 'HINT: To grant access to anon on a specific table:',
  34. ' GRANT SELECT ON TABLE public.users TO anon;',
  35. ])
  36. })
  37. it('returns empty array for a single-line message so callers render the fallback', () => {
  38. const lines = getSqlErrorLines({ message: 'permission denied for table users' })
  39. expect(lines).toEqual([])
  40. })
  41. it('returns empty array when both fields are missing', () => {
  42. expect(getSqlErrorLines({})).toEqual([])
  43. })
  44. it('returns empty array when message is an empty string', () => {
  45. expect(getSqlErrorLines({ message: '' })).toEqual([])
  46. })
  47. it('returns empty array when message only contains whitespace newlines', () => {
  48. // Only empty segments after filtering — treated as single-line
  49. expect(getSqlErrorLines({ message: '\n\n' })).toEqual([])
  50. })
  51. it('prefers formattedError even when message is also multi-line', () => {
  52. const lines = getSqlErrorLines({
  53. message: 'message line 1\nmessage line 2',
  54. formattedError: 'formatted line 1\nformatted line 2',
  55. })
  56. expect(lines).toEqual(['formatted line 1', 'formatted line 2'])
  57. })
  58. it('falls through to message when formattedError is empty string', () => {
  59. const lines = getSqlErrorLines({
  60. message: 'ERROR: line 1\nHINT: line 2',
  61. formattedError: '',
  62. })
  63. expect(lines).toEqual(['ERROR: line 1', 'HINT: line 2'])
  64. })
  65. })