import { describe, expect, it } from 'vitest'
import { isTransactionCapabilityError } from './index.js'
import type { Database, TransactionalDatabase, Querier, PostgresTransaction, Transaction } from './index.js'

describe('db dialect-agnostic types', () => {
  it('Querier accepts Database', () => {
    const db = {} as Database<{}>
    const q: Querier<{}> = db
    void q
  })

  it('Querier accepts PostgresTransaction', () => {
    const tx = {} as PostgresTransaction<{}>
    const q: Querier<{}> = tx
    void q
  })

  it('TransactionalDatabase extends Database', () => {
    const txDb = {} as TransactionalDatabase<{}>
    const db: Database<{}> = txDb
    void db
  })

  it('rejects incomplete structural transaction errors', () => {
    expect(isTransactionCapabilityError({ code: 'transaction-capability' })).toBe(false)
    expect(isTransactionCapabilityError({
      code: 'transaction-capability',
      reason: 'inactive',
    })).toBe(true)
  })

  it('requires callback-minted transactions for mutations', () => {
    const databaseIsTransaction: Database<{}> extends Transaction<{}> ? true : false = false
    void databaseIsTransaction
  })

  it('assigns a combined transaction to each narrow schema without a cast', () => {
    type ContentSchema = { content: unknown }
    type FieldsSchema = { fields: unknown }
    type CombinedSchema = ContentSchema & FieldsSchema

    const combined = {} as Transaction<CombinedSchema>
    const content: Transaction<ContentSchema> = combined
    const fields: Transaction<FieldsSchema> = combined
    void content
    void fields
  })
})
