diff --git a/packages/backend/test/unit/ap-request.ts b/packages/backend/test/unit/ap-request.ts
new file mode 100644
index 0000000000..2aeeed1ebc
--- /dev/null
+++ b/packages/backend/test/unit/ap-request.ts
@@ -0,0 +1,71 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import * as assert from 'assert';
+import { verifyDraftSignature, parseRequestSignature } from '@misskey-dev/node-http-message-signatures';
+import { genEd25519KeyPair, genRsaKeyPair } from '@/misc/gen-key-pair.js';
+import { createSignedGet, createSignedPost } from '@/core/activitypub/ApRequestService.js';
+
+export const buildParsedSignature = (signingString: string, signature: string, algorithm: string) => {
+	return {
+		scheme: 'Signature',
+		params: {
+			keyId: 'KeyID',	// dummy, not used for verify
+			algorithm: algorithm,
+			headers: ['(request-target)', 'date', 'host', 'digest'],	// dummy, not used for verify
+			signature: signature,
+		},
+		signingString: signingString,
+		algorithm: algorithm.toUpperCase(),
+		keyId: 'KeyID',	// dummy, not used for verify
+	};
+};
+
+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', () => {
+	describe.each(['00', '01'])('createSignedPost with verify', async (level) => {
+		const keypair = await getKeyPair(level);
+		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',
+		};
+
+		const req = createSignedPost({ level, key, url, body, additionalHeaders: headers });
+
+		const parsed = parseRequestSignature(req.request);
+		expect(parsed?.version).toBe('draft');
+		if (!parsed) return;
+		const verify = verifyDraftSignature(parsed?.value, keypair.publicKey);
+		assert.deepStrictEqual(verify, true);
+	});
+
+	describe.each(['00', '01'])('createSignedGet with verify', async (level) => {
+		const keypair = await getKeyPair(level);
+		const key = { keyId: 'x', 'privateKeyPem': keypair.privateKey };
+		const url = 'https://example.com/outbox';
+		const headers = {
+			'User-Agent': 'UA',
+		};
+
+		const req = createSignedGet({ level, key, url, additionalHeaders: headers });
+
+		const parsed = parseRequestSignature(req.request);
+		expect(parsed?.version).toBe('draft');
+		if (!parsed) return;
+		const verify = verifyDraftSignature(parsed?.value, keypair.publicKey);
+		assert.deepStrictEqual(verify, true);
+	});
+});