import { expect, test } from "vitest";
import { $, css, renderTemplate, ws } from "@webstudio-is/template";
import { generateFragmentFromHtml } from "./html";
test("generate instances from html", () => {
expect(
generateFragmentFromHtml(`
It works!
Webstudio is great.
`)
).toEqual(
renderTemplate(
It works!
Webstudio is great.
one
two
)
);
});
test("generate multiple root instances from html", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
<>
One
Two
>
)
);
});
test("handle broken html", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
<>
One
>
)
);
});
test("handle non-html", () => {
expect(generateFragmentFromHtml("")).toEqual(renderTemplate(<>>));
expect(generateFragmentFromHtml("It works!")).toEqual(renderTemplate(<>>));
});
test("ignore custom elements", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(renderTemplate( ));
});
test("ignore not allowed tags", () => {
expect(
generateFragmentFromHtml(`
test
`)
).toEqual(renderTemplate( ));
});
test("generate props from html attributes", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
My Button
)
);
});
test("generate props from number and boolean html attributes", () => {
expect(
generateFragmentFromHtml(`
My Button
`)
).toEqual(
renderTemplate(
My Button
)
);
});
test("generate props from number and boolean aria attributes", () => {
expect(
generateFragmentFromHtml(`
My Button
`)
).toEqual(
renderTemplate(
My Button
)
);
});
test("wrap text with span when spotted outside of rich text", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
div
article
)
);
expect(
generateFragmentFromHtml(`
div
`)
).toEqual(
renderTemplate(
div
)
);
});
test("do not wrap text with span when spotted near link", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
div
link
)
);
});
test("collapse any spacing characters inside text", () => {
expect(
generateFragmentFromHtml(`
line
another line
`)
).toEqual(
renderTemplate({"line another line"} )
);
});
test("collapse any spacing characters inside rich text", () => {
expect(
generateFragmentFromHtml(`
line
another line
text
`)
).toEqual(
renderTemplate(
line {" "}
another line text
)
);
});
test("generate style attribute as local styles", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
)
);
});
test("script as html embed", () => {
expect(generateFragmentFromHtml(``)).toEqual(
renderTemplate(
<$.HtmlEmbed
ws:label="Script"
clientOnly={true}
code={``}
/>
)
);
});
test("style as html embed", () => {
expect(generateFragmentFromHtml(``)).toEqual(
renderTemplate(<$.HtmlEmbed code={``} ws:label="Style" />)
);
});
test("generate textarea element", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
)
);
});
test("generate select element", () => {
expect(
generateFragmentFromHtml(`
One
Two
One
Two
`)
).toEqual(
renderTemplate(
One
Two
One
Two
)
);
});
test("generate Image component instead of img element", () => {
expect(
generateFragmentFromHtml(`
`)
).toEqual(
renderTemplate(
<$.Image src="./my-url" />
)
);
});
test("strip unsupported attribute names", () => {
expect(
generateFragmentFromHtml(`
Expand
Toggle
`)
).toEqual(
renderTemplate(
<>
Expand
Toggle
>
)
);
});