dnssweeper-cli
Version:
CLI tool for detecting and analyzing unused DNS records
195 lines • 8.71 kB
JavaScript
;
/**
* patternMatcher.ts のユニットテスト
*/
Object.defineProperty(exports, "__esModule", { value: true });
const patternMatcher_1 = require("./patternMatcher");
// モックパターン設定
const mockPatternConfig = {
version: '1.0.0',
description: 'テスト用パターン',
patterns: {
prefixes: {
high: ['old-', 'temp-', 'test-'],
medium: ['backup-', 'legacy-'],
low: ['new-', 'beta-'],
},
suffixes: {
high: ['-old', '-temp', '-test'],
medium: ['-backup', '-legacy'],
low: ['-new', '-beta'],
},
keywords: {
high: ['obsolete', 'deprecated'],
medium: ['archive'],
low: ['upcoming'],
},
},
scoring: {
high: 80,
medium: 50,
low: 30,
base: 10,
},
thresholds: {
critical: 90,
high: 70,
medium: 50,
low: 30,
safe: 0,
},
};
// モックDNSレコード(最近の日付を使用して日付ペナルティを回避)
const mockDNSRecord = {
name: 'example.com',
type: 'A',
content: '192.168.1.1',
ttl: 300,
proxied: false,
created: '2023-01-15T10:00:00Z',
modified: new Date().toISOString(), // 現在の日付を使用
};
describe('patternMatcher', () => {
describe('analyzeRecord', () => {
it('パターンにマッチしないレコードのリスクスコアは基本スコアのみ', () => {
const result = (0, patternMatcher_1.analyzeRecord)(mockDNSRecord, mockPatternConfig);
expect(result.riskScore).toBe(10); // base score only (最近の日付なので追加スコアなし)
expect(result.riskLevel).toBe('safe');
expect(result.matchedPatterns).toHaveLength(0);
});
it('高リスクプレフィックスを検出する', () => {
const record = { ...mockDNSRecord, name: 'old-api.example.com' };
const result = (0, patternMatcher_1.analyzeRecord)(record, mockPatternConfig);
expect(result.riskScore).toBe(90); // base(10) + high(80)
expect(result.riskLevel).toBe('critical');
expect(result.matchedPatterns).toContain('prefix:old-');
expect(result.reasons).toContain('危険なプレフィックス「old-」が検出されました');
});
it('中リスクサフィックスを検出する', () => {
const record = { ...mockDNSRecord, name: 'api-backup.example.com' };
const result = (0, patternMatcher_1.analyzeRecord)(record, mockPatternConfig);
expect(result.riskScore).toBe(60); // base(10) + medium(50)
expect(result.riskLevel).toBe('medium');
expect(result.matchedPatterns).toContain('suffix:-backup');
});
it('低リスクキーワードを検出する', () => {
const record = { ...mockDNSRecord, name: 'upcoming-feature.example.com' };
const result = (0, patternMatcher_1.analyzeRecord)(record, mockPatternConfig);
expect(result.riskScore).toBe(40); // base(10) + low(30)
expect(result.riskLevel).toBe('low');
expect(result.matchedPatterns).toContain('keyword:upcoming');
});
it('複数のパターンマッチでスコアが累積する', () => {
const record = {
...mockDNSRecord,
name: 'old-system-backup.example.com',
};
const result = (0, patternMatcher_1.analyzeRecord)(record, mockPatternConfig);
// base(10) + high prefix(80) + medium suffix(50) = 140
expect(result.riskScore).toBe(140);
expect(result.riskLevel).toBe('critical');
expect(result.matchedPatterns).toHaveLength(2);
});
it('1年以上更新されていないレコードに追加スコアを付与', () => {
const oldDate = new Date();
oldDate.setFullYear(oldDate.getFullYear() - 2);
const record = { ...mockDNSRecord, modified: oldDate.toISOString() };
const result = (0, patternMatcher_1.analyzeRecord)(record, mockPatternConfig);
expect(result.riskScore).toBeGreaterThan(10); // base + age penalty
expect(result.reasons.some(r => r.includes('最終更新から'))).toBe(true);
});
it('CNAMEレコードに追加スコアを付与', () => {
const record = { ...mockDNSRecord, type: 'CNAME' };
const result = (0, patternMatcher_1.analyzeRecord)(record, mockPatternConfig);
expect(result.riskScore).toBe(15); // base(10) + CNAME(5)
expect(result.reasons).toContain('CNAMEレコードは参照先の変更に注意が必要です');
});
it('大文字小文字を区別せずにマッチング', () => {
const record = { ...mockDNSRecord, name: 'OLD-API.EXAMPLE.COM' };
const result = (0, patternMatcher_1.analyzeRecord)(record, mockPatternConfig);
expect(result.matchedPatterns).toContain('prefix:old-');
});
});
describe('analyzeRecords', () => {
it('複数のレコードを一度に分析できる', () => {
const records = [
mockDNSRecord,
{ ...mockDNSRecord, name: 'old-api.example.com' },
{ ...mockDNSRecord, name: 'backup-db.example.com' },
];
const results = (0, patternMatcher_1.analyzeRecords)(records, mockPatternConfig);
expect(results).toHaveLength(3);
expect(results[0].riskScore).toBe(10); // safe
expect(results[1].riskScore).toBe(90); // critical
expect(results[2].riskScore).toBe(60); // medium
});
});
describe('filterByRiskLevel', () => {
const results = [
{ riskLevel: 'safe', riskScore: 10 },
{ riskLevel: 'low', riskScore: 40 },
{ riskLevel: 'medium', riskScore: 60 },
{ riskLevel: 'high', riskScore: 80 },
{ riskLevel: 'critical', riskScore: 100 },
].map(r => ({
...r,
record: mockDNSRecord,
matchedPatterns: [],
reasons: [],
}));
it('指定したリスクレベル以上のレコードをフィルタリング', () => {
const filtered = (0, patternMatcher_1.filterByRiskLevel)(results, 'medium');
expect(filtered).toHaveLength(3); // medium, high, critical
expect(filtered.every(r => ['medium', 'high', 'critical'].includes(r.riskLevel))).toBe(true);
});
it('criticalを指定した場合はcriticalのみ', () => {
const filtered = (0, patternMatcher_1.filterByRiskLevel)(results, 'critical');
expect(filtered).toHaveLength(1);
expect(filtered[0].riskLevel).toBe('critical');
});
it('safeを指定した場合はすべて含む', () => {
const filtered = (0, patternMatcher_1.filterByRiskLevel)(results, 'safe');
expect(filtered).toHaveLength(5);
});
});
describe('sortByRiskScore', () => {
const results = [
{ riskScore: 50 },
{ riskScore: 100 },
{ riskScore: 30 },
{ riskScore: 80 },
].map(r => ({
...r,
record: mockDNSRecord,
riskLevel: 'medium',
matchedPatterns: [],
reasons: [],
}));
it('デフォルトで降順ソート', () => {
const sorted = (0, patternMatcher_1.sortByRiskScore)(results);
expect(sorted[0].riskScore).toBe(100);
expect(sorted[1].riskScore).toBe(80);
expect(sorted[2].riskScore).toBe(50);
expect(sorted[3].riskScore).toBe(30);
});
it('昇順ソートも可能', () => {
const sorted = (0, patternMatcher_1.sortByRiskScore)(results, false);
expect(sorted[0].riskScore).toBe(30);
expect(sorted[1].riskScore).toBe(50);
expect(sorted[2].riskScore).toBe(80);
expect(sorted[3].riskScore).toBe(100);
});
it('元の配列を変更しない', () => {
const originalLength = results.length;
(0, patternMatcher_1.sortByRiskScore)(results);
expect(results).toHaveLength(originalLength);
expect(results[0].riskScore).toBe(50); // 元の順序を保持
});
});
});
// テスト終了後のクリーンアップ
afterAll(() => {
// モックをクリア
jest.clearAllMocks();
});
//# sourceMappingURL=patternMatcher.test.js.map