Files
jiapuapp/tests/g05-data-ownership-contract.ps1
T
2026-07-23 08:24:07 +08:00

21 lines
1.9 KiB
PowerShell

$ErrorActionPreference = 'Stop'
$root = Split-Path -Parent $PSScriptRoot
$page = Get-Content -LiteralPath (Join-Path $root 'pages/genealogy/g05-genealogy-overview.vue') -Raw -Encoding UTF8
$mock = Get-Content -LiteralPath (Join-Path $root 'data/mock.js') -Raw -Encoding UTF8
foreach ($token in @('findGenealogyFixture', 'getGenealogyFixtureAccess', 'getGenealogyAccessPresetLabel', 'access.canView', 'ancestorName', 'updatedAt')) {
if (-not $page.Contains($token)) { throw "G05 data ownership contract missing: $token" }
}
if ($page -notmatch '(?s)const access = getGenealogyFixtureAccess\(genealogyId\.value\);\s*if \(!access\.canView\) \{\s*overviewState\.value = "no-permission";\s*return;\s*\}') {
throw 'G05 must fail closed before exposing a fixture that the current role cannot view'
}
foreach ($token in @('export const publicGenealogies', 'export const createLocalGenealogyPreview', 'export const updateLocalGenealogyPreviewAncestor', 'export const findGenealogyFixture', 'export const getGenealogyFixtureAccess', 'fixture?.localPreview', "memberFixture?.membership === 'created'", "memberFixture?.membership === 'joined'")) {
if (-not $mock.Contains($token)) { throw "Shared genealogy fixture ownership missing: $token" }
}
foreach ($forbidden in @('overviewFixtures', 'query.genealogyName', 'query.role', 'query.mode')) {
if ($page.Contains($forbidden)) { throw "G05 retains duplicate or untrusted data owner: $forbidden" }
}
if ($page.Contains('getGenealogyVisibilityLabel') -or $page.Contains('genealogy.visibility')) { throw 'G05 retains the deleted visibility-only contract' }
if ($mock -match "(?s)const localCreatedGenealogy = \{.*?membership:\s*'created'") { throw 'Local-created URL fixture must never grant owner membership' }
if ($page.Contains('class="overview-action-lock"')) { throw 'G05 ordinary members must not see inert management lock cards' }
Write-Output 'G05-DATA-OWNERSHIP-CONTRACT PASS'