UNPKG

dnssweeper-cli

Version:

CLI tool for detecting and analyzing unused DNS records

195 lines 8.76 kB
"use strict"; /** * riskAnalyzer.ts のユニットテスト */ Object.defineProperty(exports, "__esModule", { value: true }); const riskAnalyzer_1 = require("./riskAnalyzer"); // モックデータ作成ヘルパー const createMockResult = (name, riskScore, riskLevel, patterns = [], modified = '2024-01-01T00:00:00Z') => ({ record: { name, type: 'A', content: '192.168.1.1', ttl: 300, proxied: false, created: '2023-01-01T00:00:00Z', modified, }, riskScore, riskLevel, matchedPatterns: patterns, reasons: ['テスト理由'], }); describe('riskAnalyzer', () => { describe('generateAnalysisSummary', () => { const mockResults = [ createMockResult('critical.com', 100, 'critical'), createMockResult('high1.com', 80, 'high'), createMockResult('high2.com', 75, 'high'), createMockResult('medium.com', 60, 'medium'), createMockResult('low.com', 40, 'low'), createMockResult('safe1.com', 10, 'safe'), createMockResult('safe2.com', 5, 'safe'), ]; it('正しいサマリーを生成する', () => { const summary = (0, riskAnalyzer_1.generateAnalysisSummary)(mockResults, 1.5); expect(summary.totalRecords).toBe(7); expect(summary.processingTime).toBe(1.5); expect(summary.riskDistribution).toEqual({ critical: 1, high: 2, medium: 1, low: 1, safe: 2, }); }); it('高リスクレコードのトップ10を抽出する', () => { const summary = (0, riskAnalyzer_1.generateAnalysisSummary)(mockResults, 1.0); expect(summary.topRiskyRecords).toHaveLength(5); // safe以外の5件 expect(summary.topRiskyRecords[0].riskScore).toBe(100); expect(summary.topRiskyRecords[1].riskScore).toBe(80); }); it('空の結果でもエラーが発生しない', () => { const summary = (0, riskAnalyzer_1.generateAnalysisSummary)([], 0.1); expect(summary.totalRecords).toBe(0); expect(summary.topRiskyRecords).toHaveLength(0); expect(summary.riskDistribution).toEqual({ critical: 0, high: 0, medium: 0, low: 0, safe: 0, }); }); }); describe('getRiskLevelColor', () => { it('各リスクレベルに対して正しい色情報を返す', () => { const critical = (0, riskAnalyzer_1.getRiskLevelColor)('critical'); expect(critical.color).toBe('red'); expect(critical.symbol).toBe('🔴'); expect(critical.label).toBe('クリティカル'); const safe = (0, riskAnalyzer_1.getRiskLevelColor)('safe'); expect(safe.color).toBe('green'); expect(safe.symbol).toBe('🟢'); expect(safe.label).toBe('安全'); }); }); describe('getRecommendedForDeletion', () => { const mockResults = [ createMockResult('critical.com', 100, 'critical'), createMockResult('high.com', 80, 'high'), createMockResult('medium.com', 60, 'medium'), createMockResult('low.com', 40, 'low'), createMockResult('safe.com', 10, 'safe'), ]; it('デフォルトでhigh以上を削除推奨として返す', () => { const recommended = (0, riskAnalyzer_1.getRecommendedForDeletion)(mockResults); expect(recommended).toHaveLength(2); expect(recommended.every(r => ['high', 'critical'].includes(r.riskLevel))).toBe(true); }); it('指定したリスクレベル以上を返す', () => { const recommended = (0, riskAnalyzer_1.getRecommendedForDeletion)(mockResults, 'medium'); expect(recommended).toHaveLength(3); expect(recommended.every(r => ['medium', 'high', 'critical'].includes(r.riskLevel))).toBe(true); }); }); describe('calculateStatistics', () => { const mockResults = [ createMockResult('r1', 100, 'critical'), createMockResult('r2', 80, 'high'), createMockResult('r3', 60, 'medium'), createMockResult('r4', 40, 'low'), createMockResult('r5', 20, 'safe'), ]; it('正しい統計情報を計算する', () => { const stats = (0, riskAnalyzer_1.calculateStatistics)(mockResults); expect(stats.averageRiskScore).toBe(60); expect(stats.medianRiskScore).toBe(60); expect(stats.maxRiskScore).toBe(100); expect(stats.minRiskScore).toBe(20); }); it('スコア分布を正しく計算する', () => { const stats = (0, riskAnalyzer_1.calculateStatistics)(mockResults); expect(stats.riskScoreDistribution['20-29']).toBe(1); expect(stats.riskScoreDistribution['40-49']).toBe(1); expect(stats.riskScoreDistribution['60-69']).toBe(1); expect(stats.riskScoreDistribution['80-89']).toBe(1); expect(stats.riskScoreDistribution['100-109']).toBe(1); }); it('空の結果でも安全に処理される', () => { const stats = (0, riskAnalyzer_1.calculateStatistics)([]); expect(stats.averageRiskScore).toBe(0); expect(stats.medianRiskScore).toBe(0); expect(stats.maxRiskScore).toBe(0); expect(stats.minRiskScore).toBe(0); expect(stats.riskScoreDistribution).toEqual({}); }); }); describe('getCommonRiskPatterns', () => { const mockResults = [ createMockResult('r1', 100, 'critical', ['prefix:old-', 'suffix:-test']), createMockResult('r2', 80, 'high', ['prefix:old-']), createMockResult('r3', 60, 'medium', [ 'prefix:old-', 'keyword:deprecated', ]), createMockResult('r4', 40, 'low', ['suffix:-test']), ]; it('最も一般的なパターンを抽出する', () => { const patterns = (0, riskAnalyzer_1.getCommonRiskPatterns)(mockResults); expect(patterns[0].pattern).toBe('prefix:old-'); expect(patterns[0].count).toBe(3); expect(patterns[0].percentage).toBe(75.0); expect(patterns[1].pattern).toBe('suffix:-test'); expect(patterns[1].count).toBe(2); expect(patterns[1].percentage).toBe(50.0); }); it('最大10件まで返す', () => { const manyPatterns = []; for (let i = 0; i < 15; i++) { manyPatterns.push(createMockResult(`r${i}`, 50, 'medium', [`pattern${i}`])); } const patterns = (0, riskAnalyzer_1.getCommonRiskPatterns)(manyPatterns); expect(patterns.length).toBeLessThanOrEqual(10); }); }); describe('analyzeRiskByTime', () => { const mockResults = [ createMockResult('r1', 100, 'critical', [], '2022-01-01T00:00:00Z'), createMockResult('r2', 80, 'high', [], '2022-06-01T00:00:00Z'), createMockResult('r3', 60, 'medium', [], '2023-01-01T00:00:00Z'), createMockResult('r4', 40, 'low', [], '2023-06-01T00:00:00Z'), createMockResult('r5', 20, 'safe', [], '2024-01-01T00:00:00Z'), ]; it('年別のリスク分布を計算する', () => { const analysis = (0, riskAnalyzer_1.analyzeRiskByTime)(mockResults); expect(analysis.yearlyRiskDistribution['2022']).toEqual({ critical: 1, high: 1, medium: 0, low: 0, safe: 0, }); expect(analysis.yearlyRiskDistribution['2023']).toEqual({ critical: 0, high: 0, medium: 1, low: 1, safe: 0, }); }); it('最も古いレコードと新しいレコードを抽出する', () => { const analysis = (0, riskAnalyzer_1.analyzeRiskByTime)(mockResults); expect(analysis.oldestRecords).toHaveLength(5); expect(analysis.oldestRecords[0].record.modified).toBe('2022-01-01T00:00:00Z'); expect(analysis.newestRecords).toHaveLength(5); expect(analysis.newestRecords[0].record.modified).toBe('2024-01-01T00:00:00Z'); }); }); }); // テスト終了後のクリーンアップ afterAll(() => { // モックをクリア jest.clearAllMocks(); }); //# sourceMappingURL=riskAnalyzer.test.js.map