21 lines
1.9 KiB
PowerShell
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'
|