Files
OpenOPC/opc/plugins/office_ui/frontend_src/chat/RecruitmentPanel.test.tsx
T
2026-07-01 17:56:31 +08:00

89 lines
3.1 KiB
TypeScript

import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import React from 'react'
import { renderToStaticMarkup } from 'react-dom/server'
import { RecruitmentPanel } from './RecruitmentPanel'
const markup = renderToStaticMarkup(
React.createElement(RecruitmentPanel, {
meta: {
checkpoint_type: 'company_recruitment_confirmation',
checkpoint_id: 'cp-recruit',
company_profile: 'corporate',
summary: 'Company mode has a pending staffing decision before execution.',
proposals: [
{
role_id: 'senior_engineer',
status: 'proposed_hire',
rationale: 'Selected the strongest backend option.',
role_labels: ['Senior Engineer'],
candidate: {
template_id: 'engineering-backend-architect',
template_name: 'Backend Architect',
category: 'engineering',
domains: ['backend', 'api'],
proposed_name: 'Backend Architect',
rationale: 'Strong API architecture fit.',
},
existing_employee_ids: [],
default_agent: 'codex',
selected_agent: 'codex',
},
],
recruitment_rationales: [
{
role_id: 'senior_engineer',
role_label: 'Senior Engineer',
status: 'proposed_hire',
selection_label: 'Backend Architect',
rationale: 'Strong API architecture fit.',
},
],
staffing_roles: [
{
role_id: 'senior_engineer',
role_label: 'Senior Engineer',
default_selection: { kind: 'template', id: 'engineering-backend-architect' },
default_agent: 'codex',
selected_agent: 'codex',
same_role_employee_ids: [],
},
],
staffing_pool: {
employees: [],
templates: [
{
template_id: 'engineering-backend-architect',
template_name: 'Backend Architect',
category: 'engineering',
domains: ['backend', 'api'],
},
],
},
staffing_selections: {
senior_engineer: { kind: 'template', id: 'engineering-backend-architect' },
},
},
onReply: () => undefined,
responded: false,
}),
)
assert.match(markup, /Recruitment Review/)
assert.match(markup, /Strong API architecture fit/)
assert.match(markup, /ckpt-staffing-grid/)
assert.match(markup, /Backend Architect/)
assert.match(markup, /Approve/)
assert.match(markup, /Send Feedback/)
assert.doesNotMatch(markup, /Deny/)
const source = readFileSync(new URL('./RecruitmentPanel.tsx', import.meta.url), 'utf8')
assert.match(source, /buildReplyMetadata\('approve'\)/)
assert.match(source, /buildReplyMetadata\('feedback'\)/)
assert.match(source, /recruitment_agent: recruitmentAgent/)
assert.match(source, /hasSubmittedCheckpointMetadata/, 'responded recruitment cards must detect persisted reply metadata')
assert.match(source, /setRoleAgents\(buildRoleAgentsFromMeta\(meta, roles\)\)/, 'responded recruitment cards must sync displayed agent choices from reply metadata')
console.log('RecruitmentPanel.test.tsx: OK (recruitment review uses staffing-style UI)')