mockGitProvider.ts•7.29 kB
/**
* @fileoverview Mock Git provider implementation for testing tools in isolation.
* @module tests/mcp-server/tools/definitions/helpers/mockGitProvider
*/
import { vi } from 'vitest';
import type { IGitProvider } from '@/services/git/core/IGitProvider.js';
import type {
GitProviderCapabilities,
GitOperationContext,
// Repository operations
GitInitOptions,
GitInitResult,
GitCloneOptions,
GitCloneResult,
GitCleanOptions,
GitCleanResult,
// Status & information
GitStatusOptions,
GitStatusResult,
// Commit operations
GitAddOptions,
GitAddResult,
GitCommitOptions,
GitCommitResult,
GitLogOptions,
GitLogResult,
GitShowOptions,
GitShowResult,
GitDiffOptions,
GitDiffResult,
// Branch operations
GitBranchOptions,
GitBranchResult,
GitCheckoutOptions,
GitCheckoutResult,
GitMergeOptions,
GitMergeResult,
GitRebaseOptions,
GitRebaseResult,
GitCherryPickOptions,
GitCherryPickResult,
// Remote operations
GitRemoteOptions,
GitRemoteResult,
GitFetchOptions,
GitFetchResult,
GitPushOptions,
GitPushResult,
GitPullOptions,
GitPullResult,
// Tag operations
GitTagOptions,
GitTagResult,
// Stash operations
GitStashOptions,
GitStashResult,
// Worktree operations
GitWorktreeOptions,
GitWorktreeResult,
// Additional operations
GitResetOptions,
GitResetResult,
GitBlameOptions,
GitBlameResult,
GitReflogOptions,
GitReflogResult,
} from '@/services/git/types.js';
/**
* Mock implementation of IGitProvider for testing.
* All methods are vi.fn() spies that can be configured with return values or errors.
*/
export class MockGitProvider implements IGitProvider {
readonly name = 'mock';
readonly version = '1.0.0-test';
readonly capabilities: GitProviderCapabilities = {
init: true,
clone: true,
commit: true,
branch: true,
merge: true,
rebase: true,
remote: true,
fetch: true,
push: true,
pull: true,
tag: true,
stash: true,
worktree: true,
blame: true,
reflog: true,
signCommits: true,
sshAuth: true,
httpAuth: true,
maxRepoSizeMB: 1000,
};
// Repository operations
init =
vi.fn<
(
options: GitInitOptions,
context: GitOperationContext,
) => Promise<GitInitResult>
>();
clone =
vi.fn<
(
options: GitCloneOptions,
context: GitOperationContext,
) => Promise<GitCloneResult>
>();
clean =
vi.fn<
(
options: GitCleanOptions,
context: GitOperationContext,
) => Promise<GitCleanResult>
>();
// Status & information
status =
vi.fn<
(
options: GitStatusOptions,
context: GitOperationContext,
) => Promise<GitStatusResult>
>();
// Commit operations
add =
vi.fn<
(
options: GitAddOptions,
context: GitOperationContext,
) => Promise<GitAddResult>
>();
commit =
vi.fn<
(
options: GitCommitOptions,
context: GitOperationContext,
) => Promise<GitCommitResult>
>();
log =
vi.fn<
(
options: GitLogOptions,
context: GitOperationContext,
) => Promise<GitLogResult>
>();
show =
vi.fn<
(
options: GitShowOptions,
context: GitOperationContext,
) => Promise<GitShowResult>
>();
diff =
vi.fn<
(
options: GitDiffOptions,
context: GitOperationContext,
) => Promise<GitDiffResult>
>();
// Branch operations
branch =
vi.fn<
(
options: GitBranchOptions,
context: GitOperationContext,
) => Promise<GitBranchResult>
>();
checkout =
vi.fn<
(
options: GitCheckoutOptions,
context: GitOperationContext,
) => Promise<GitCheckoutResult>
>();
merge =
vi.fn<
(
options: GitMergeOptions,
context: GitOperationContext,
) => Promise<GitMergeResult>
>();
rebase =
vi.fn<
(
options: GitRebaseOptions,
context: GitOperationContext,
) => Promise<GitRebaseResult>
>();
cherryPick =
vi.fn<
(
options: GitCherryPickOptions,
context: GitOperationContext,
) => Promise<GitCherryPickResult>
>();
// Remote operations
remote =
vi.fn<
(
options: GitRemoteOptions,
context: GitOperationContext,
) => Promise<GitRemoteResult>
>();
fetch =
vi.fn<
(
options: GitFetchOptions,
context: GitOperationContext,
) => Promise<GitFetchResult>
>();
push =
vi.fn<
(
options: GitPushOptions,
context: GitOperationContext,
) => Promise<GitPushResult>
>();
pull =
vi.fn<
(
options: GitPullOptions,
context: GitOperationContext,
) => Promise<GitPullResult>
>();
// Tag operations
tag =
vi.fn<
(
options: GitTagOptions,
context: GitOperationContext,
) => Promise<GitTagResult>
>();
// Stash operations
stash =
vi.fn<
(
options: GitStashOptions,
context: GitOperationContext,
) => Promise<GitStashResult>
>();
// Worktree operations
worktree =
vi.fn<
(
options: GitWorktreeOptions,
context: GitOperationContext,
) => Promise<GitWorktreeResult>
>();
// Additional operations
reset =
vi.fn<
(
options: GitResetOptions,
context: GitOperationContext,
) => Promise<GitResetResult>
>();
blame =
vi.fn<
(
options: GitBlameOptions,
context: GitOperationContext,
) => Promise<GitBlameResult>
>();
reflog =
vi.fn<
(
options: GitReflogOptions,
context: GitOperationContext,
) => Promise<GitReflogResult>
>();
/**
* Health check - always returns true for mock provider
*/
healthCheck = vi.fn(
async (_context: GitOperationContext): Promise<boolean> => {
return true;
},
);
/**
* Validate repository - mock implementation (no-op)
*/
validateRepository = vi.fn(
async (_path: string, _context: GitOperationContext): Promise<void> => {
// Mock implementation - does nothing
},
);
/**
* Reset all method spies for clean test state
*/
resetMocks(): void {
this.init.mockReset();
this.clone.mockReset();
this.clean.mockReset();
this.status.mockReset();
this.add.mockReset();
this.commit.mockReset();
this.log.mockReset();
this.show.mockReset();
this.diff.mockReset();
this.branch.mockReset();
this.checkout.mockReset();
this.merge.mockReset();
this.rebase.mockReset();
this.cherryPick.mockReset();
this.remote.mockReset();
this.fetch.mockReset();
this.push.mockReset();
this.pull.mockReset();
this.tag.mockReset();
this.stash.mockReset();
this.worktree.mockReset();
this.reset.mockReset();
this.blame.mockReset();
this.reflog.mockReset();
this.healthCheck.mockReset();
this.validateRepository.mockReset();
}
}
/**
* Factory function to create a fresh MockGitProvider instance
*/
export function createMockGitProvider(): MockGitProvider {
return new MockGitProvider();
}