Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/test/prompts/gitCommitMessageGenerator.stest.ts
13388 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import assert from 'assert';
6
import { GitCommitMessageGenerator } from '../../src/extension/prompt/node/gitCommitMessageGenerator';
7
import { Diff } from '../../src/platform/git/common/gitDiffService';
8
import { TestWorkspaceService } from '../../src/platform/test/node/testWorkspaceService';
9
import { IWorkspaceService } from '../../src/platform/workspace/common/workspaceService';
10
import { createTextDocumentData } from '../../src/util/common/test/shims/textDocument';
11
import { CancellationToken } from '../../src/util/vs/base/common/cancellation';
12
import { URI } from '../../src/util/vs/base/common/uri';
13
import { IInstantiationService } from '../../src/util/vs/platform/instantiation/common/instantiation';
14
import { ssuite, stest } from '../base/stest';
15
16
ssuite({ title: 'git commit message', location: 'external' }, () => {
17
stest({ description: 'Generates a simple commit message', language: 'python' }, async (testingServiceCollection) => {
18
const content = `
19
def print_hello_world():
20
print("Hello, World!")`;
21
22
const document = createTextDocumentData(URI.file('main.py'), content, 'python').document;
23
testingServiceCollection.define(IWorkspaceService, new TestWorkspaceService(undefined, [document]));
24
25
const accessor = testingServiceCollection.createTestingAccessor();
26
const instantiationService = accessor.get(IInstantiationService);
27
28
const diff = `diff --git a/main.py b/main.py
29
index 0877b83..6260896 100644
30
--- a/main.py
31
+++ b/main.py
32
@@ -1,2 +1,2 @@
33
-def print_hello_world():
34
+def greet():
35
print("Hello, World!")
36
\ No newline at end of file`;
37
38
const changes: Diff[] = [
39
{
40
uri: document.uri,
41
originalUri: document.uri,
42
renameUri: undefined,
43
status: 5 /* Modified */,
44
diff
45
} satisfies Diff
46
];
47
48
const generator = instantiationService.createInstance(GitCommitMessageGenerator);
49
const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: [], user: [] }, 0, CancellationToken.None);
50
assert.ok(message !== undefined, 'Failed to generate a commit message');
51
});
52
53
stest({ description: 'Generates a conventional commit message for a bug fix', language: 'python' }, async (testingServiceCollection) => {
54
const content = `
55
def print_hello_world():
56
print("Hello, World!")`;
57
58
const document = createTextDocumentData(URI.file('main.py'), content, 'python').document;
59
testingServiceCollection.define(IWorkspaceService, new TestWorkspaceService(undefined, [document]));
60
61
const accessor = testingServiceCollection.createTestingAccessor();
62
const instantiationService = accessor.get(IInstantiationService);
63
64
const diff = `diff --git a/main.py b/main.py
65
index 0877b83..6260896 100644
66
--- a/main.py
67
+++ b/main.py
68
@@ -1,2 +1,2 @@
69
-def print_hello_world():
70
+def greet():
71
print("Hello, World!")
72
\ No newline at end of file`;
73
74
const repoCommits = [
75
'feat: add greet function (by [email protected])',
76
'chore: setup initial project [fixes #3425]'
77
];
78
const userCommits = [
79
'refactor: move logic into main.py',
80
'feat: add hello world'
81
];
82
83
const changes: Diff[] = [
84
{
85
uri: document.uri,
86
originalUri: document.uri,
87
renameUri: undefined,
88
status: 5 /* Modified */,
89
diff
90
} satisfies Diff
91
];
92
93
const generator = instantiationService.createInstance(GitCommitMessageGenerator);
94
const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);
95
96
assert.ok(message !== undefined, 'Failed to generate a commit message');
97
assert.ok(!userCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a user commit');
98
assert.ok(!repoCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a repo commit');
99
assert.ok(['fix:', 'chore:', 'feat:', 'refactor:'].some(prefix => message.toLowerCase().startsWith(prefix)), 'Commit message does not follow the conventional commits format');
100
assert.ok(!message.includes('example.com'), 'Commit message contains the email address');
101
assert.ok(!/#\d+/.test(message), 'Commit message does include an issue reference');
102
103
});
104
105
stest({ description: 'Generated commit messages do not bias to conventional commit style', language: 'python' }, async (testingServiceCollection) => {
106
const content = `
107
def show_exomple():
108
print("This is an example.")`;
109
110
const document = createTextDocumentData(URI.file('main.py'), content, 'python').document;
111
testingServiceCollection.define(IWorkspaceService, new TestWorkspaceService(undefined, [document]));
112
113
const accessor = testingServiceCollection.createTestingAccessor();
114
const instantiationService = accessor.get(IInstantiationService);
115
116
const diff = `diff --git a/sample.py b/sample.py
117
index 0877b83..6260896 100644
118
--- a/sample.py
119
+++ b/sample.py
120
@@ -1,3 +1,3 @@
121
-def show_exomple():
122
+def show_example():
123
print("This is an example.")
124
\ No newline at end of file`;
125
126
const repoCommits = [
127
'Initial project setup',
128
'Install dependencies'
129
];
130
131
const userCommits = [
132
'Add sample'
133
];
134
135
const changes: Diff[] = [
136
{
137
uri: document.uri,
138
originalUri: document.uri,
139
renameUri: undefined,
140
status: 5 /* Modified */,
141
diff
142
} satisfies Diff
143
];
144
145
const generator = instantiationService.createInstance(GitCommitMessageGenerator);
146
const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);
147
148
assert.ok(message !== undefined, 'Failed to generate a commit message');
149
assert.ok(!userCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a user commit');
150
assert.ok(!repoCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a repo commit');
151
assert.ok(!['fix:', 'feat:', 'chore:', 'docs:', 'style:', 'refactor:'].some(prefix => message.toLowerCase().startsWith(prefix)), 'Commit message should not use conventional commits format');
152
});
153
});
154
155