|
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
import { bootstrap_custom_element } from "./index";
|
|
|
|
const delay = (ms?: number) =>
|
|
new Promise((resolve) => setTimeout(resolve, ms));
|
|
|
|
describe("bootstrap_custom_element", () => {
|
|
const create = vi.fn();
|
|
|
|
beforeEach(() => {
|
|
document.body.innerHTML = "";
|
|
create.mockClear();
|
|
});
|
|
|
|
bootstrap_custom_element(create);
|
|
|
|
it("parses a <gradio-lite> element that contains a string literal as a direct child", async () => {
|
|
document.body.innerHTML = `
|
|
<gradio-lite>
|
|
import gradio as gr
|
|
</gradio-lite>
|
|
`;
|
|
await delay();
|
|
|
|
expect(create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
code: expect.stringMatching(/import gradio as gr/),
|
|
requirements: [],
|
|
files: undefined
|
|
})
|
|
);
|
|
});
|
|
|
|
it("parses a <gradio-lite> element that contains <gradio-code> and <gradio-requirements> elements", async () => {
|
|
document.body.innerHTML = `
|
|
<gradio-lite>
|
|
<gradio-code>
|
|
import gradio as gr
|
|
</gradio-code>
|
|
|
|
<gradio-requirements>
|
|
numpy
|
|
scipy
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
`;
|
|
await delay();
|
|
|
|
expect(create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
code: expect.stringMatching(/import gradio as gr/),
|
|
requirements: ["numpy", "scipy"],
|
|
files: undefined
|
|
})
|
|
);
|
|
});
|
|
|
|
it("parses a <gradio-lite> element that contains <gradio-file> and <gradio-requirements> elements", async () => {
|
|
document.body.innerHTML = `
|
|
<gradio-lite>
|
|
<gradio-file name="app.py" entrypoint>
|
|
import gradio as gr
|
|
|
|
from foo import foo
|
|
</gradio-file>
|
|
|
|
<gradio-file name="foo.py">
|
|
def foo():
|
|
return "bar"
|
|
</gradio-file>
|
|
|
|
<gradio-requirements>
|
|
numpy
|
|
scipy
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
`;
|
|
await delay();
|
|
|
|
expect(create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
files: {
|
|
"app.py": {
|
|
data: expect.stringMatching(/import gradio as gr/)
|
|
},
|
|
"foo.py": {
|
|
data: expect.stringMatching(/def foo\(\):/)
|
|
}
|
|
},
|
|
entrypoint: "app.py",
|
|
code: undefined,
|
|
requirements: ["numpy", "scipy"]
|
|
})
|
|
);
|
|
});
|
|
|
|
it("dedents the code inside <gradio-lite>", async () => {
|
|
document.body.innerHTML = `
|
|
<gradio-lite>
|
|
import gradio as gr
|
|
</gradio-lite>
|
|
`;
|
|
await delay();
|
|
|
|
expect(create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
code: expect.stringMatching(/^import gradio as gr/),
|
|
requirements: [],
|
|
files: undefined
|
|
})
|
|
);
|
|
});
|
|
|
|
it("dedents the code inside <gradio-code>", async () => {
|
|
document.body.innerHTML = `
|
|
<gradio-lite>
|
|
<gradio-code>
|
|
import gradio as gr
|
|
</gradio-code>
|
|
</gradio-lite>
|
|
`;
|
|
await delay();
|
|
|
|
expect(create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
code: expect.stringMatching(/^import gradio as gr/),
|
|
requirements: [],
|
|
files: undefined
|
|
})
|
|
);
|
|
});
|
|
|
|
it("dedents Python code but normal files inside <gradio-file>", async () => {
|
|
document.body.innerHTML = `
|
|
<gradio-lite>
|
|
<gradio-file name="app.py" entrypoint>
|
|
import gradio as gr
|
|
|
|
from foo import foo
|
|
</gradio-file>
|
|
|
|
<gradio-file name="foo.py">
|
|
def foo():
|
|
return "bar"
|
|
</gradio-file>
|
|
|
|
<gradio-file name="data.txt">
|
|
Hello, world!
|
|
</gradio-file>
|
|
</gradio-lite>
|
|
`;
|
|
await delay();
|
|
|
|
expect(create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
files: {
|
|
"app.py": {
|
|
data: expect.stringMatching(/^import gradio as gr/)
|
|
},
|
|
"foo.py": {
|
|
data: expect.stringMatching(/^def foo\(\):/)
|
|
},
|
|
"data.txt": {
|
|
data: expect.stringMatching(/Hello, world!/)
|
|
}
|
|
},
|
|
entrypoint: "app.py",
|
|
code: undefined,
|
|
requirements: []
|
|
})
|
|
);
|
|
});
|
|
});
|
|
|