import { describe, expect, it } from 'vitest'
import { createLocationResolverRegistry } from './location.js'

describe('location rules',()=>{
  it('evaluates outer OR / inner AND across built-ins and taxonomy/roles',async()=>{
    const registry=createLocationResolverRegistry()
    await expect(registry.evaluate([
      [{parameter:'entityType',operator:'eq',value:'product'},{parameter:'status',operator:'eq',value:'published'}],
      [{parameter:'actorRole',operator:'contains',value:'editor'}],
    ],{entityType:'post',status:'draft',actorRoles:['editor']})).resolves.toBe(true)
    await expect(registry.evaluate([[{parameter:'taxonomy:topic',operator:'contains',value:'news'}]],{entityType:'post',taxonomy:{topic:['news','tech']}})).resolves.toBe(true)
  })

  it('fails closed on duplicate, unknown, and throwing resolvers',async()=>{
    expect(()=>createLocationResolverRegistry({builtIns:[{parameter:'x',resolve:()=>1},{parameter:'x',resolve:()=>2}]})).toThrowError(expect.objectContaining({name:'FieldValidationError'}))
    const registry=createLocationResolverRegistry({builtIns:[{parameter:'explode',resolve:()=>{throw new Error('secret')}}]})
    await expect(registry.evaluate([[{parameter:'missing',operator:'eq',value:'x'}]],{entityType:'x'})).rejects.toMatchObject({name:'FieldValidationError'})
    await expect(registry.evaluate([[{parameter:'explode',operator:'eq',value:1}]],{entityType:'x'})).rejects.toMatchObject({name:'FieldValidationError'})
  })
})
