fix: preserve route limits and harden restore marker
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import { expect, test } from 'bun:test';
|
||||
import {
|
||||
parseRestoreMarkerPhase,
|
||||
RESTORE_MARKER_CONFIRMATION,
|
||||
validateRestoreMarkerTarget,
|
||||
validateRestoreMarkerWrite,
|
||||
} from '../src/lib/server/restore-marker';
|
||||
|
||||
test('restore marker defaults to a non-writing verification phase', () => {
|
||||
expect(parseRestoreMarkerPhase(undefined)).toBe('verify');
|
||||
expect(parseRestoreMarkerPhase('')).toBe('verify');
|
||||
});
|
||||
|
||||
test('restore marker rejects non-loopback targets before any backend call', () => {
|
||||
expect(() => validateRestoreMarkerTarget(undefined)).toThrow('required');
|
||||
expect(() => validateRestoreMarkerTarget('https://production.example.test')).toThrow('loopback');
|
||||
expect(() => validateRestoreMarkerTarget('http://192.0.2.10:3210')).toThrow('loopback');
|
||||
expect(validateRestoreMarkerTarget('http://127.0.0.1:3210').hostname).toBe('127.0.0.1');
|
||||
});
|
||||
|
||||
test('restore marker requires explicit disposable confirmation for writes', () => {
|
||||
expect(() => validateRestoreMarkerWrite({ phase: 'write', allowWrite: undefined, confirmation: undefined })).toThrow('SMOKE_ALLOW_WRITE');
|
||||
expect(() => validateRestoreMarkerWrite({ phase: 'write', allowWrite: '1', confirmation: 'wrong' })).toThrow('RESTORE_MARKER_CONFIRMATION');
|
||||
expect(() => validateRestoreMarkerWrite({ phase: 'write', allowWrite: '1', confirmation: RESTORE_MARKER_CONFIRMATION })).not.toThrow();
|
||||
expect(() => validateRestoreMarkerWrite({ phase: 'verify', allowWrite: undefined, confirmation: undefined })).not.toThrow();
|
||||
});
|
||||
@@ -6,6 +6,9 @@ const compose = readFileSync('compose.yaml', 'utf8');
|
||||
const dockerfile = readFileSync('Dockerfile', 'utf8');
|
||||
const dockerignore = readFileSync('.dockerignore', 'utf8');
|
||||
const convexConfig = readFileSync('scripts/configure-convex.ts', 'utf8');
|
||||
const chatRoute = readFileSync('src/routes/api/chat/+server.ts', 'utf8');
|
||||
const syncRoute = readFileSync('src/routes/api/sync/+server.ts', 'utf8');
|
||||
const layoutRoute = readFileSync('src/routes/+layout.server.ts', 'utf8');
|
||||
|
||||
test('Gitea workflow keeps source checks separate and holds unverified container CI', () => {
|
||||
expect(workflow).toContain('pull_request:');
|
||||
@@ -16,9 +19,19 @@ test('Gitea workflow keeps source checks separate and holds unverified container
|
||||
expect(workflow).toContain('docker compose config --quiet');
|
||||
expect(workflow).toContain('docker build --build-arg APP_RELEASE_ID=fixture-ci');
|
||||
expect(workflow).toContain('GITHUB_RUN_ATTEMPT');
|
||||
expect(workflow).toContain('docker image rm "$image"');
|
||||
expect(workflow).toContain('--network none');
|
||||
});
|
||||
|
||||
test('Authenticated route limits remain user-keyed after rollout gates', () => {
|
||||
expect(chatRoute).toContain('chat:${current?.userId ?? event.getClientAddress()}');
|
||||
expect(syncRoute).toContain('sync:${current?.userId ?? event.getClientAddress()}');
|
||||
expect(chatRoute.indexOf("capabilityEnabled('assistant_dispatch'")).toBeLessThan(chatRoute.indexOf('const current = await session(event)'));
|
||||
expect(syncRoute.indexOf("capabilityEnabled('asset_sync'")).toBeLessThan(syncRoute.indexOf('const current = await session(event)'));
|
||||
expect(layoutRoute).toContain('assistant_dispatch');
|
||||
expect(layoutRoute).toContain('sessionNeeded');
|
||||
});
|
||||
|
||||
test('Compose and Docker defaults are isolated and digest-pinned', () => {
|
||||
expect(compose).toContain('CONVEX_BIND_ADDRESS:-127.0.0.1');
|
||||
expect(compose).toContain('WEB_BIND_ADDRESS:-127.0.0.1');
|
||||
|
||||
Reference in New Issue
Block a user