150 lines
6.0 KiB
TypeScript
150 lines
6.0 KiB
TypeScript
import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle';
|
|
import { DeesInputWysiwyg } from '../ts_web/elements/wysiwyg/dees-input-wysiwyg.js';
|
|
import { DeesWysiwygBlock } from '../ts_web/elements/wysiwyg/dees-wysiwyg-block.js';
|
|
|
|
tap.test('Phase 3: Quote block should render and work correctly', async () => {
|
|
const editor: DeesInputWysiwyg = await webhelpers.fixture(
|
|
webhelpers.html`<dees-input-wysiwyg></dees-input-wysiwyg>`
|
|
);
|
|
|
|
// Import a quote block
|
|
editor.importBlocks([
|
|
{ id: 'quote-1', type: 'quote', content: 'This is a famous quote' }
|
|
]);
|
|
|
|
await editor.updateComplete;
|
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
// Check if quote block was rendered
|
|
const quoteBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-1"]');
|
|
const quoteBlockComponent = quoteBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock;
|
|
expect(quoteBlockComponent).toBeTruthy();
|
|
|
|
const quoteContainer = quoteBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement;
|
|
const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement;
|
|
expect(quoteElement).toBeTruthy();
|
|
expect(quoteElement?.textContent).toEqual('This is a famous quote');
|
|
|
|
// Check if styles are applied (border-left for quote)
|
|
const computedStyle = window.getComputedStyle(quoteElement);
|
|
expect(computedStyle.borderLeftStyle).toEqual('solid');
|
|
expect(computedStyle.fontStyle).toEqual('italic');
|
|
});
|
|
|
|
tap.test('Phase 3: Code block should render and handle tab correctly', async () => {
|
|
const editor: DeesInputWysiwyg = await webhelpers.fixture(
|
|
webhelpers.html`<dees-input-wysiwyg></dees-input-wysiwyg>`
|
|
);
|
|
|
|
// Import a code block
|
|
editor.importBlocks([
|
|
{ id: 'code-1', type: 'code', content: 'const x = 42;', metadata: { language: 'javascript' } }
|
|
]);
|
|
|
|
await editor.updateComplete;
|
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
// Check if code block was rendered
|
|
const codeBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="code-1"]');
|
|
const codeBlockComponent = codeBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock;
|
|
const codeContainer = codeBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement;
|
|
const codeElement = codeContainer?.querySelector('.block.code') as HTMLElement;
|
|
|
|
expect(codeElement).toBeTruthy();
|
|
expect(codeElement?.textContent).toEqual('const x = 42;');
|
|
|
|
// Check if language label is shown
|
|
const languageLabel = codeContainer?.querySelector('.code-language');
|
|
expect(languageLabel?.textContent).toEqual('javascript');
|
|
|
|
// Check if monospace font is applied
|
|
const computedStyle = window.getComputedStyle(codeElement);
|
|
expect(computedStyle.fontFamily).toContain('monospace');
|
|
});
|
|
|
|
tap.test('Phase 3: List block should render correctly', async () => {
|
|
const editor: DeesInputWysiwyg = await webhelpers.fixture(
|
|
webhelpers.html`<dees-input-wysiwyg></dees-input-wysiwyg>`
|
|
);
|
|
|
|
// Import a list block
|
|
editor.importBlocks([
|
|
{ id: 'list-1', type: 'list', content: 'First item\nSecond item\nThird item' }
|
|
]);
|
|
|
|
await editor.updateComplete;
|
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
// Check if list block was rendered
|
|
const listBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="list-1"]');
|
|
const listBlockComponent = listBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock;
|
|
const listContainer = listBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement;
|
|
const listElement = listContainer?.querySelector('.block.list') as HTMLElement;
|
|
|
|
expect(listElement).toBeTruthy();
|
|
|
|
// Check if list items were created
|
|
const listItems = listElement?.querySelectorAll('li');
|
|
expect(listItems?.length).toEqual(3);
|
|
expect(listItems?.[0].textContent).toEqual('First item');
|
|
expect(listItems?.[1].textContent).toEqual('Second item');
|
|
expect(listItems?.[2].textContent).toEqual('Third item');
|
|
|
|
// Check if it's an unordered list by default
|
|
const ulElement = listElement?.querySelector('ul');
|
|
expect(ulElement).toBeTruthy();
|
|
});
|
|
|
|
tap.test('Phase 3: Quote block split should work', async () => {
|
|
const editor: DeesInputWysiwyg = await webhelpers.fixture(
|
|
webhelpers.html`<dees-input-wysiwyg></dees-input-wysiwyg>`
|
|
);
|
|
|
|
// Import a quote block
|
|
editor.importBlocks([
|
|
{ id: 'quote-split', type: 'quote', content: 'To be or not to be' }
|
|
]);
|
|
|
|
await editor.updateComplete;
|
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
// Get the quote block
|
|
const quoteBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-split"]');
|
|
const quoteBlockComponent = quoteBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock;
|
|
const quoteContainer = quoteBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement;
|
|
const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement;
|
|
|
|
// Focus and set cursor after "To be"
|
|
quoteElement.focus();
|
|
const textNode = quoteElement.firstChild;
|
|
if (textNode && textNode.nodeType === Node.TEXT_NODE) {
|
|
const range = document.createRange();
|
|
const selection = window.getSelection();
|
|
range.setStart(textNode, 5); // After "To be"
|
|
range.setEnd(textNode, 5);
|
|
selection?.removeAllRanges();
|
|
selection?.addRange(range);
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
// Press Enter to split
|
|
const enterEvent = new KeyboardEvent('keydown', {
|
|
key: 'Enter',
|
|
code: 'Enter',
|
|
bubbles: true,
|
|
cancelable: true,
|
|
composed: true
|
|
});
|
|
|
|
quoteElement.dispatchEvent(enterEvent);
|
|
await new Promise(resolve => setTimeout(resolve, 200));
|
|
|
|
// Check if split happened correctly
|
|
expect(editor.blocks.length).toEqual(2);
|
|
expect(editor.blocks[0].content).toEqual('To be');
|
|
expect(editor.blocks[1].content).toEqual(' or not to be');
|
|
expect(editor.blocks[1].type).toEqual('paragraph'); // New block should be paragraph
|
|
}
|
|
});
|
|
|
|
export default tap.start(); |