From ef6381239161fa386f5dbe976174f8b404094427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sat, 15 Nov 2025 16:05:09 +0800 Subject: [PATCH] Add napcat-test package and Vitest setup Introduces the napcat-test package with initial SHA-1 stream tests, configuration files, and scripts for running tests. Updates root package.json to include test commands and Vitest dependencies, and adds Vitest configuration at the root and package level for test environment setup. --- package.json | 8 ++- packages/napcat-test/Readme.md | 3 + packages/napcat-test/package.json | 16 +++++ packages/napcat-test/sha1Stream.test.ts | 87 +++++++++++++++++++++++++ packages/napcat-test/tsconfig.json | 11 ++++ packages/napcat-test/vitest.config.ts | 14 ++++ vitest.config.ts | 15 +++++ 7 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 packages/napcat-test/Readme.md create mode 100644 packages/napcat-test/package.json create mode 100644 packages/napcat-test/sha1Stream.test.ts create mode 100644 packages/napcat-test/tsconfig.json create mode 100644 packages/napcat-test/vitest.config.ts create mode 100644 vitest.config.ts diff --git a/package.json b/package.json index cc34876c..295ee533 100644 --- a/package.json +++ b/package.json @@ -9,16 +9,20 @@ "build:framework": "pnpm --filter napcat-framework run build || exit 1", "build:webui": "pnpm --filter napcat-webui-frontend run build || exit 1", "dev:shell": "pnpm --filter napcat-develop run dev || exit 1", - "typecheck": "pnpm -r --if-present run typecheck" + "typecheck": "pnpm -r --if-present run typecheck", + "test": "pnpm --filter napcat-test run test", + "test:ui": "pnpm --filter napcat-test run test:ui" }, "devDependencies": { "@rollup/plugin-node-resolve": "^16.0.3", "@vitejs/plugin-react-swc": "^4.2.2", + "@vitest/ui": "^4.0.9", "inversify": "^7.10.4", "reflect-metadata": "^0.2.2", "typescript": "^5.3.0", "vite": "^6.4.1", - "vite-plugin-cp": "^6.0.3" + "vite-plugin-cp": "^6.0.3", + "vitest": "^4.0.9" }, "dependencies": { "express": "^5.0.0", diff --git a/packages/napcat-test/Readme.md b/packages/napcat-test/Readme.md new file mode 100644 index 00000000..5231bd56 --- /dev/null +++ b/packages/napcat-test/Readme.md @@ -0,0 +1,3 @@ +# NapCat-Test +## 测试方向 +测试过程不涉及账号登录 \ No newline at end of file diff --git a/packages/napcat-test/package.json b/packages/napcat-test/package.json new file mode 100644 index 00000000..6c51d86a --- /dev/null +++ b/packages/napcat-test/package.json @@ -0,0 +1,16 @@ +{ + "name": "napcat-test", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "test": "vitest", + "test:ui": "vitest --ui" + }, + "devDependencies": { + "vitest": "^4.0.9" + }, + "dependencies": { + "napcat-core": "workspace:*" + } +} \ No newline at end of file diff --git a/packages/napcat-test/sha1Stream.test.ts b/packages/napcat-test/sha1Stream.test.ts new file mode 100644 index 00000000..bf9600eb --- /dev/null +++ b/packages/napcat-test/sha1Stream.test.ts @@ -0,0 +1,87 @@ +import { describe, it, expect } from 'vitest'; +import crypto from 'crypto'; +import { Sha1Stream } from 'napcat-core/packet/utils/crypto/sha1Stream'; + +describe('Sha1Stream', () => { + it('should compute correct SHA-1 hash for empty string', () => { + const sha1Stream = new Sha1Stream(); + const hash = sha1Stream.final(); + const expected = crypto.createHash('sha1').update('').digest(); + expect(hash).toEqual(expected); + }); + + it('should compute correct SHA-1 hash for simple string', () => { + const testData = 'Hello, World!'; + const sha1Stream = new Sha1Stream(); + sha1Stream.update(Buffer.from(testData)); + const hash = sha1Stream.final(); + const expected = crypto.createHash('sha1').update(testData).digest(); + expect(hash).toEqual(expected); + }); + + it('should compute correct SHA-1 hash for binary data', () => { + const testData = Buffer.from([0x00, 0x01, 0x02, 0x03, 0x04, 0x05]); + const sha1Stream = new Sha1Stream(); + sha1Stream.update(testData); + const hash = sha1Stream.final(); + const expected = crypto.createHash('sha1').update(testData).digest(); + expect(hash).toEqual(expected); + }); + + it('should handle multiple update calls', () => { + const part1 = 'Hello'; + const part2 = ', World!'; + const sha1Stream = new Sha1Stream(); + sha1Stream.update(Buffer.from(part1)); + sha1Stream.update(Buffer.from(part2)); + const hash = sha1Stream.final(); + const expected = crypto.createHash('sha1').update(part1 + part2).digest(); + expect(hash).toEqual(expected); + }); + + it('should handle large data correctly', () => { + const testData = crypto.randomBytes(1024 * 10); // 10KB random data + const sha1Stream = new Sha1Stream(); + sha1Stream.update(testData); + const hash = sha1Stream.final(); + const expected = crypto.createHash('sha1').update(testData).digest(); + expect(hash).toEqual(expected); + }); + + it('should produce consistent results for same input', () => { + const testData = 'Consistent test data'; + + const sha1Stream1 = new Sha1Stream(); + sha1Stream1.update(Buffer.from(testData)); + const hash1 = sha1Stream1.final(); + + const sha1Stream2 = new Sha1Stream(); + sha1Stream2.update(Buffer.from(testData)); + const hash2 = sha1Stream2.final(); + + expect(hash1).toEqual(hash2); + }); + + it('should handle edge case with exact block size', () => { + // SHA-1 block size is 64 bytes + const testData = 'a'.repeat(64); + const sha1Stream = new Sha1Stream(); + sha1Stream.update(Buffer.from(testData)); + const hash = sha1Stream.final(); + const expected = crypto.createHash('sha1').update(testData).digest(); + expect(hash).toEqual(expected); + }); + + it('should handle random data correctly', () => { + // Run multiple random tests (reduced from 100000 to 100 for performance) + for (let i = 0; i < 100; i++) { + const randomLength = Math.floor(Math.random() * 1024); + const randomData = crypto.randomBytes(randomLength); + const sha1Stream = new Sha1Stream(); + sha1Stream.update(randomData); + const hash = sha1Stream.final(); + const expectedDigest = crypto.createHash('sha1').update(randomData).digest(); + expect(hash).toEqual(expectedDigest); + } + }); +}); \ No newline at end of file diff --git a/packages/napcat-test/tsconfig.json b/packages/napcat-test/tsconfig.json new file mode 100644 index 00000000..48d3a03b --- /dev/null +++ b/packages/napcat-test/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "include": [ + "*.ts", + "**/*.ts" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/packages/napcat-test/vitest.config.ts b/packages/napcat-test/vitest.config.ts new file mode 100644 index 00000000..04c89db4 --- /dev/null +++ b/packages/napcat-test/vitest.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vitest/config'; +import { resolve } from 'path'; + +export default defineConfig({ + test: { + environment: 'node', + globals: true, + }, + resolve: { + alias: { + '@': resolve(__dirname, '../../'), + }, + }, +}); \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..d771157a --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vitest/config'; +import { resolve } from 'path'; + +export default defineConfig({ + test: { + environment: 'node', + globals: true, + include: ['packages/napcat-test/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + }, + resolve: { + alias: { + '@': resolve(__dirname, 'packages'), + }, + }, +}); \ No newline at end of file