summaryrefslogtreecommitdiff
path: root/packages/backend/test/unit
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/test/unit')
-rw-r--r--packages/backend/test/unit/FetchInstanceMetadataService.ts23
-rw-r--r--packages/backend/test/unit/ap-request.ts88
2 files changed, 69 insertions, 42 deletions
diff --git a/packages/backend/test/unit/FetchInstanceMetadataService.ts b/packages/backend/test/unit/FetchInstanceMetadataService.ts
index bf8f3ab0e3..2e66b81fcd 100644
--- a/packages/backend/test/unit/FetchInstanceMetadataService.ts
+++ b/packages/backend/test/unit/FetchInstanceMetadataService.ts
@@ -75,62 +75,61 @@ describe('FetchInstanceMetadataService', () => {
test('Lock and update', async () => {
redisClient.set = mockRedis();
const now = Date.now();
- federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: { getTime: () => { return now - 10 * 1000 * 60 * 60 * 24; } } } as any);
+ federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: new Date(now - 10 * 1000 * 60 * 60 * 24) } as any);
httpRequestService.getJson.mockImplementation(() => { throw Error(); });
const tryLockSpy = jest.spyOn(fetchInstanceMetadataService, 'tryLock');
const unlockSpy = jest.spyOn(fetchInstanceMetadataService, 'unlock');
await fetchInstanceMetadataService.fetchInstanceMetadata({ host: 'example.com' } as any);
+ expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(1);
expect(tryLockSpy).toHaveBeenCalledTimes(1);
expect(unlockSpy).toHaveBeenCalledTimes(1);
- expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(1);
expect(httpRequestService.getJson).toHaveBeenCalled();
});
- test('Lock and don\'t update', async () => {
+ test('Don\'t lock and update if recently updated', async () => {
redisClient.set = mockRedis();
- const now = Date.now();
- federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: { getTime: () => now } } as any);
+ federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: new Date() } as any);
httpRequestService.getJson.mockImplementation(() => { throw Error(); });
const tryLockSpy = jest.spyOn(fetchInstanceMetadataService, 'tryLock');
const unlockSpy = jest.spyOn(fetchInstanceMetadataService, 'unlock');
await fetchInstanceMetadataService.fetchInstanceMetadata({ host: 'example.com' } as any);
- expect(tryLockSpy).toHaveBeenCalledTimes(1);
- expect(unlockSpy).toHaveBeenCalledTimes(1);
expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(1);
+ expect(tryLockSpy).toHaveBeenCalledTimes(0);
+ expect(unlockSpy).toHaveBeenCalledTimes(0);
expect(httpRequestService.getJson).toHaveBeenCalledTimes(0);
});
test('Do nothing when lock not acquired', async () => {
redisClient.set = mockRedis();
const now = Date.now();
- federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: { getTime: () => now - 10 * 1000 * 60 * 60 * 24 } } as any);
+ federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: new Date(now - 10 * 1000 * 60 * 60 * 24) } as any);
httpRequestService.getJson.mockImplementation(() => { throw Error(); });
await fetchInstanceMetadataService.tryLock('example.com');
const tryLockSpy = jest.spyOn(fetchInstanceMetadataService, 'tryLock');
const unlockSpy = jest.spyOn(fetchInstanceMetadataService, 'unlock');
await fetchInstanceMetadataService.fetchInstanceMetadata({ host: 'example.com' } as any);
+ expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(1);
expect(tryLockSpy).toHaveBeenCalledTimes(1);
expect(unlockSpy).toHaveBeenCalledTimes(0);
- expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(0);
expect(httpRequestService.getJson).toHaveBeenCalledTimes(0);
});
- test('Do when lock not acquired but forced', async () => {
+ test('Do when forced', async () => {
redisClient.set = mockRedis();
const now = Date.now();
- federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: { getTime: () => now - 10 * 1000 * 60 * 60 * 24 } } as any);
+ federatedInstanceService.fetch.mockResolvedValue({ infoUpdatedAt: new Date(now - 10 * 1000 * 60 * 60 * 24) } as any);
httpRequestService.getJson.mockImplementation(() => { throw Error(); });
await fetchInstanceMetadataService.tryLock('example.com');
const tryLockSpy = jest.spyOn(fetchInstanceMetadataService, 'tryLock');
const unlockSpy = jest.spyOn(fetchInstanceMetadataService, 'unlock');
await fetchInstanceMetadataService.fetchInstanceMetadata({ host: 'example.com' } as any, true);
+ expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(0);
expect(tryLockSpy).toHaveBeenCalledTimes(0);
expect(unlockSpy).toHaveBeenCalledTimes(1);
- expect(federatedInstanceService.fetch).toHaveBeenCalledTimes(0);
expect(httpRequestService.getJson).toHaveBeenCalled();
});
});
diff --git a/packages/backend/test/unit/ap-request.ts b/packages/backend/test/unit/ap-request.ts
index d3d39240dc..50894c8b81 100644
--- a/packages/backend/test/unit/ap-request.ts
+++ b/packages/backend/test/unit/ap-request.ts
@@ -4,10 +4,8 @@
*/
import * as assert from 'assert';
-import httpSignature from '@peertube/http-signature';
-
-import { genRsaKeyPair } from '@/misc/gen-key-pair.js';
-import { ApRequestCreator } from '@/core/activitypub/ApRequestService.js';
+import { verifyDraftSignature, parseRequestSignature, genEd25519KeyPair, genRsaKeyPair, importPrivateKey } from '@misskey-dev/node-http-message-signatures';
+import { createSignedGet, createSignedPost } from '@/core/activitypub/ApRequestService.js';
export const buildParsedSignature = (signingString: string, signature: string, algorithm: string) => {
return {
@@ -24,38 +22,68 @@ export const buildParsedSignature = (signingString: string, signature: string, a
};
};
-describe('ap-request', () => {
- test('createSignedPost with verify', async () => {
- const keypair = await genRsaKeyPair();
- const key = { keyId: 'x', 'privateKeyPem': keypair.privateKey };
- const url = 'https://example.com/inbox';
- const activity = { a: 1 };
- const body = JSON.stringify(activity);
- const headers = {
- 'User-Agent': 'UA',
- };
+async function getKeyPair(level: string) {
+ if (level === '00') {
+ return await genRsaKeyPair();
+ } else if (level === '01') {
+ return await genEd25519KeyPair();
+ }
+ throw new Error('Invalid level');
+}
+
+describe('ap-request post', () => {
+ const url = 'https://example.com/inbox';
+ const activity = { a: 1 };
+ const body = JSON.stringify(activity);
+ const headers = {
+ 'User-Agent': 'UA',
+ };
- const req = ApRequestCreator.createSignedPost({ key, url, body, additionalHeaders: headers });
+ describe.each(['00', '01'])('createSignedPost with verify', (level) => {
+ test('pem', async () => {
+ const keypair = await getKeyPair(level);
+ const key = { keyId: 'x', 'privateKeyPem': keypair.privateKey };
- const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');
+ const req = await createSignedPost({ level, key, url, body, additionalHeaders: headers });
- const result = httpSignature.verifySignature(parsed, keypair.publicKey);
- assert.deepStrictEqual(result, true);
- });
+ const parsed = parseRequestSignature(req.request);
+ expect(parsed.version).toBe('draft');
+ expect(Array.isArray(parsed.value)).toBe(false);
+ const verify = await verifyDraftSignature(parsed.value as any, keypair.publicKey);
+ assert.deepStrictEqual(verify, true);
+ });
+ test('imported', async () => {
+ const keypair = await getKeyPair(level);
+ const key = { keyId: 'x', 'privateKey': await importPrivateKey(keypair.privateKey) };
- test('createSignedGet with verify', async () => {
- const keypair = await genRsaKeyPair();
- const key = { keyId: 'x', 'privateKeyPem': keypair.privateKey };
- const url = 'https://example.com/outbox';
- const headers = {
- 'User-Agent': 'UA',
- };
+ const req = await createSignedPost({ level, key, url, body, additionalHeaders: headers });
+
+ const parsed = parseRequestSignature(req.request);
+ expect(parsed.version).toBe('draft');
+ expect(Array.isArray(parsed.value)).toBe(false);
+ const verify = await verifyDraftSignature(parsed.value as any, keypair.publicKey);
+ assert.deepStrictEqual(verify, true);
+ });
+ });
+});
- const req = ApRequestCreator.createSignedGet({ key, url, additionalHeaders: headers });
+describe('ap-request get', () => {
+ describe.each(['00', '01'])('createSignedGet with verify', (level) => {
+ test('pass', async () => {
+ const keypair = await getKeyPair(level);
+ const key = { keyId: 'x', 'privateKeyPem': keypair.privateKey };
+ const url = 'https://example.com/outbox';
+ const headers = {
+ 'User-Agent': 'UA',
+ };
- const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');
+ const req = await createSignedGet({ level, key, url, additionalHeaders: headers });
- const result = httpSignature.verifySignature(parsed, keypair.publicKey);
- assert.deepStrictEqual(result, true);
+ const parsed = parseRequestSignature(req.request);
+ expect(parsed.version).toBe('draft');
+ expect(Array.isArray(parsed.value)).toBe(false);
+ const verify = await verifyDraftSignature(parsed.value as any, keypair.publicKey);
+ assert.deepStrictEqual(verify, true);
+ });
});
});