import { describe, expect, it } from 'vitest'
import type { Querier } from '@platform-modules/db'
import { CartMigrateError, isCartMigrateError, pushSchema } from './migrate.js'
import { createPgliteClient } from '@platform-modules/db/pglite'
import { cartSchema } from './schema.js'

describe('commerce-cart store-db migrate', () => {
  it('pushSchema is idempotent (CREATE … IF NOT EXISTS) on a fresh and re-run DB', async () => {
    const db = createPgliteClient({ schema: cartSchema })
    await pushSchema(db)
    await expect(pushSchema(db)).resolves.toBeUndefined()
  })

  it('wraps an underlying execute failure in CartMigrateError, carrying the root cause', async () => {
    const failing = {
      execute: async () => {
        throw new Error('boom: relation already exists differently')
      },
    } as unknown as Querier<typeof cartSchema>

    await expect(pushSchema(failing)).rejects.toMatchObject({
      name: 'CartMigrateError',
      code: 'CART_MIGRATE',
    })
    await expect(pushSchema(failing)).rejects.toThrow(/boom: relation already exists differently/)
  })

  it('isCartMigrateError narrows structurally (name+code), not by instanceof', () => {
    expect(isCartMigrateError(new CartMigrateError('boom'))).toBe(true)
    expect(isCartMigrateError({ name: 'CartMigrateError', code: 'CART_MIGRATE' })).toBe(true)
    expect(isCartMigrateError({})).toBe(false)
    expect(isCartMigrateError(null)).toBe(false)
    expect(isCartMigrateError({ name: 'CartMigrateError', code: 'WRONG' })).toBe(false)
  })
})
