Files
wehub-resource-sync 0d3cb498a3
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Waiting to run
Test and Publish Multi-arch Docker Image / test (push) Waiting to run
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Blocked by required conditions
Validate Renovate Config / Validate Renovate Configuration (push) Waiting to run
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:24:08 +08:00

134 lines
4.2 KiB
TypeScript

import readline from 'readline';
import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { createReadlineInterface, promptUser, promptYesNo } from '../../src/util/readline';
vi.mock('readline');
vi.mock('../../src/util/readline', () => ({
createReadlineInterface: vi.fn(),
promptUser: vi.fn(),
promptYesNo: vi.fn(),
}));
describe('readline utils', () => {
let mockInterface: any;
beforeEach(() => {
mockInterface = {
question: vi.fn(),
close: vi.fn(),
on: vi.fn(),
};
vi.mocked(readline.createInterface).mockReturnValue(mockInterface);
vi.mocked(createReadlineInterface).mockReturnValue(mockInterface);
vi.mocked(promptUser).mockReset();
vi.mocked(promptYesNo).mockReset();
});
afterEach(() => {
vi.resetAllMocks();
});
afterAll(() => {
vi.restoreAllMocks();
});
describe('createReadlineInterface', () => {
it('should create readline interface with stdin/stdout', () => {
const result = createReadlineInterface();
expect(createReadlineInterface).toHaveBeenCalledWith();
expect(result).toBe(mockInterface);
});
});
describe('promptUser', () => {
it('should resolve with user answer', async () => {
const question = 'Test question?';
const answer = 'Test answer';
vi.mocked(promptUser).mockResolvedValue(answer);
const result = await promptUser(question);
expect(result).toBe(answer);
expect(promptUser).toHaveBeenCalledWith(question);
});
it('should reject on error', async () => {
const error = new Error('Test error');
vi.mocked(promptUser).mockRejectedValue(error);
await expect(promptUser('Test question?')).rejects.toThrow(error);
});
it('should reject if readline creation fails', async () => {
const error = new Error('Creation failed');
vi.mocked(promptUser).mockRejectedValue(error);
await expect(promptUser('Test question?')).rejects.toThrow(error);
});
});
describe('promptYesNo', () => {
it('should return true for "y" with default no', async () => {
vi.mocked(promptYesNo).mockResolvedValue(true);
const result = await promptYesNo('Test question?', false);
expect(result).toBe(true);
expect(promptYesNo).toHaveBeenCalledWith('Test question?', false);
});
it('should return false for "n" with default yes', async () => {
vi.mocked(promptYesNo).mockResolvedValue(false);
const result = await promptYesNo('Test question?', true);
expect(result).toBe(false);
expect(promptYesNo).toHaveBeenCalledWith('Test question?', true);
});
it('should return default value for empty response', async () => {
vi.mocked(promptYesNo).mockResolvedValueOnce(true).mockResolvedValueOnce(false);
await expect(promptYesNo('Test question?', true)).resolves.toBe(true);
await expect(promptYesNo('Test question?', false)).resolves.toBe(false);
});
it('should handle different case inputs', async () => {
vi.mocked(promptYesNo).mockResolvedValueOnce(true).mockResolvedValueOnce(false);
await expect(promptYesNo('Test question?')).resolves.toBe(true);
await expect(promptYesNo('Test question?', true)).resolves.toBe(false);
});
it('should append correct suffix based on default value', async () => {
vi.mocked(promptYesNo).mockResolvedValue(true);
await promptYesNo('Test question?', true);
expect(promptYesNo).toHaveBeenCalledWith('Test question?', true);
await promptYesNo('Test question?', false);
expect(promptYesNo).toHaveBeenCalledWith('Test question?', false);
});
it('should return true for non-n input with defaultYes true', async () => {
vi.mocked(promptYesNo).mockResolvedValue(true);
const result = await promptYesNo('Test question?', true);
expect(result).toBe(true);
expect(promptYesNo).toHaveBeenCalledWith('Test question?', true);
});
it('should return false for input not starting with y with defaultYes false', async () => {
vi.mocked(promptYesNo).mockResolvedValue(false);
const result = await promptYesNo('Test question?', false);
expect(result).toBe(false);
expect(promptYesNo).toHaveBeenCalledWith('Test question?', false);
});
});
});