Goal
Create reusable test helpers and mock implementations to eliminate test boilerplate.
Context
Part of the IDE Adapter Refactoring initiative. Makes writing tests for navigation components easy and DRY.
Parent Issue: Will be linked after parent is created
Depends on: #29
Tasks
Step 4.1: Create MockIdeAdapter
Create packages/rangelink-vscode-extension/src/__tests__/__helpers__/MockIdeAdapter.ts:
import type { IdeAdapter } from '../../ide/IdeAdapter';
export const createMockIdeAdapter = (): jest.Mocked<IdeAdapter> => ({
// Clipboard
writeTextToClipboard: jest.fn().mockResolvedValue(undefined),
// Status bar
setStatusBarMessage: jest.fn().mockReturnValue({ dispose: jest.fn() }),
// Messages
showWarningMessage: jest.fn().mockResolvedValue(undefined),
showErrorMessage: jest.fn().mockResolvedValue(undefined),
showInformationMessage: jest.fn().mockResolvedValue(undefined),
// Documents
openDocument: jest.fn().mockResolvedValue(createMockDocument()),
showDocument: jest.fn().mockResolvedValue(createMockEditor()),
// Factories
createPosition: jest.fn((line, char) => ({ line, character: char })),
createRange: jest.fn((start, end) => ({ start, end })),
createSelection: jest.fn((anchor, active) => ({ anchor, active })),
// Editor manipulation
setEditorSelection: jest.fn(),
setEditorSelections: jest.fn(),
revealEditorRange: jest.fn(),
});
export const createMockDocument = (overrides?: Partial<IdeTextDocument>): IdeTextDocument => ({
uri: { fsPath: 'test.ts', scheme: 'file' },
lineCount: 100,
...overrides,
});
export const createMockEditor = (overrides?: Partial<IdeTextEditor>): IdeTextEditor => ({
document: createMockDocument(),
selection: { anchor: { line: 0, character: 0 }, active: { line: 0, character: 0 } },
selections: [],
revealRange: jest.fn(),
...overrides,
});
Step 4.2: Create test setup helpers
Create packages/rangelink-vscode-extension/src/__tests__/__helpers__/testSetup.ts:
import type { Logger } from 'barebone-logger';
import type { DelimiterConfig, ParsedLink } from 'rangelink-core-ts';
import { LinkType, SelectionType } from 'rangelink-core-ts';
export const createMockLogger = (): jest.Mocked<Logger> => ({
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
}) as any;
export const createTestDelimiters = (): DelimiterConfig => ({
line: 'L',
position: 'C',
hash: '#',
range: '-',
});
export const createTestParsedLink = (overrides?: Partial<ParsedLink>): ParsedLink => ({
path: 'src/file.ts',
start: { line: 10, char: 5 },
end: { line: 20, char: 10 },
linkType: LinkType.Regular,
selectionType: SelectionType.Normal,
...overrides,
});
Step 4.3: Create __helpers__/README.md
Document the test helpers with usage examples.
Acceptance Criteria
Effort
Estimated: 2-3 hours
Risk: Low
Dependencies
Goal
Create reusable test helpers and mock implementations to eliminate test boilerplate.
Context
Part of the IDE Adapter Refactoring initiative. Makes writing tests for navigation components easy and DRY.
Parent Issue: Will be linked after parent is created
Depends on: #29
Tasks
Step 4.1: Create MockIdeAdapter
Create
packages/rangelink-vscode-extension/src/__tests__/__helpers__/MockIdeAdapter.ts:Step 4.2: Create test setup helpers
Create
packages/rangelink-vscode-extension/src/__tests__/__helpers__/testSetup.ts:Step 4.3: Create
__helpers__/README.mdDocument the test helpers with usage examples.
Acceptance Criteria
MockIdeAdapter.tscreated with factory functionstestSetup.tscreated with helper functionsanywithout justification)Effort
Estimated: 2-3 hours
Risk: Low
Dependencies