Files
jiapuapp/tests/t03-t08-member-flow-contract.ps1
T
2026-07-21 07:53:08 +08:00

65 lines
3.0 KiB
PowerShell

$ErrorActionPreference = 'Stop'
function Assert-Contains {
param([string]$Content, [string]$Expected, [string]$Message)
if ($Content -notmatch [regex]::Escape($Expected)) { throw $Message }
}
$root = Split-Path -Parent $PSScriptRoot
$paths = @(
'pages/tree/t03-member-profile.vue',
'pages/tree/t04-add-relative.vue',
'pages/tree/t05-edit-member.vue',
'pages/tree/t06-edit-relationship.vue',
'pages/tree/t07-member-directory.vue',
'pages/tree/t08-member-states.vue'
)
$pages = @{}
foreach ($path in $paths) {
$content = Get-Content -LiteralPath (Join-Path $root $path) -Raw -Encoding utf8
if ($content -match '<ModulePage(?:\s|>)') { throw "$path must not retain ModulePage" }
if ($content -match "@/utils/api\.js|\bappApi\b") { throw "$path must not connect the API layer" }
$pages[$path] = $content
}
foreach ($path in @('pages/tree/t03-member-profile.vue', 'pages/tree/t07-member-directory.vue', 'pages/tree/t08-member-states.vue')) {
Assert-Contains $pages[$path] 'ModulePageBackground' "$path must use the tree module background"
}
$t03 = $pages['pages/tree/t03-member-profile.vue']
foreach ($required in @('member-state--detail', 'member-state--error', 't01-state-panel.png', 't07-search-input-frame.png', '/pages/tree/t05-edit-member', 'query.personId')) {
Assert-Contains $t03 $required "Missing T03 contract: $required"
}
$specializedForms = @{
't04-add-relative.vue' = @('add-state--form', 'add-state--success', 'add-relative-form', 'relationOptions')
't05-edit-member.vue' = @('edit-state--form', 'edit-state--success', 'edit-member-form', 'memberFixtures')
't06-edit-relationship.vue' = @('relationship-state--form', 'relationship-state--conflict', 'relationship-form', 'relationshipOptions')
}
foreach ($entry in $specializedForms.GetEnumerator()) {
$content = $pages["pages/tree/$($entry.Key)"]
if ($content -match '<TreeMemberForm(?:\s|/|>)|import\s+TreeMemberForm') {
throw "$($entry.Key) must own its business workflow instead of TreeMemberForm"
}
foreach ($required in $entry.Value) {
Assert-Contains $content $required "Missing specialized form contract in $($entry.Key): $required"
}
}
$t07 = $pages['pages/tree/t07-member-directory.vue']
foreach ($required in @('directory-state--list', 'directory-state--empty', 'directory-state--error', 'list-slip-frame.png', 'directory-card__status', '/pages/tree/t03-member-profile')) {
Assert-Contains $t07 $required "Missing T07 contract: $required"
}
$t08 = $pages['pages/tree/t08-member-states.vue']
foreach ($required in @('member-status--privacy', 'member-status--deceased', 'member-status--forbidden', 't01-state-panel.png', 'query.state')) {
Assert-Contains $t08 $required "Missing T08 contract: $required"
}
$catalog = Get-Content -LiteralPath (Join-Path $root 'data/page-catalog.js') -Raw -Encoding utf8
foreach ($entry in @('t04:', 't05:', 't06:', 't07:', 't08:')) {
if ($catalog -match [regex]::Escape($entry)) { throw "Page catalog must remove migrated entry: $entry" }
}
Write-Output 'T03-T08-MEMBER-FLOW-CONTRACT PASS'