19 lines
1.8 KiB
PowerShell
19 lines
1.8 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 @('appApi.getOverview', 'createRequestController', 'isRequestCancelled', 'getGenealogyAccessPresetLabel', 'result.accessRole', 'overviewRequestController.abort()', 'onUnload')) {
|
|
if (-not $page.Contains($token)) { throw "G05 data ownership contract missing: $token" }
|
|
}
|
|
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 ($page -match '@/data/mock\.js|findGenealogyFixture|getGenealogyFixtureAccess') { throw 'G05 remote overview must not retain fixture owners' }
|
|
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'
|