Skip to content

Phase 4: Create Test Utilities and Mocks (IDE Adapter Refactoring) #30

@couimet

Description

@couimet

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

  • MockIdeAdapter.ts created with factory functions
  • testSetup.ts created with helper functions
  • All helpers properly typed (no any without justification)
  • README.md documents usage patterns
  • Helpers work with existing test framework

Effort

Estimated: 2-3 hours
Risk: Low

Dependencies

Metadata

Metadata

Assignees

No one assigned

    Labels

    scope:corerangelink-core-ts packagescope:docsDocumentation files (README, ROADMAP, etc.)scope:toolingBuild tools, scripts, CI/CDscope:vscode-extrangelink-vscode-extension packagetype:enhancementNew feature or enhancement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions