story-206: default to claude-code-pty on first use

Squash merge of feature/story-206

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Dave
2026-02-26 15:02:16 +00:00
parent 17fd3b2dc2
commit a2465f476a
4 changed files with 85 additions and 11 deletions

View File

@@ -68,6 +68,61 @@ function setupMocks() {
mockedApi.setAnthropicApiKey.mockResolvedValue(true);
}
describe("Default provider selection (Story 206)", () => {
beforeEach(() => {
capturedWsHandlers = null;
});
it("AC1: defaults to claude-code-pty when no saved model preference exists", async () => {
mockedApi.getOllamaModels.mockResolvedValue([]);
mockedApi.getAnthropicApiKeyExists.mockResolvedValue(false);
mockedApi.getAnthropicModels.mockResolvedValue([]);
mockedApi.getModelPreference.mockResolvedValue(null);
mockedApi.setModelPreference.mockResolvedValue(true);
mockedApi.cancelChat.mockResolvedValue(true);
render(<Chat projectPath="/tmp/project" onCloseProject={vi.fn()} />);
await waitFor(() => expect(capturedWsHandlers).not.toBeNull());
// With no models available, the header renders a text input with the model value
const input = screen.getByPlaceholderText("Model");
expect(input).toHaveValue("claude-code-pty");
});
it("AC2: claude-code-pty remains default even when ollama models are available", async () => {
mockedApi.getOllamaModels.mockResolvedValue(["llama3.1", "deepseek-coder"]);
mockedApi.getAnthropicApiKeyExists.mockResolvedValue(false);
mockedApi.getAnthropicModels.mockResolvedValue([]);
mockedApi.getModelPreference.mockResolvedValue(null);
mockedApi.setModelPreference.mockResolvedValue(true);
mockedApi.cancelChat.mockResolvedValue(true);
render(<Chat projectPath="/tmp/project" onCloseProject={vi.fn()} />);
// Wait for Ollama models to load and the select dropdown to appear
const select = await screen.findByRole("combobox");
expect(select).toHaveValue("claude-code-pty");
});
it("AC3: respects saved model preference for existing projects", async () => {
mockedApi.getOllamaModels.mockResolvedValue(["llama3.1"]);
mockedApi.getAnthropicApiKeyExists.mockResolvedValue(false);
mockedApi.getAnthropicModels.mockResolvedValue([]);
mockedApi.getModelPreference.mockResolvedValue("llama3.1");
mockedApi.setModelPreference.mockResolvedValue(true);
mockedApi.cancelChat.mockResolvedValue(true);
render(<Chat projectPath="/tmp/project" onCloseProject={vi.fn()} />);
// Wait for models to load and preference to be applied
const select = await screen.findByRole("combobox");
await waitFor(() => {
expect(select).toHaveValue("llama3.1");
});
});
});
describe("Chat message rendering — unified tool call UI", () => {
beforeEach(() => {
capturedWsHandlers = null;