Path: blob/main/src/vs/platform/agentHost/test/node/copilotGitProject.test.ts
13399 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { URI } from '../../../../base/common/uri.js';7import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';8import type { IAgentHostGitService } from '../../node/agentHostGitService.js';9import { projectFromCopilotContext, projectFromRepository, resolveGitProject } from '../../node/copilot/copilotGitProject.js';1011class TestAgentHostGitService implements IAgentHostGitService {12declare readonly _serviceBrand: undefined;1314insideWorkTree = true;15repositoryRoot: URI | undefined;16worktreeRoots: URI[] = [];1718async isInsideWorkTree(): Promise<boolean> { return this.insideWorkTree; }19async getCurrentBranch(): Promise<string | undefined> { return undefined; }20async getDefaultBranch(): Promise<string | undefined> { return undefined; }21async getBranches(): Promise<string[]> { return []; }22async getRepositoryRoot(): Promise<URI | undefined> { return this.repositoryRoot; }23async getWorktreeRoots(): Promise<URI[]> { return this.worktreeRoots; }24async addWorktree(): Promise<void> { }25async addExistingWorktree(): Promise<void> { }26async removeWorktree(): Promise<void> { }27async branchExists(): Promise<boolean> { return false; }28async hasUncommittedChanges(): Promise<boolean> { return false; }29async getSessionGitState(): Promise<undefined> { return undefined; }30async computeSessionFileDiffs(): Promise<undefined> { return undefined; }31async showBlob(): Promise<undefined> { return undefined; }32}3334suite('Copilot Git Project', () => {35ensureNoDisposablesAreLeakedInTestSuite();3637let gitService: TestAgentHostGitService;3839setup(() => {40gitService = new TestAgentHostGitService();41});4243test('resolves a repository project from a worktree working directory', async () => {44gitService.worktreeRoots = [URI.file('/workspace/source-repo')];4546const project = await resolveGitProject(URI.file('/workspace/worktree-checkout'), gitService);4748assert.deepStrictEqual({49uri: project?.uri.toString(),50displayName: project?.displayName,51}, {52uri: URI.file('/workspace/source-repo').toString(),53displayName: 'source-repo',54});55});5657test('resolves the repository itself for a normal git working directory', async () => {58gitService.repositoryRoot = URI.file('/workspace/normal-repo');5960const project = await resolveGitProject(URI.file('/workspace/normal-repo'), gitService);6162assert.deepStrictEqual({63uri: project?.uri.toString(),64displayName: project?.displayName,65}, {66uri: URI.file('/workspace/normal-repo').toString(),67displayName: 'normal-repo',68});69});7071test('returns undefined outside a git working tree', async () => {72gitService.insideWorkTree = false;7374assert.strictEqual(await resolveGitProject(URI.file('/workspace/plain-folder'), gitService), undefined);75});7677test('falls back to repository context when no git project is available', async () => {78gitService.insideWorkTree = false;7980const project = await projectFromCopilotContext({ repository: 'microsoft/vscode' }, gitService);8182assert.deepStrictEqual({83uri: project?.uri.toString(),84displayName: project?.displayName,85}, {86uri: 'https://github.com/microsoft/vscode',87displayName: 'vscode',88});89});9091test('parses repository URLs', () => {92const project = projectFromRepository('https://github.com/microsoft/vscode.git');9394assert.deepStrictEqual({95uri: project?.uri.toString(),96displayName: project?.displayName,97}, {98uri: 'https://github.com/microsoft/vscode.git',99displayName: 'vscode',100});101});102});103104105