import React from 'react'; import TestRenderer from 'react-test-renderer'; import { createDeliveryClient, Elements, ElementType } from '@kontent-ai/delivery-sdk'; import complexRichTextItem from './complexRichTextItem.json'; import multiLevelComponentsRichText from './multiLevelComponentsRichText.json'; import { Element as ParserElement } from 'html-react-parser'; import { RichTextElement, isComponent, isLinkedItem, ResolveLinkedItemType } from '../../../src'; import { Element as DomHandlerElement } from 'domhandler'; // test('Parse rich text', () => { // var mockClient = createDeliveryClient({ // projectId: 'dummyClient', // }); // const response = mockClient.item("dummyItem") // .map(richTextItem); // const { debug } = render(); // debug(); // }); describe('', () => { var mockClient = createDeliveryClient({ environmentId: 'dummyClient', }); const complexItemResponse = mockClient.item("dummyItem") .map(complexRichTextItem); const emptyRichText = { value: '


', type: ElementType.RichText, name: "dummy", links: [], images: [], linkedItems: [], linkedItemCodenames: [] } it('Empty rich-text value - render properly', () => { const testRenderer = TestRenderer.create( , ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); it('Simple rich-text value resolved simple dom node properly', () => { const testRenderer = TestRenderer.create( Lorem ipsum with bold text

" }} resolvers={{ resolveDomNode: ({ domNode, domToReact }) => { if (domNode instanceof ParserElement) { if (domNode.name === "strong") { return {domToReact(domNode.children)}; } } } }} />, ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); it('Simple rich-text value resolved when DOM Node was mutated', () => { const testRenderer = TestRenderer.create( Lorem ipsum with bold text

" }} resolvers={{ resolveDomNode: ({ domNode, domToReact }) => { if (domNode instanceof DomHandlerElement) { if (domNode.name === "strong") { domNode.attribs.class = domNode.attribs.class ? domNode.attribs.class + " strongClass" : "strongClass"; return undefined; } else if (domNode.name === "p") { domNode.attribs.class = domNode.attribs.class ? domNode.attribs.class + " pClass" : "pClass"; return undefined; } } } }} /> ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); it('Complex rich-text value - render properly no resolution', () => { const testRenderer = TestRenderer.create( , ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); it('Resolve images', () => { const testRenderer = TestRenderer.create( ( {image.description ) }} />, ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); it('Resolve links', () => { const complexValueRenderer = TestRenderer.create( { return ( {domToReact(domElement.children)} ); } }} />, ); expect(complexValueRenderer.toJSON()).toMatchSnapshot(); const simpleValueRenderer = TestRenderer.create( This is the page text.

', links: [ { urlSlug: "test-nico", type: "page", linkId: "1abb6bf1-1e29-4deb-bb0c-b5928ffb0cc9", codename: "test_page_nico" } ] } } resolvers={{ resolveLink: (link, { domElement, domToReact }): JSX.Element => { return ( // normally a Link component from gatsby package would be used {domToReact(domElement.children)} ); } }} />, ); expect(simpleValueRenderer.toJSON()).toMatchSnapshot(); }); describe('Resolve linked items from richText element', () => { it('with richText containing single level of linked items', () => { const testRenderer = TestRenderer.create( { if (isComponent(domElement)) { return ( <>

Component

{JSON.stringify(linkedItem, undefined, 2)}
; ); } if (isLinkedItem(domElement)) { return ( <>

Linked item

{JSON.stringify(linkedItem, undefined, 2)}
; ); } throw new Error("Unknown type of the linked item's dom node"); } }} />, ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); describe('with richText containing multiple level of linked items', () => { const multiLevelComponentsRichTextItem = mockClient.item("dummyItem") .map(multiLevelComponentsRichText); const resolveLinkedItemsRecursively: ResolveLinkedItemType = (linkedItem, _domNode) => { expect(linkedItem).toBeDefined(); switch (linkedItem?.system.type) { case "row": return (
); case "column": return (
) }; } it('does not resolve lower level without linkedItems attribute', () => { const testRenderer = TestRenderer.create( , ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); }); }); it('Resolve geneal node - wrap table element', () => { const testRenderer = TestRenderer.create( { if (domNode instanceof DomHandlerElement && domNode.name === 'table') { return
{domToReact([domNode])}
; } } }} />, ); expect(testRenderer.toJSON()).toMatchSnapshot(); }); });