diff --git a/tests/catalog-positioning-regression.test.mjs b/tests/catalog-positioning-regression.test.mjs index cd02b6f..e6266a6 100644 --- a/tests/catalog-positioning-regression.test.mjs +++ b/tests/catalog-positioning-regression.test.mjs @@ -51,7 +51,12 @@ test('privacy-policy recovery is constrained to 17 observed stale public routes' assert.match(script,/--dry-run/); assert.match(script,/--check-live/); assert.match(script,/--apply/); - assert.match(script,/rsync -avR --itemize-changes/); + // Production runner overrides flags for its low-privilege account. Require the + // safe default and actual rsync invocation instead of a hardcoded literal. + assert.ok(script.includes('rsync_flags="${APP_SITE_RSYNC_FLAGS:--avR --itemize-changes}"')); + assert.ok(script.includes('rsync $rsync_flags ')); + assert.ok(script.includes('flags=(--dry-run)')); + assert.ok(script.includes('[[ "$mode" == \'--apply\' ]] && flags=()')); assert.match(script,/python3 - "\$file" "\$tmp"/); assert.doesNotMatch(script,/rsync[^\n]*--delete/); assert.doesNotMatch(script,/rsync[^\n]*-e\s+sh/); diff --git a/tests/search-landing-growth.test.mjs b/tests/search-landing-growth.test.mjs index 165c63d..6597dc3 100644 --- a/tests/search-landing-growth.test.mjs +++ b/tests/search-landing-growth.test.mjs @@ -58,7 +58,11 @@ test('public catalog icons are crawlable and explicit VPS release is non-destruc assert.match(pub,/support\/snaplingo\/index\.html/); assert.match(pub,/support\/face-reaction-battle\/index\.html/); assert.match(pub,/robots\.txt/); - assert.match(pub,/rsync -avR --itemize-changes/); + assert.ok(pub.includes('rsync_flags="${APP_SITE_RSYNC_FLAGS:--avR --itemize-changes}"')); + assert.ok(pub.includes('rsync $rsync_flags ')); + assert.ok(pub.includes('--dry-run) flags=(--dry-run)')); + assert.ok(pub.includes('--apply) flags=()')); + assert.doesNotMatch(pub,/^rsync[^\n]*--delete/m); const live=read('scripts/check_app_discovery_live.sh'); assert.match(live,/data-position="hero"/); assert.match(live,/Allow: \/icons\/apps\//);