89 lines
3.1 KiB
TypeScript
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)')
|