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(
(
)
}}
/>,
);
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();
});
});