UNPKG

dnssweeper-cli

Version:

CLI tool for detecting and analyzing unused DNS records

129 lines 6.43 kB
"use strict"; /** * csvParser.ts のユニットテスト */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const csvParser_1 = require("./csvParser"); const fs_1 = require("fs"); const path_1 = __importDefault(require("path")); // モックデータ const mockCSVContent = `Name,Type,Content,TTL,Proxied,Created,Modified example.com,A,192.168.1.1,300,true,2023-01-15T10:00:00Z,2024-12-01T15:30:00Z www.example.com,A,192.168.1.1,300,true,2023-01-15T10:00:00Z,2024-12-15T09:00:00Z `; const mockInvalidCSV = `Name,Type,Content,TTL,Proxied,Created,Modified ,A,192.168.1.1,300,true,2023-01-15T10:00:00Z,2024-12-01T15:30:00Z example.com,,192.168.1.1,300,true,2023-01-15T10:00:00Z,2024-12-15T09:00:00Z valid.com,A,192.168.1.2,300,false,2023-01-15T10:00:00Z,2024-12-15T09:00:00Z `; describe('csvParser', () => { const tempDir = path_1.default.join(process.cwd(), 'test', 'temp'); const tempFile = path_1.default.join(tempDir, 'test.csv'); beforeAll(async () => { // テスト用の一時ディレクトリ作成 await fs_1.promises.mkdir(tempDir, { recursive: true }); }); afterAll(async () => { // 一時ディレクトリのクリーンアップ try { await fs_1.promises.rmdir(tempDir, { recursive: true }); } catch (error) { // エラーは無視 } }); describe('parseDNSRecordsFromCSV', () => { it('正常なCSVファイルを解析できる', async () => { // テスト用CSVファイルを作成 await fs_1.promises.writeFile(tempFile, mockCSVContent); const records = await (0, csvParser_1.parseDNSRecordsFromCSV)(tempFile); expect(records).toHaveLength(2); expect(records[0]).toMatchObject({ name: 'example.com', type: 'A', content: '192.168.1.1', ttl: 300, proxied: true, }); }); it('存在しないファイルでエラーが発生する', async () => { const nonExistentFile = path_1.default.join(tempDir, 'non-existent.csv'); await expect((0, csvParser_1.parseDNSRecordsFromCSV)(nonExistentFile)).rejects.toThrow('CSVファイル読み込みエラー'); }); it('必須フィールドが不足しているレコードをフィルタリングする', async () => { await fs_1.promises.writeFile(tempFile, mockInvalidCSV); const records = await (0, csvParser_1.parseDNSRecordsFromCSV)(tempFile); // 最初の2レコード(Nameが空、Typeが空)はフィルタリングされる expect(records).toHaveLength(1); expect(records[0].name).toBe('valid.com'); }); it('空のCSVファイルで空の配列を返す', async () => { const emptyCSV = 'Name,Type,Content,TTL,Proxied,Created,Modified\n'; await fs_1.promises.writeFile(tempFile, emptyCSV); const records = await (0, csvParser_1.parseDNSRecordsFromCSV)(tempFile); expect(records).toHaveLength(0); }); it('CSVパースエラーが適切に処理される', async () => { const malformedCSV = 'Name,Type,Content,TTL,Proxied,Created,Modified\n"Unclosed quote,A,192.168.1.1'; await fs_1.promises.writeFile(tempFile, malformedCSV); // Papa Parseは不正なCSVでもある程度パースしようとするため、 // エラーが発生する場合は例外がスローされる await expect((0, csvParser_1.parseDNSRecordsFromCSV)(tempFile)).rejects.toThrow(); }); }); describe('validateDNSRecord', () => { const validRecord = { name: 'example.com', type: 'A', content: '192.168.1.1', ttl: 300, proxied: false, created: '2023-01-15T10:00:00Z', modified: '2024-12-01T15:30:00Z', }; it('有効なDNSレコードを検証できる', () => { const result = (0, csvParser_1.validateDNSRecord)(validRecord); expect(result.isValid).toBe(true); expect(result.errors).toHaveLength(0); }); it('名前がないレコードでエラーを返す', () => { const invalidRecord = { ...validRecord, name: '' }; const result = (0, csvParser_1.validateDNSRecord)(invalidRecord); expect(result.isValid).toBe(false); expect(result.errors).toContain('Name フィールドが必須です'); }); it('タイプがないレコードでエラーを返す', () => { const invalidRecord = { ...validRecord, type: '' }; const result = (0, csvParser_1.validateDNSRecord)(invalidRecord); expect(result.isValid).toBe(false); expect(result.errors).toContain('Type フィールドが必須です'); }); it('サポートされていないタイプでエラーを返す', () => { const invalidRecord = { ...validRecord, type: 'INVALID' }; const result = (0, csvParser_1.validateDNSRecord)(invalidRecord); expect(result.isValid).toBe(false); expect(result.errors).toContain('サポートされていないDNSレコードタイプ: INVALID'); }); it('TTL値が範囲外でエラーを返す', () => { const invalidRecord = { ...validRecord, ttl: 100000 }; const result = (0, csvParser_1.validateDNSRecord)(invalidRecord); expect(result.isValid).toBe(false); expect(result.errors).toContain('TTL値が範囲外です: 100000 (1-86400)'); }); it('複数のエラーを同時に検出できる', () => { const invalidRecord = { ...validRecord, name: '', type: '', ttl: 0 }; const result = (0, csvParser_1.validateDNSRecord)(invalidRecord); expect(result.isValid).toBe(false); expect(result.errors.length).toBeGreaterThan(2); }); }); }); // テスト終了後のクリーンアップ afterAll(() => { // ファイルシステム関連のモックをクリア jest.restoreAllMocks(); }); //# sourceMappingURL=csvParser.test.js.map