forked from MergeFi/backend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwebhook-signature.util.spec.ts
More file actions
40 lines (32 loc) · 1.45 KB
/
Copy pathwebhook-signature.util.spec.ts
File metadata and controls
40 lines (32 loc) · 1.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { createHmac } from 'crypto';
import { verifyGithubSignature } from './webhook-signature.util';
describe('verifyGithubSignature', () => {
const secret = 'test-webhook-secret';
const payload = JSON.stringify({ action: 'closed', number: 42 });
function sign(body: string, key: string): string {
return `sha256=${createHmac('sha256', key).update(body).digest('hex')}`;
}
it('accepts a correctly signed payload', () => {
const signature = sign(payload, secret);
expect(verifyGithubSignature(secret, payload, signature)).toBe(true);
});
it('rejects a payload signed with the wrong secret', () => {
const signature = sign(payload, 'wrong-secret');
expect(verifyGithubSignature(secret, payload, signature)).toBe(false);
});
it('rejects a tampered payload', () => {
const signature = sign(payload, secret);
const tampered = JSON.stringify({ action: 'closed', number: 43 });
expect(verifyGithubSignature(secret, tampered, signature)).toBe(false);
});
it('rejects when the signature header is missing', () => {
expect(verifyGithubSignature(secret, payload, undefined)).toBe(false);
});
it('rejects when the secret is empty', () => {
const signature = sign(payload, secret);
expect(verifyGithubSignature('', payload, signature)).toBe(false);
});
it('rejects a malformed/short signature header without throwing', () => {
expect(verifyGithubSignature(secret, payload, 'sha256=abc')).toBe(false);
});
});