Skip to content

Commit 3b3ec2b

Browse files
committed
chore(tests): Add basic tests for the extension
1 parent b37d977 commit 3b3ec2b

File tree

6 files changed

+144
-61
lines changed

6 files changed

+144
-61
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ tsconfig.base.tsbuildinfo%
3434
out/
3535

3636
# build files
37-
**/*.vsix
37+
**/*.vsix
38+
39+
.cache_ggshield
40+
.vscode-test/

src/extension.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ export function activate(context: ExtensionContext) {
261261
ggshieldViewProvider.getView() as WebviewView,
262262
context
263263
).then(() => {
264-
console.log("»»»»»»»»»»»»»»»»»»»xxx", context.globalState.get("isAuthenticated", false));
265264
if (context.globalState.get("isAuthenticated", false)) {
266265
updateStatusBarItem(StatusBarStatus.ready, statusBar);
267266
setApiKey(configuration, ggshieldApiKey(configuration));

src/lib/ggshield-api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export async function ggshieldAuthStatus(
241241
isAuthenticated = true;
242242
}
243243
else{
244-
if (proc.stderr.includes("Config key")){
244+
if (proc.stderr && proc.stderr.includes("Config key")){
245245
window.showErrorMessage(`Gitguardian: ${proc.stderr}`);
246246

247247
}

src/test/suite/authentication.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import * as assert from 'assert';
2+
import { ggshieldAuthStatus } from '../../lib/ggshield-api';
3+
import { ExtensionContext, extensions, Memento } from 'vscode';
4+
import { getBinaryAbsolutePath } from '../../lib/ggshield-resolver-utils';
5+
import * as os from 'os';
6+
7+
8+
suite('Authentication Tests', function () {
9+
let isAuthenticated: boolean;
10+
let mockGlobalState: Memento & { setKeysForSync(keys: readonly string[]): void; };
11+
let mockContext: Partial<ExtensionContext>;
12+
13+
setup(function () {
14+
isAuthenticated = false;
15+
16+
mockGlobalState = {
17+
get: (key: string) => (key === 'isAuthenticated' ? isAuthenticated : undefined),
18+
update: (key: string, value: any) => {
19+
if (key === 'isAuthenticated') {
20+
isAuthenticated = value;
21+
}
22+
return Promise.resolve();
23+
},
24+
keys: () => [],
25+
setKeysForSync: (keys: readonly string[]) => {},
26+
};
27+
28+
mockContext = {
29+
globalState: mockGlobalState,
30+
asAbsolutePath: () => {
31+
const extension = extensions.getExtension('gitguardian-secret-security.gitguardian')!;
32+
const extensionPath = extension.extensionPath;
33+
return extensionPath;
34+
},
35+
};
36+
});
37+
38+
test('Invalid authentication value', async function () {
39+
const mockConfiguration = {
40+
apiKey: 'mockApiKey',
41+
ggshieldPath: getBinaryAbsolutePath(os.platform(), os.arch(), mockContext as ExtensionContext),
42+
apiUrl: 'https://api.gitguardian.com/',
43+
};
44+
45+
await ggshieldAuthStatus(mockConfiguration, mockContext as ExtensionContext);
46+
assert.strictEqual(isAuthenticated, false);
47+
});
48+
});

src/test/suite/extension.test.ts

Lines changed: 25 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,33 @@
11
import * as assert from "assert";
2+
import { extensions, commands,} from "vscode";
23

3-
import { parseGGShieldResults } from "../../lib/ggshield-results-parser";
4-
import { window, DiagnosticSeverity } from "vscode";
4+
suite("Extension Functionality Tests", () => {
55

6-
const results = `{
7-
"id":"/Users/paulindenaurois/Development/gitguardian/ggshield-vscode-extension/sample_files/test.py",
8-
"type":"path_scan",
9-
"entities_with_incidents":[
10-
{
11-
"mode":"FILE",
12-
"filename":"/Users/paulindenaurois/Development/gitguardian/ggshield-vscode-extension/sample_files/test.py",
13-
"incidents":[
14-
{
15-
"policy":"Secrets detection",
16-
"occurrences":[
17-
{
18-
"match":"DDACC73DdB04********************************************057c78317C39",
19-
"type":"apikey",
20-
"line_start":4,
21-
"line_end":4,
22-
"index_start":11,
23-
"index_end":79,
24-
"pre_line_start":4,
25-
"pre_line_end":4
26-
}
27-
],
28-
"type":"Generic High Entropy Secret",
29-
"validity":"no_checker",
30-
"ignore_sha":"38353eb1a2aac5b24f39ed67912234d4b4a2e23976d504a88b28137ed2b9185e",
31-
"total_occurrences":1,
32-
"incident_url":"",
33-
"known_secret":false
34-
}
35-
],
36-
"total_incidents":1,
37-
"total_occurrences":1
38-
}
39-
],
40-
"total_incidents":1,
41-
"total_occurrences":1,
42-
"secrets_engine_version":"2.96.0"
43-
}`;
44-
45-
suite("Extension Test Suite", () => {
46-
window.showInformationMessage("Start all tests.");
47-
48-
test("test result parser", () => {
49-
const diagnostics = parseGGShieldResults(JSON.parse(results));
50-
assert.strictEqual(diagnostics.length, 1);
51-
const diagnostic = diagnostics[0];
52-
assert.ok(diagnostic.message.includes("apikey"));
53-
assert.ok(diagnostic.message.includes("Generic High Entropy Secret"));
54-
assert.strictEqual(diagnostic.range.start.line, 3);
55-
assert.strictEqual(diagnostic.range.start.character, 11);
56-
assert.strictEqual(diagnostic.range.end.line, 3);
57-
assert.strictEqual(diagnostic.range.end.character, 79);
58-
assert.strictEqual(diagnostic.severity, DiagnosticSeverity.Warning);
6+
test("Extension activates successfully", async () => {
7+
const ext = extensions.getExtension("gitguardian-secret-security.gitguardian");
8+
await ext?.activate();
9+
assert.ok(ext?.isActive, "Extension should be active");
5910
});
6011

61-
test("test result parser with invalid json", () => {
62-
const diagnostics = parseGGShieldResults(JSON.parse("{}"));
12+
test("Commands are registered", async () => {
13+
const commandIds = [
14+
"gitguardian.quota",
15+
"gitguardian.ignore",
16+
"gitguardian.authenticate",
17+
"gitguardian.logout",
18+
"gitguardian.showOutput",
19+
"gitguardian.openSidebar",
20+
"gitguardian.openProblems",
21+
"gitguardian.refreshQuota",
22+
"gitguardian.showOutput"
23+
];
6324

64-
assert.strictEqual(diagnostics.length, 0);
25+
const registered = await commands.getCommands(true);
26+
const gitguardianCommands = registered.filter(command => command.startsWith("gitguardian"));
27+
28+
for (const command of commandIds) {
29+
assert.ok(gitguardianCommands.includes(command), `Command ${command} should be registered`);
30+
}
6531
});
32+
6633
});

src/test/suite/results-parser.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import * as assert from "assert";
2+
3+
import { parseGGShieldResults } from "../../lib/ggshield-results-parser";
4+
import { window, DiagnosticSeverity } from "vscode";
5+
6+
const results = `{
7+
"id":"/Users/paulindenaurois/Development/gitguardian/ggshield-vscode-extension/sample_files/test.py",
8+
"type":"path_scan",
9+
"entities_with_incidents":[
10+
{
11+
"mode":"FILE",
12+
"filename":"/Users/paulindenaurois/Development/gitguardian/ggshield-vscode-extension/sample_files/test.py",
13+
"incidents":[
14+
{
15+
"policy":"Secrets detection",
16+
"occurrences":[
17+
{
18+
"match":"DDACC73DdB04********************************************057c78317C39",
19+
"type":"apikey",
20+
"line_start":4,
21+
"line_end":4,
22+
"index_start":11,
23+
"index_end":79,
24+
"pre_line_start":4,
25+
"pre_line_end":4
26+
}
27+
],
28+
"type":"Generic High Entropy Secret",
29+
"validity":"no_checker",
30+
"ignore_sha":"38353eb1a2aac5b24f39ed67912234d4b4a2e23976d504a88b28137ed2b9185e",
31+
"total_occurrences":1,
32+
"incident_url":"",
33+
"known_secret":false
34+
}
35+
],
36+
"total_incidents":1,
37+
"total_occurrences":1
38+
}
39+
],
40+
"total_incidents":1,
41+
"total_occurrences":1,
42+
"secrets_engine_version":"2.96.0"
43+
}`;
44+
45+
suite("Result Parser Suite", () => {
46+
window.showInformationMessage("Start all tests.");
47+
48+
test("test result parser", () => {
49+
const diagnostics = parseGGShieldResults(JSON.parse(results));
50+
assert.strictEqual(diagnostics.length, 1);
51+
const diagnostic = diagnostics[0];
52+
assert.ok(diagnostic.message.includes("apikey"));
53+
assert.ok(diagnostic.message.includes("Generic High Entropy Secret"));
54+
assert.strictEqual(diagnostic.range.start.line, 3);
55+
assert.strictEqual(diagnostic.range.start.character, 11);
56+
assert.strictEqual(diagnostic.range.end.line, 3);
57+
assert.strictEqual(diagnostic.range.end.character, 79);
58+
assert.strictEqual(diagnostic.severity, DiagnosticSeverity.Warning);
59+
});
60+
61+
test("test result parser with invalid json", () => {
62+
const diagnostics = parseGGShieldResults(JSON.parse("{}"));
63+
64+
assert.strictEqual(diagnostics.length, 0);
65+
});
66+
});

0 commit comments

Comments
 (0)