Skip to content

Commit c84f61e

Browse files
committed
Adjust Markdown tests
1 parent 59f4596 commit c84f61e

3 files changed

Lines changed: 35 additions & 21 deletions

File tree

src/cmem/markdown/Markdown.test.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22
import { render } from "@testing-library/react";
33

4-
import { reduceToText } from "../../common/utils/reduceToText";
4+
import { truncateMarkdownDisplay } from "../../common/utils/truncateMarkdownDisplay";
55

66
import { Markdown } from "./Markdown";
77

@@ -46,7 +46,7 @@ describe("Markdown", () => {
4646
"After table.",
4747
].join("\n");
4848

49-
const { container } = render(<Markdown cutOff={35}>{content}</Markdown>);
49+
const { container } = render(<Markdown cutOff={55}>{content}</Markdown>);
5050

5151
expect(container.querySelector("table")).toBeTruthy();
5252
expect(container.textContent).toContain("Name");
@@ -70,7 +70,7 @@ describe("Markdown", () => {
7070
].join("\n");
7171

7272
for (const cutOff of [152, 153]) {
73-
const { container } = render(<Markdown cutOff={cutOff}>{content}</Markdown>);
73+
const { container } = render(truncateMarkdownDisplay(<Markdown cutOff={cutOff}>{content}</Markdown>));
7474

7575
expect(container.querySelectorAll("pre")).toHaveLength(2);
7676
expect(container.textContent).toContain('const status = "ready";');
@@ -80,9 +80,15 @@ describe("Markdown", () => {
8080
}
8181
});
8282

83-
it("does not call display truncation when cutOff is absent", () => {
84-
const content = "Plain **markdown** with [a link](https://example.com).";
83+
it("renders a link at the end of long content when cutOff is absent", () => {
84+
const content = `${Array.from({ length: 40 }, (_, index) => `Long visible paragraph part ${index + 1}.`).join(
85+
" ",
86+
)} [final reference](https://example.com/final-reference)`;
87+
88+
const { container } = render(<Markdown>{content}</Markdown>);
8589

86-
expect(reduceToText(<Markdown>{content}</Markdown>)).toContain("Plain markdown with a link");
90+
expect(container.textContent).toContain("Long visible paragraph part 1.");
91+
expect(container.textContent).toContain("final reference");
92+
expect(container.querySelector('a[href="https://example.com/final-reference"]')).toBeTruthy();
8793
});
8894
});

src/cmem/markdown/Markdown.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { remarkDefinitionList } from "remark-definition-list";
88
import remarkGfm from "remark-gfm";
99
import { PluggableList } from "unified";
1010

11-
import { truncateMarkdownDisplay } from "../../common/utils/truncateMarkdownDisplay";
1211
import { TestableComponent } from "../../components";
1312
import { HtmlContentBlock, HtmlContentBlockProps } from "../../components/Typography";
1413
import { CLASSPREFIX as eccgui } from "../../configuration/constants";
@@ -125,7 +124,8 @@ const configDefault = {
125124
skipHtml: false,
126125
};
127126

128-
const MarkdownInner = ({
127+
/** Renders a markdown string. */
128+
export const Markdown = ({
129129
children,
130130
allowHtml = false,
131131
removeMarkup = false,
@@ -212,6 +212,3 @@ const MarkdownInner = ({
212212
</HtmlContentBlock>
213213
);
214214
};
215-
216-
/** Renders a markdown string. */
217-
export const Markdown = (props: MarkdownProps) => truncateMarkdownDisplay(<MarkdownInner {...props} />);

src/common/utils/truncateMarkdownDisplay.test.tsx

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
11
import React from "react";
2+
import ReactMarkdown from "react-markdown";
23

3-
import { Markdown, MarkdownProps } from "../../cmem/markdown/Markdown";
4+
import { truncateMarkdown } from "../../cmem/markdown/truncateMarkdown";
45

56
import { reduceToText } from "./reduceToText";
67
import { truncateMarkdownDisplay } from "./truncateMarkdownDisplay";
78

9+
interface RawMarkdownProps {
10+
children: string;
11+
cutOff: number;
12+
cutOffSuffix?: string;
13+
allowHtml?: boolean;
14+
"data-test-id"?: string;
15+
}
16+
17+
const RawMarkdown = ({ children, cutOff, cutOffSuffix = "..." }: RawMarkdownProps) => (
18+
<ReactMarkdown>{truncateMarkdown(children, cutOff, cutOffSuffix).trim()}</ReactMarkdown>
19+
);
20+
821
const measureLength = (node: React.ReactElement): number => reduceToText(node).length;
922

10-
const makeMarkdown = (children: string, cutOff: number, extra?: Partial<MarkdownProps>) =>
11-
React.createElement(Markdown, { children, cutOff, ...extra }) as React.ReactElement<
12-
MarkdownProps & { cutOff: number }
13-
>;
23+
const makeMarkdown = (children: string, cutOff: number, extra?: Partial<RawMarkdownProps>) =>
24+
React.createElement(RawMarkdown, { children, cutOff, ...extra }) as React.ReactElement<RawMarkdownProps>;
1425

1526
describe("truncateMarkdownDisplay", () => {
1627
it("returns the untruncated element when the rendered content is already shorter than cutOff", () => {
1728
const input = makeMarkdown("Short text.", 1000);
1829
const result = truncateMarkdownDisplay(input);
19-
expect((result.props as MarkdownProps).cutOff).toBeUndefined();
30+
expect((result.props as RawMarkdownProps).cutOff).toBeUndefined();
2031
});
2132

2233
it("returns an element whose rendered text length is closer to cutOff than the raw cutOff would yield", () => {
@@ -37,7 +48,7 @@ describe("truncateMarkdownDisplay", () => {
3748
const linkHeavy = Array.from({ length: 20 }, (_, i) => `[click](https://example.com/${i})`).join(" ");
3849
const input = makeMarkdown(linkHeavy, 40, { "data-test-id": "md-x", allowHtml: true });
3950
const result = truncateMarkdownDisplay(input);
40-
const props = result.props as MarkdownProps;
51+
const props = result.props as RawMarkdownProps;
4152
expect(props["data-test-id"]).toBe("md-x");
4253
expect(props.allowHtml).toBe(true);
4354
});
@@ -46,7 +57,7 @@ describe("truncateMarkdownDisplay", () => {
4657
const linkHeavy = Array.from({ length: 20 }, (_, i) => `[click](https://example.com/${i})`).join(" ");
4758
const initialCutOff = 50;
4859
const result = truncateMarkdownDisplay(makeMarkdown(linkHeavy, initialCutOff));
49-
const props = result.props as MarkdownProps;
60+
const props = result.props as RawMarkdownProps;
5061
// Either the element was kept (initial was already best) or cutOff was raised to compensate for syntax overhead.
5162
expect(props.cutOff === undefined || (typeof props.cutOff === "number" && props.cutOff >= initialCutOff)).toBe(
5263
true,
@@ -60,7 +71,7 @@ describe("truncateMarkdownDisplay", () => {
6071
const cutOff = 30;
6172
const input = makeMarkdown(content, cutOff);
6273
const resultDecoded = truncateMarkdownDisplay(input, { decodeHtmlEntities: true });
63-
expect((resultDecoded.props as MarkdownProps).cutOff).toBeUndefined();
74+
expect((resultDecoded.props as RawMarkdownProps).cutOff).toBeUndefined();
6475
});
6576

6677
it("respects maxRounds by not iterating when set to 0", () => {
@@ -69,6 +80,6 @@ describe("truncateMarkdownDisplay", () => {
6980
const input = makeMarkdown(linkHeavy, initialCutOff);
7081
const result = truncateMarkdownDisplay(input, undefined, 0);
7182
// With no iterations allowed, the result should be the initial element (same cutOff as the input).
72-
expect((result.props as MarkdownProps).cutOff).toBe(initialCutOff);
83+
expect((result.props as RawMarkdownProps).cutOff).toBe(initialCutOff);
7384
});
7485
});

0 commit comments

Comments
 (0)