extensions.test.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { afterAll, beforeAll, expect, test } from 'vitest'
  2. import pgMeta from '../src/index'
  3. import { cleanupRoot, createTestDatabase } from './db/utils'
  4. beforeAll(async () => {
  5. // Any global setup if needed
  6. })
  7. afterAll(async () => {
  8. await cleanupRoot()
  9. })
  10. const withTestDatabase = (
  11. name: string,
  12. fn: (db: Awaited<ReturnType<typeof createTestDatabase>>) => Promise<void>
  13. ) => {
  14. test(name, async () => {
  15. const db = await createTestDatabase()
  16. try {
  17. await fn(db)
  18. } finally {
  19. await db.cleanup()
  20. }
  21. })
  22. }
  23. withTestDatabase('list extensions', async ({ executeQuery }) => {
  24. const { sql, zod } = await pgMeta.extensions.list()
  25. const res = zod.parse(await executeQuery(sql))
  26. expect(res.find(({ name }) => name === 'hstore')).toMatchInlineSnapshot(
  27. { default_version: expect.stringMatching(/^\d+.\d+$/) },
  28. `
  29. {
  30. "comment": "data type for storing sets of (key, value) pairs",
  31. "default_version": StringMatching /\\^\\\\d\\+\\.\\\\d\\+\\$/,
  32. "installed_version": null,
  33. "name": "hstore",
  34. "schema": null,
  35. }
  36. `
  37. )
  38. })
  39. withTestDatabase('retrieve, create, update, delete extension', async ({ executeQuery }) => {
  40. // Create extensions schema
  41. await executeQuery('CREATE SCHEMA extensions;')
  42. // Create extension
  43. const { sql: createSql } = await pgMeta.extensions.create({ name: 'hstore', version: '1.4' })
  44. await executeQuery(createSql)
  45. // Retrieve extension
  46. const { sql: retrieveSql, zod: retrieveZod } = await pgMeta.extensions.retrieve({
  47. name: 'hstore',
  48. })
  49. const retrieve = await executeQuery(retrieveSql)
  50. const res = retrieveZod.parse(retrieve[0])
  51. expect(res).toMatchInlineSnapshot(
  52. {
  53. default_version: expect.stringMatching(/^\d+.\d+$/),
  54. },
  55. `
  56. {
  57. "comment": "data type for storing sets of (key, value) pairs",
  58. "default_version": StringMatching /\\^\\\\d\\+\\.\\\\d\\+\\$/,
  59. "installed_version": "1.4",
  60. "name": "hstore",
  61. "schema": "public",
  62. }
  63. `
  64. )
  65. // Update extension
  66. const { sql: updateSql } = await pgMeta.extensions.update('hstore', {
  67. update: true,
  68. schema: 'extensions',
  69. })
  70. await executeQuery(updateSql)
  71. // Verify update
  72. const { sql: verifyUpdateSql } = await pgMeta.extensions.retrieve({ name: 'hstore' })
  73. const updateRes = retrieveZod.parse((await executeQuery(verifyUpdateSql))[0])
  74. expect(updateRes).toMatchInlineSnapshot(
  75. {
  76. default_version: expect.stringMatching(/^\d+.\d+$/),
  77. installed_version: expect.stringMatching(/^\d+.\d+$/),
  78. },
  79. `
  80. {
  81. "comment": "data type for storing sets of (key, value) pairs",
  82. "default_version": StringMatching /\\^\\\\d\\+\\.\\\\d\\+\\$/,
  83. "installed_version": StringMatching /\\^\\\\d\\+\\.\\\\d\\+\\$/,
  84. "name": "hstore",
  85. "schema": "extensions",
  86. }
  87. `
  88. )
  89. // Remove extension
  90. const { sql: removeSql } = await pgMeta.extensions.remove('hstore')
  91. await executeQuery(removeSql)
  92. // Verify removal
  93. const { sql: verifyRemoveSql } = await pgMeta.extensions.retrieve({ name: 'hstore' })
  94. const finalRes = retrieveZod.parse((await executeQuery(verifyRemoveSql))[0])
  95. expect(finalRes).toMatchInlineSnapshot(
  96. { default_version: expect.stringMatching(/^\d+.\d+$/) },
  97. `
  98. {
  99. "comment": "data type for storing sets of (key, value) pairs",
  100. "default_version": StringMatching /\\^\\\\d\\+\\.\\\\d\\+\\$/,
  101. "installed_version": null,
  102. "name": "hstore",
  103. "schema": null,
  104. }
  105. `
  106. )
  107. })