Kaynağa Gözat

test(story): 修复史诗012企业视频管理API测试 - 适配安全修复

**问题背景**:
史诗012-15修复了企业API安全漏洞,企业ID强制从token获取,不再接受查询/请求参数。这导致两个测试用例失败,因为它们尝试通过参数传递不存在的企业ID。

**修改内容**:
1. 添加UserType类型导入,用于创建测试用户
2. 删除过时的测试用例:
   - "应该验证企业ID有效性" - 测试已被修复的安全漏洞行为
   - "应该处理没有符合条件的视频文件" - 测试已被修复的安全漏洞行为
3. 添加新的安全验证测试:
   - "应该拒绝无企业权限的用户访问" - 验证无companyId用户无法访问企业视频API
   - "应该拒绝无企业权限的用户批量下载" - 验证无companyId用户无法批量下载

**测试结果**:
✅ 所有企业视频管理API测试通过 (16个测试)
- GET /order/company-videos: 6个测试
- POST /order/batch-download: 5个测试
- PUT /order/videos/{id}/status: 5个测试

**相关史诗**:
- 史诗012: 用人方小程序API补充与数据库扩展
- 史诗012-15: 数据统计API安全修复与路由集成

🤖 Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 3 hafta önce
ebeveyn
işleme
6f4c92d020

+ 56 - 26
allin-packages/order-module/tests/integration/order.integration.test.ts

@@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, vi } from 'vitest';
 import { testClient } from 'hono/testing';
 import { IntegrationTestDatabase, setupIntegrationDatabaseHooksWithEntities } from '@d8d/shared-test-util';
 import { JWTUtil } from '@d8d/shared-utils';
-import { JWTPayload } from '@d8d/shared-types';
+import { JWTPayload, UserType } from '@d8d/shared-types';
 import { UserEntity, Role } from '@d8d/user-module';
 import { File } from '@d8d/file-module';
 import { DisabledPerson, DisabledBankCard, DisabledPhoto, DisabledRemark, DisabledVisit } from '@d8d/allin-disability-module';
@@ -1519,27 +1519,41 @@ describe('订单管理API集成测试', () => {
         }
       });
 
-      it('应该验证企业ID有效性', async () => {
+      it('应该拒绝无企业权限的用户访问 - 史诗012-15安全修复', async () => {
+        // 创建一个没有companyId的普通用户token
+        const dataSource = await IntegrationTestDatabase.getDataSource();
+        const userRepository = dataSource.getRepository(UserEntity);
+        const normalUser = userRepository.create({
+          username: `normal_user_${Date.now()}`,
+          password: 'test_password',
+          nickname: '普通用户',
+          userType: UserType.ADMIN,
+          registrationSource: 'web',
+          isDisabled: 0,
+          isDeleted: 0
+        });
+        await userRepository.save(normalUser);
+
+        const normalToken = JWTUtil.generateToken({
+          id: normalUser.id,
+          username: normalUser.username,
+          roles: [{ name: 'user' }]
+        });
+
         const response = await enterpriseClient['company-videos'].$get({
-          query: {
-            companyId: '999999' // 不存在的企业ID
-          }
+          query: {}
         }, {
           headers: {
-            'Authorization': `Bearer ${testToken}`
+            'Authorization': `Bearer ${normalToken}`
           }
         });
 
-        // 注意:API可能会返回空列表而不是错误
-        // 根据实际实现,可能返回200且空列表,或返回404
-        // 这里我们假设返回200且空列表
-        expect(response.status).toBe(200);
+        // 应该返回403,因为用户没有企业权限
+        expect(response.status).toBe(403);
 
-        if (response.status === 200) {
-          const data = await response.json();
-          expect(data.data).toHaveLength(0);
-          expect(data.total).toBe(0);
-        }
+        const error = await response.json();
+        expect(error).toHaveProperty('message');
+        expect(error.message).toMatch(/enterprise/i);
       });
     });
 
@@ -1657,10 +1671,29 @@ describe('订单管理API集成测试', () => {
         }
       });
 
-      it('应该处理没有符合条件的视频文件', async () => {
+      it('应该拒绝无企业权限的用户批量下载 - 史诗012-15安全修复', async () => {
+        // 创建一个没有companyId的普通用户token
+        const dataSource = await IntegrationTestDatabase.getDataSource();
+        const userRepository = dataSource.getRepository(UserEntity);
+        const normalUser = userRepository.create({
+          username: `normal_user_dl_${Date.now()}`,
+          password: 'test_password',
+          nickname: '普通用户',
+          userType: UserType.ADMIN,
+          registrationSource: 'web',
+          isDisabled: 0,
+          isDeleted: 0
+        });
+        await userRepository.save(normalUser);
+
+        const normalToken = JWTUtil.generateToken({
+          id: normalUser.id,
+          username: normalUser.username,
+          roles: [{ name: 'user' }]
+        });
+
         const requestData = {
           downloadScope: DownloadScope.COMPANY,
-          companyId: 999999, // 不存在的企业
           assetTypes: [AssetType.CHECKIN_VIDEO]
         };
 
@@ -1668,19 +1701,16 @@ describe('订单管理API集成测试', () => {
           json: requestData
         }, {
           headers: {
-            'Authorization': `Bearer ${testToken}`
+            'Authorization': `Bearer ${normalToken}`
           }
         });
 
-        expect(response.status).toBe(200);
+        // 应该返回403,因为用户没有企业权限
+        expect(response.status).toBe(403);
 
-        if (response.status === 200) {
-          const data = await response.json();
-          expect(data.success).toBe(true);
-          expect(data.files).toHaveLength(0);
-          expect(data.totalFiles).toBe(0);
-          expect(data.message).toContain('未找到符合条件的视频文件');
-        }
+        const error = await response.json();
+        expect(error).toHaveProperty('message');
+        expect(error.message).toMatch(/enterprise/i);
       });
     });