File size: 2,118 Bytes
adb91eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import { describe, it, expect } from 'vitest'
import { render, screen } from '@testing-library/react'
import { I18nProvider } from '../i18n'
import { AgentTrace } from './AgentTrace'
import type { OrchestrateResult } from '../api/ai'

function make(over: Partial<OrchestrateResult>): OrchestrateResult {
  return {
    decision: 'step_up', reason_codes: [], required_auth: [], agent_state: 'policy_evaluated',
    risk: { band: 'low', recommend_step_up: false, reason_codes: [], confidence: 'ok',
      model_version: 'v1', feature_version: 'v1', shadow: true },
    auth_recommendation: { recommended_method: 'webauthn', meets_pdp_minimum: true },
    rails: { ranked: ['sarie'], eligible_only: true }, explanation: null, payment: null,
    audit: { verified: true, length: 3, protection_level: 'x' }, fallback: null, labels: {},
    ...over,
  }
}

const r = (res: OrchestrateResult) =>
  render(<I18nProvider initial="en"><AgentTrace result={res} /></I18nProvider>)

describe('AgentTrace', () => {
  it('marks deterministic policy authoritative and risk advisory', () => {
    r(make({}))
    expect(screen.getByText('Deterministic policy')).toBeInTheDocument()
    expect(screen.getByText('Authoritative')).toBeInTheDocument()
    expect(screen.getAllByText('Advisory only').length).toBeGreaterThan(0)
  })

  it('shows Payment Core NOT executed unless initiated', () => {
    r(make({ agent_state: 'policy_evaluated' }))
    expect(screen.getAllByText('Not executed').length).toBeGreaterThan(0)
  })

  it('shows Payment Core executed only when initiated', () => {
    r(make({ agent_state: 'initiated', payment: { id: 'pay_1', status: 'processing' } }))
    expect(screen.getByText('pay_1')).toBeInTheDocument()
    expect(screen.getByText('Executed')).toBeInTheDocument()
  })

  it('never labels a reasoning agent as a payment executor', () => {
    const { container } = r(make({}))
    // the executor row is Payment Core; risk/context/auth/rail carry Advisory, never Executed
    const advisorySteps = container.querySelectorAll('.role-advisory')
    expect(advisorySteps.length).toBeGreaterThan(0)
  })
})