91 lines
2.7 KiB
TypeScript
91 lines
2.7 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
|
||
import { detectClaudeStartupState } from '@features/workspace-trust/core/application';
|
||
|
||
describe('StartupDialogRules', () => {
|
||
it('detects Claude workspace trust before a prompt-looking screen can be treated as ready', () => {
|
||
const state = detectClaudeStartupState(`
|
||
>
|
||
Quick safety check: Is this a project you created or one you trust?
|
||
Yes, I trust this folder
|
||
`);
|
||
|
||
expect(state).toMatchObject({
|
||
phase: 'dialog',
|
||
ruleId: 'claude.workspace_trust',
|
||
});
|
||
});
|
||
|
||
it('detects Claude workspace trust when the TUI collapses prompt spacing', () => {
|
||
const state = detectClaudeStartupState(`
|
||
Accessingworkspace:
|
||
/private/var/folders/project
|
||
Quicksafetycheck:Isthisaprojectyoucreatedoroneyoutrust?
|
||
ClaudeCode'llbeabletoread,edit,andexecutefileshere.
|
||
❯1.Yes,Itrustthisfolder
|
||
2.No,exit
|
||
Entertoconfirm·Esctocancel
|
||
`);
|
||
|
||
expect(state).toMatchObject({
|
||
phase: 'dialog',
|
||
ruleId: 'claude.workspace_trust',
|
||
});
|
||
});
|
||
|
||
it('detects Claude workspace trust through conservative fuzzy wording', () => {
|
||
const state = detectClaudeStartupState(`
|
||
Claude Code can read, edit, and execute files here.
|
||
Do you trust this workspace?
|
||
1. Yes, trust this workspace
|
||
2. No, exit
|
||
`);
|
||
|
||
expect(state).toMatchObject({
|
||
phase: 'dialog',
|
||
ruleId: 'claude.workspace_trust',
|
||
});
|
||
});
|
||
|
||
it('does not classify generic trust copy as Claude trust without Claude-specific context', () => {
|
||
expect(
|
||
detectClaudeStartupState(`
|
||
Do you trust this folder?
|
||
Yes, trust this folder
|
||
`)
|
||
).toEqual({ phase: 'loading' });
|
||
});
|
||
|
||
it('detects the Claude prompt marker only after trust/auth prompts have been ruled out', () => {
|
||
expect(detectClaudeStartupState('Claude Code\n>')).toEqual({
|
||
phase: 'ready',
|
||
evidence: ['claude prompt marker'],
|
||
});
|
||
});
|
||
|
||
it('detects Codex update before Codex workspace trust in the known startup chain', () => {
|
||
const update = detectClaudeStartupState('Update available\nSkip');
|
||
const trust = detectClaudeStartupState(
|
||
'Do you trust the contents of this directory?\nYes, continue'
|
||
);
|
||
|
||
expect(update).toMatchObject({
|
||
phase: 'dialog',
|
||
ruleId: 'codex.update_available',
|
||
});
|
||
expect(trust).toMatchObject({
|
||
phase: 'dialog',
|
||
ruleId: 'codex.workspace_trust',
|
||
});
|
||
});
|
||
|
||
it('classifies auth prompts as setup required and does not return actions', () => {
|
||
const state = detectClaudeStartupState('Log in to Claude to continue');
|
||
|
||
expect(state).toEqual({
|
||
phase: 'setup_required',
|
||
code: 'provider_auth_required',
|
||
evidence: ['provider auth required prompt'],
|
||
});
|
||
});
|
||
});
|