import { describe, expect, it } from 'vitest'
import {
  FieldValidationError, FieldGroupConflictError, FieldAuthorizationError, FieldStoreError,
  isFieldValidationError, isFieldGroupConflictError, isFieldAuthorizationError, isFieldStoreError,
} from './errors.js'

describe('errors', () => {
  it('carry contextful fields + name', () => {
    const v = new FieldValidationError('material', 'required')
    expect(v.name).toBe('FieldValidationError'); expect(v.field).toBe('material'); expect(v.detail).toBe('required')
    const c = new FieldGroupConflictError('attrs', 'shadows code key')
    expect(c.key).toBe('attrs')
    const a = new FieldAuthorizationError('u1', 'editFields')
    expect(a.actorId).toBe('u1'); expect(a.action).toBe('editFields')
    expect(new FieldStoreError('check violation').detail).toBe('check violation')
  })
  it('structural guards match by shape, not instanceof', () => {
    expect(isFieldValidationError(new FieldValidationError('k', 'd'))).toBe(true)
    expect(isFieldValidationError({ name: 'FieldValidationError', field: 'k', detail: 'd' })).toBe(true)
    expect(isFieldValidationError(new Error('x'))).toBe(false)
    expect(isFieldGroupConflictError(new FieldGroupConflictError('k', 'd'))).toBe(true)
    expect(isFieldAuthorizationError(new FieldAuthorizationError('u', 'a'))).toBe(true)
    expect(isFieldStoreError(new FieldStoreError('d'))).toBe(true)
  })
})
