import { describe, expect, it, vi } from 'vitest'
import { createBlobStorage } from '../../src/blob'
import { FilesystemStorage } from '../../src/blob/filesystem-storage'
import { MemoryStorage } from '../../src/blob/memory-storage'
import { S3Storage } from '../../src/blob/s3-storage'

vi.mock('@aws-sdk/client-s3', () => ({
  S3Client: class {},
}), { virtual: true })

describe('createBlobStorage', () => {
  it.each([
    {
      config: { type: 'memory' as const },
      expected: MemoryStorage,
      description: 'memory storage',
    },
    {
      config: { type: 'filesystem' as const, filesystem: { basePath: '/tmp/dbal-blob-test' } },
      expected: FilesystemStorage,
      description: 'filesystem storage',
    },
    {
      config: { type: 's3' as const, s3: { bucket: 'test-bucket', region: 'us-east-1' } },
      expected: S3Storage,
      description: 's3 storage',
    },
  ])('creates $description', ({ config, expected }) => {
    const storage = createBlobStorage(config)
    expect(storage).toBeInstanceOf(expected)
  })

  it('throws for unknown type', () => {
    expect(() => createBlobStorage({ type: 'unknown' as 'memory' })).toThrow(
      'Unknown blob storage type: unknown'
    )
  })
})
