Notes/spec/services/import/single.spec.ts

144 lines
4.8 KiB
TypeScript
Raw Normal View History

import 'jasmine';
2024-11-16 09:45:13 -07:00
import importSingle from '../../../src/services/import/single.js';
import importUtils from '../../../src/services/import/utils.js';
import BNote from '../../../src/becca/entities/bnote.js';
import TaskContext from '../../../src/services/task_context.js';
describe('HTML Import', () => {
let parentNote: BNote;
let taskContext: TaskContext;
beforeEach(() => {
// Create a mock parent note
parentNote = new BNote({
noteId: 'testParent',
title: 'Test Parent',
type: 'text',
mime: 'text/html'
});
// Create a mock task context
taskContext = new TaskContext('test', 'test');
// Set textImportedAsText to true to ensure HTML imports are processed
taskContext.data = { textImportedAsText: true };
2024-11-16 09:45:13 -07:00
});
describe('extractHtmlTitle', () => {
it('should extract title from HTML content', () => {
const html = `
<html>
<head>
<title>Test Title</title>
</head>
<body>
<p>Content</p>
</body>
</html>
`;
2024-11-16 09:45:13 -07:00
const title = importUtils.extractHtmlTitle(html);
expect(title).toBe('Test Title');
2024-11-16 09:45:13 -07:00
});
it('should return null if no title tag is present', () => {
2024-11-16 09:45:13 -07:00
const html = `
<html>
<head>
</head>
<body>
<p>Content</p>
</body>
</html>
`;
2024-11-16 09:45:13 -07:00
const title = importUtils.extractHtmlTitle(html);
expect(title).toBeNull();
2024-11-16 09:45:13 -07:00
});
});
describe('importSingleFile with HTML', () => {
it('should import HTML file with title from title tag', () => {
2024-11-16 09:45:13 -07:00
const file = {
originalname: 'test.html',
mimetype: 'text/html',
2024-11-16 09:45:13 -07:00
buffer: Buffer.from(`
<html>
<head>
<title>HTML Title</title>
</head>
<body>
<p>Test content</p>
2024-11-16 09:45:13 -07:00
</body>
</html>
`)
2024-11-16 09:45:13 -07:00
};
const note = importSingle.importSingleFile(taskContext, file, parentNote);
2024-11-16 09:45:13 -07:00
expect(note.title).toBe('HTML Title');
expect(note.mime).toBe('text/html');
2024-11-16 09:45:13 -07:00
});
it('should import HTML file with title from h1 when no title tag', () => {
2024-11-16 09:45:13 -07:00
const file = {
originalname: 'test.html',
mimetype: 'text/html',
2024-11-16 09:45:13 -07:00
buffer: Buffer.from(`
<html>
<body>
<h1>Heading Title</h1>
<p>Test content</p>
2024-11-16 09:45:13 -07:00
</body>
</html>
`)
2024-11-16 09:45:13 -07:00
};
const note = importSingle.importSingleFile(taskContext, file, parentNote);
expect(note.title).toBe('Heading Title');
expect(note.mime).toBe('text/html');
2024-11-16 09:45:13 -07:00
});
it('should import HTML file with filename as title when no title or h1', () => {
2024-11-16 09:45:13 -07:00
const file = {
originalname: 'test-document.html',
mimetype: 'text/html',
2024-11-16 09:45:13 -07:00
buffer: Buffer.from(`
<html>
<body>
<p>Test content without title</p>
2024-11-16 09:45:13 -07:00
</body>
</html>
`)
2024-11-16 09:45:13 -07:00
};
const note = importSingle.importSingleFile(taskContext, file, parentNote);
expect(note.title).toBe('test-document');
expect(note.mime).toBe('text/html');
2024-11-16 09:45:13 -07:00
});
it('should sanitize HTML content during import', () => {
2024-11-16 09:45:13 -07:00
const file = {
originalname: 'test.html',
mimetype: 'text/html',
2024-11-16 09:45:13 -07:00
buffer: Buffer.from(`
<html>
<head>
<title>Test Title</title>
<script>alert('xss');</script>
2024-11-16 09:45:13 -07:00
</head>
<body>
<p>Safe content</p>
<script>alert('xss');</script>
2024-11-16 09:45:13 -07:00
</body>
</html>
`)
2024-11-16 09:45:13 -07:00
};
const note = importSingle.importSingleFile(taskContext, file, parentNote);
expect(note.title).toBe('Test Title');
const content = note.getContent();
expect(content).not.toContain('<script>');
expect(content).toContain('<p>Safe content</p>');
2024-11-16 09:45:13 -07:00
});
});
});