import { SmartTestSelector, TestSelectionResult } from '../scripts/smart-test-selector'; import { testMapping, moduleToTests } from '../config/test-mapping.config'; describe('SmartTestSelector', () => { let selector: SmartTestSelector; beforeEach(() => { selector = new SmartTestSelector(); }); describe('selectTestsByChanges', () => { it('应该正确选择用户管理模块的测试', () => { const changedFiles = [ 'everything-is-suitable-admin/src/views/UserManagement.vue', ]; const result = selector.selectTestsByChanges(changedFiles); expect(result.selectedTests).toContain('e2e/user-management/*.spec.ts'); expect(result.affectedModules).toContain('user-management'); expect(result.changedFiles).toEqual(changedFiles); }); it('应该正确选择API相关的测试', () => { const changedFiles = [ 'everything-is-suitable-admin/src/api/user.ts', ]; const result = selector.selectTestsByChanges(changedFiles); expect(result.selectedTests).toContain('e2e/user-management/*.spec.ts'); expect(result.selectedTests).toContain('e2e/api/user-api.spec.ts'); expect(result.affectedModules).toContain('user-management'); expect(result.affectedModules).toContain('api'); }); it('应该正确处理多个变更文件', () => { const changedFiles = [ 'everything-is-suitable-admin/src/views/UserManagement.vue', 'everything-is-suitable-admin/src/api/user.ts', 'everything-is-suitable-admin/src/stores/user.ts', ]; const result = selector.selectTestsByChanges(changedFiles); expect(result.selectedTests.length).toBeGreaterThan(0); expect(result.affectedModules).toContain('user-management'); expect(result.affectedModules).toContain('api'); }); it('应该正确处理未映射的文件', () => { const changedFiles = [ 'everything-is-suitable-admin/src/views/UnknownFeature.vue', ]; const result = selector.selectTestsByChanges(changedFiles); expect(result.selectedTests).toEqual([]); expect(result.affectedModules).toEqual([]); expect(result.analysisReport).toContain('变更文件'); }); it('应该正确过滤优先级', () => { const changedFiles = [ 'everything-is-suitable-admin/src/views/UserManagement.vue', 'everything-is-suitable-admin/src/views/RoleManagement.vue', ]; const result = selector.selectTestsByChanges(changedFiles, { priority: 'high', }); result.selectedTests.forEach(test => { expect(test).toBeDefined(); }); }); it('应该正确处理关联分析', () => { const changedFiles = [ 'everything-is-suitable-admin/src/views/UserManagement.vue', ]; const resultWithRelated = selector.selectTestsByChanges(changedFiles, { includeRelated: true, }); const resultWithoutRelated = selector.selectTestsByChanges(changedFiles, { includeRelated: false, }); expect(resultWithRelated.selectedTests.length).toBeGreaterThanOrEqual( resultWithoutRelated.selectedTests.length ); }); }); describe('normalizePath', () => { it('应该正确标准化路径', () => { const selector = new SmartTestSelector(); expect((selector as any).normalizePath('src/views/Test.vue')).toBe('src/views/Test.vue'); expect((selector as any).normalizePath('./src/views/Test.vue')).toBe('src/views/Test.vue'); expect((selector as any).normalizePath('/absolute/path/Test.vue')).toBe('/absolute/path/Test.vue'); }); }); describe('findMapping', () => { it('应该找到精确匹配的映射', () => { const selector = new SmartTestSelector(); const mapping = (selector as any).findMapping('everything-is-suitable-admin/src/views/UserManagement.vue'); expect(mapping).toBeDefined(); expect(mapping.tests).toContain('e2e/user-management/*.spec.ts'); expect(mapping.priority).toBe('high'); expect(mapping.modules).toContain('user-management'); }); it('应该找到模糊匹配的映射', () => { const selector = new SmartTestSelector(); const mapping = (selector as any).findMapping('everything-is-suitable-admin/src/api/new-api.ts'); expect(mapping).toBeDefined(); if (mapping) { expect(mapping.tests).toBeDefined(); } }); it('应该返回null当没有匹配时', () => { const selector = new SmartTestSelector(); const mapping = (selector as any).findMapping('unknown/path/file.ts'); expect(mapping).toBeNull(); }); }); describe('addRelatedTests', () => { it('应该添加相关模块的测试', () => { const selector = new SmartTestSelector(); const selectedTests = new Set(); const affectedModules = new Set(); (selector as any).addRelatedTests(['user-management'], selectedTests, affectedModules); expect(selectedTests.size).toBeGreaterThanOrEqual(0); expect(affectedModules.size).toBeGreaterThanOrEqual(0); }); }); describe('generateAnalysisReport', () => { it('应该生成详细的分析报告', () => { const selector = new SmartTestSelector(); const data = { changedFiles: ['src/views/Test.vue'], affectedModules: ['test-module'], selectedTests: ['e2e/test.spec.ts'], }; const report = (selector as any).generateAnalysisReport(data); expect(report).toContain('变更文件'); expect(report).toContain('受影响模块'); expect(report).toContain('选中测试用例'); expect(report).toContain('执行建议'); }); }); }); describe('Test Mapping Configuration', () => { it('应该包含用户管理模块的映射', () => { expect(testMapping['everything-is-suitable-admin/src/views/UserManagement.vue']).toBeDefined(); expect(testMapping['everything-is-suitable-admin/src/views/UserManagement.vue'].priority).toBe('high'); }); it('应该包含角色管理模块的映射', () => { expect(testMapping['everything-is-suitable-admin/src/views/RoleManagement.vue']).toBeDefined(); expect(testMapping['everything-is-suitable-admin/src/views/RoleManagement.vue'].priority).toBe('high'); }); it('应该包含API的映射', () => { expect(testMapping['everything-is-suitable-admin/src/api/user.ts']).toBeDefined(); expect(testMapping['everything-is-suitable-admin/src/api/user.ts'].modules).toContain('api'); }); it('模块到测试的映射应该正确', () => { expect(moduleToTests['user-management']).toBeDefined(); expect(moduleToTests['user-management']).toContain('e2e/user-management/*.spec.ts'); }); });