sql-parameters.test.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { describe, expect, it } from 'vitest'
  2. import { parseParameters, processParameterizedSql } from './sql-parameters'
  3. describe('parseParameters', () => {
  4. it('parses simple :param without @set', () => {
  5. const result = parseParameters('SELECT * FROM table WHERE id = :userId')
  6. expect(result).toEqual([
  7. {
  8. name: 'userId',
  9. value: '',
  10. defaultValue: undefined,
  11. type: undefined,
  12. possibleValues: undefined,
  13. occurrences: 1,
  14. },
  15. ])
  16. })
  17. it('parses @set with type and value', () => {
  18. const result = parseParameters('@set userId:int = 123\nSELECT * FROM table WHERE id = :userId')
  19. const userIdParam = result.find((p) => p.name === 'userId')
  20. expect(userIdParam?.defaultValue).toBe('123')
  21. expect(userIdParam?.type).toBe('int')
  22. })
  23. it('parses union type', () => {
  24. const result = parseParameters(
  25. '@set status:open|closed = open\nSELECT * FROM users WHERE status = :status'
  26. )
  27. const statusParam = result.find((p) => p.name === 'status')
  28. expect(statusParam?.type).toBe('enum')
  29. expect(statusParam?.possibleValues).toEqual(['open', 'closed'])
  30. })
  31. it('counts multiple occurrences', () => {
  32. const result = parseParameters('SELECT * FROM table WHERE id = :userId OR owner_id = :userId')
  33. const userIdParam = result.find((p) => p.name === 'userId')
  34. expect(userIdParam?.occurrences).toBe(2)
  35. })
  36. })
  37. describe('processParameterizedSql', () => {
  38. it('replaces :param with value from parameters', () => {
  39. const sql = 'SELECT * FROM users WHERE id = :userId'
  40. const result = processParameterizedSql(sql, { userId: '42' })
  41. expect(result).toBe('SELECT * FROM users WHERE id = 42')
  42. })
  43. it('uses default from @set if param not provided', () => {
  44. const sql = '@set userId:int = 123\nSELECT * FROM users WHERE id = :userId'
  45. const result = processParameterizedSql(sql, {})
  46. expect(result).toBe('SELECT * FROM users WHERE id = 123')
  47. })
  48. it('overrides @set default if param is provided', () => {
  49. const sql = '@set userId:int = 123\nSELECT * FROM users WHERE id = :userId'
  50. const result = processParameterizedSql(sql, { userId: '999' })
  51. expect(result).toBe('SELECT * FROM users WHERE id = 999')
  52. })
  53. it('throws if no param value is provided and no default exists', () => {
  54. const sql = 'SELECT * FROM users WHERE id = :userId'
  55. expect(() => processParameterizedSql(sql, {})).toThrowError(
  56. 'Missing value for parameter: userId'
  57. )
  58. })
  59. it('removes @set lines from final SQL', () => {
  60. const sql = '@set status:open|closed = open\nSELECT * FROM items WHERE status = :status'
  61. const result = processParameterizedSql(sql, {})
  62. expect(result).toBe('SELECT * FROM items WHERE status = open')
  63. expect(result).not.toContain('@set')
  64. })
  65. })