Open History to see the last commit
1import { act, useLayoutEffect } from "react";
2import { createRoot } from "react-dom/client";
3import { expect, it } from "vite-plus/test";
4import type { MarkdownImageSourceResolver } from "./SelectableMarkdownText.types";
5import { useRetryingImageSource } from "./useRetryingImageSource";
6
7let resolveImage: ReturnType<typeof useRetryingImageSource>;
8
9function Probe(props: { readonly resolve: MarkdownImageSourceResolver }) {
10 const resolver = useRetryingImageSource(props.resolve);
11 useLayoutEffect(() => {
12 resolveImage = resolver;
13 });
14 return null;
15}
16
17it("asks the next resolver for an image the previous one could not resolve", async () => {
18 const root = createRoot(document.createElement("div"));
19 const offline: MarkdownImageSourceResolver = async () => {
20 throw new Error("Markdown image is unavailable");
21 };
22 await act(async () => root.render(<Probe resolve={offline} />));
23 const askedOnce = resolveImage!;
24
25 let source: unknown = "pending";
26 const answered = askedOnce({
27 id: "img:0:0",
28 url: "assets/shot.png",
29 altText: "",
30 title: "",
31 placement: "inline",
32 }).then((value) => {
33 source = value;
34 });
35 await act(async () => {});
36 expect(source).toBe("pending");
37
38 const online: MarkdownImageSourceResolver = async (image) => ({
39 uri: `https://host/${image.href}`,
40 });
41 await act(async () => root.render(<Probe resolve={online} />));
42 await answered;
43
44 expect(source).toEqual({ uri: "https://host/assets/shot.png" });
45 expect(resolveImage).toBe(askedOnce);
46 act(() => root.unmount());
47});