Path: blob/main/extensions/copilot/test/prompts/gitCommitMessageGenerator.stest.ts
13388 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*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { GitCommitMessageGenerator } from '../../src/extension/prompt/node/gitCommitMessageGenerator';6import { Diff } from '../../src/platform/git/common/gitDiffService';7import { TestWorkspaceService } from '../../src/platform/test/node/testWorkspaceService';8import { IWorkspaceService } from '../../src/platform/workspace/common/workspaceService';9import { createTextDocumentData } from '../../src/util/common/test/shims/textDocument';10import { CancellationToken } from '../../src/util/vs/base/common/cancellation';11import { URI } from '../../src/util/vs/base/common/uri';12import { IInstantiationService } from '../../src/util/vs/platform/instantiation/common/instantiation';13import { ssuite, stest } from '../base/stest';1415ssuite({ title: 'git commit message', location: 'external' }, () => {16stest({ description: 'Generates a simple commit message', language: 'python' }, async (testingServiceCollection) => {17const content = `18def print_hello_world():19print("Hello, World!")`;2021const document = createTextDocumentData(URI.file('main.py'), content, 'python').document;22testingServiceCollection.define(IWorkspaceService, new TestWorkspaceService(undefined, [document]));2324const accessor = testingServiceCollection.createTestingAccessor();25const instantiationService = accessor.get(IInstantiationService);2627const diff = `diff --git a/main.py b/main.py28index 0877b83..6260896 10064429--- a/main.py30+++ b/main.py31@@ -1,2 +1,2 @@32-def print_hello_world():33+def greet():34print("Hello, World!")35\ No newline at end of file`;3637const changes: Diff[] = [38{39uri: document.uri,40originalUri: document.uri,41renameUri: undefined,42status: 5 /* Modified */,43diff44} satisfies Diff45];4647const generator = instantiationService.createInstance(GitCommitMessageGenerator);48const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: [], user: [] }, 0, CancellationToken.None);49assert.ok(message !== undefined, 'Failed to generate a commit message');50});5152stest({ description: 'Generates a conventional commit message for a bug fix', language: 'python' }, async (testingServiceCollection) => {53const content = `54def print_hello_world():55print("Hello, World!")`;5657const document = createTextDocumentData(URI.file('main.py'), content, 'python').document;58testingServiceCollection.define(IWorkspaceService, new TestWorkspaceService(undefined, [document]));5960const accessor = testingServiceCollection.createTestingAccessor();61const instantiationService = accessor.get(IInstantiationService);6263const diff = `diff --git a/main.py b/main.py64index 0877b83..6260896 10064465--- a/main.py66+++ b/main.py67@@ -1,2 +1,2 @@68-def print_hello_world():69+def greet():70print("Hello, World!")71\ No newline at end of file`;7273const repoCommits = [74'feat: add greet function (by [email protected])',75'chore: setup initial project [fixes #3425]'76];77const userCommits = [78'refactor: move logic into main.py',79'feat: add hello world'80];8182const changes: Diff[] = [83{84uri: document.uri,85originalUri: document.uri,86renameUri: undefined,87status: 5 /* Modified */,88diff89} satisfies Diff90];9192const generator = instantiationService.createInstance(GitCommitMessageGenerator);93const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);9495assert.ok(message !== undefined, 'Failed to generate a commit message');96assert.ok(!userCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a user commit');97assert.ok(!repoCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a repo commit');98assert.ok(['fix:', 'chore:', 'feat:', 'refactor:'].some(prefix => message.toLowerCase().startsWith(prefix)), 'Commit message does not follow the conventional commits format');99assert.ok(!message.includes('example.com'), 'Commit message contains the email address');100assert.ok(!/#\d+/.test(message), 'Commit message does include an issue reference');101102});103104stest({ description: 'Generated commit messages do not bias to conventional commit style', language: 'python' }, async (testingServiceCollection) => {105const content = `106def show_exomple():107print("This is an example.")`;108109const document = createTextDocumentData(URI.file('main.py'), content, 'python').document;110testingServiceCollection.define(IWorkspaceService, new TestWorkspaceService(undefined, [document]));111112const accessor = testingServiceCollection.createTestingAccessor();113const instantiationService = accessor.get(IInstantiationService);114115const diff = `diff --git a/sample.py b/sample.py116index 0877b83..6260896 100644117--- a/sample.py118+++ b/sample.py119@@ -1,3 +1,3 @@120-def show_exomple():121+def show_example():122print("This is an example.")123\ No newline at end of file`;124125const repoCommits = [126'Initial project setup',127'Install dependencies'128];129130const userCommits = [131'Add sample'132];133134const changes: Diff[] = [135{136uri: document.uri,137originalUri: document.uri,138renameUri: undefined,139status: 5 /* Modified */,140diff141} satisfies Diff142];143144const generator = instantiationService.createInstance(GitCommitMessageGenerator);145const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);146147assert.ok(message !== undefined, 'Failed to generate a commit message');148assert.ok(!userCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a user commit');149assert.ok(!repoCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a repo commit');150assert.ok(!['fix:', 'feat:', 'chore:', 'docs:', 'style:', 'refactor:'].some(prefix => message.toLowerCase().startsWith(prefix)), 'Commit message should not use conventional commits format');151});152});153154155