Initial AI manga platform
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
import { BadRequestException } from '@nestjs/common';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { NovelParserService } from './novel-parser.service';
|
||||
|
||||
describe('NovelParserService', () => {
|
||||
const service = new NovelParserService();
|
||||
|
||||
it('extracts plain text buffers', async () => {
|
||||
const result = await service.extractText(
|
||||
'local://novels/test.txt',
|
||||
'text/plain',
|
||||
Buffer.from('第1章 开始\n这是正文。')
|
||||
);
|
||||
|
||||
expect(result.extractor).toBe('plain_text');
|
||||
expect(result.text).toContain('这是正文');
|
||||
});
|
||||
|
||||
it('cleans text and splits chapters by headings', () => {
|
||||
const parsed = service.parseText(`
|
||||
第1章 重生
|
||||
她在暴雨里醒来,决定重新夺回属于自己的事业。
|
||||
https://example.com
|
||||
|
||||
第二章 反击
|
||||
会议室里,所有人都等着看她出错,她却拿出了完整方案。
|
||||
`);
|
||||
|
||||
expect(parsed.chapter_count).toBe(2);
|
||||
expect(parsed.parse_report.strategy).toBe('heading');
|
||||
expect(parsed.parse_report.removed_line_count).toBe(1);
|
||||
expect(parsed.chapters[0].title).toBe('第1章 重生');
|
||||
expect(parsed.chapters[1].content).toContain('完整方案');
|
||||
});
|
||||
|
||||
it('falls back to chunk splitting when headings are missing', () => {
|
||||
const parsed = service.parseText(
|
||||
'她醒来时,窗外正在下雨。她意识到命运已经重新开始,于是把所有证据重新整理,准备迎接第一场反击。'
|
||||
);
|
||||
|
||||
expect(parsed.chapter_count).toBe(1);
|
||||
expect(parsed.parse_report.strategy).toBe('word_chunk');
|
||||
expect(parsed.parse_report.warnings[0]).toContain('按字数切分');
|
||||
});
|
||||
|
||||
it('rejects text that is too short', () => {
|
||||
expect(() => service.parseText('太短')).toThrow(BadRequestException);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user