preact-habitat
Version:
A place for your happy widget in every DOM.
89 lines (76 loc) • 2.63 kB
JavaScript
import { h, Component } from "preact";
import simulant from "simulant";
import {
collectPropsFromElement,
widgetDOMHostElements,
getExecutedScript,
camelcasize
} from "../lib";
import habitat from "../index";
const TEST_TITLE = "Hello, World!";
class TitleComponent extends Component {
render() {
return (
<h1 className="test">
{TEST_TITLE}
</h1>
);
}
}
describe("Module API Specs", () => {
it("should export habitat factory function", () => {
expect(typeof habitat).toBe("function");
});
it("should return render function form the habitat factory", () => {
expect(typeof habitat().render).toBe("function");
});
});
/**
* Renders the widget based on client specified attributes
*/
describe("Habitat Client Control Renderer", () => {
it("should inline the widget and render it once", () => {
document.body.innerHTML = `
<script></script>
`;
let hb = habitat(TitleComponent);
hb.render({ inline: true });
let widgets = document.querySelectorAll(".test");
expect(document.body.innerHTML).toContain(TEST_TITLE);
expect(widgets.length).toBe(1);
});
it("should render the widget in 3 habitat elements", () => {
document.body.innerHTML = `
<div data-widget="my-widget"></div>
<div data-widget="my-widget"></div>
<div data-widget="my-widget"></div>
`;
let hb = habitat(TitleComponent);
hb.render({ selector: '[data-widget="my-widget"]' });
let widgets = document.querySelectorAll(".test");
expect(document.body.innerHTML).toContain(TEST_TITLE);
expect(widgets.length).toBe(3);
});
it("should render 2 custom attributes habitat elements", () => {
document.body.innerHTML = `
<div data-widget-tv="tv-player"></div>
<div data-widget-tv="tv-player"></div>
`
let hb = habitat(TitleComponent);
hb.render({selector: '[data-widget-tv="tv-player"]'});
let widgets = document.querySelectorAll(".test");
expect(document.body.innerHTML).toContain(TEST_TITLE);
expect(widgets.length).toBe(2);
});
it("should render 1 widget and not clean its content", () => {
document.body.innerHTML = `
<div data-table-widget="datatable">LOADING BIG TABLE</div>
`
let hb = habitat(TitleComponent);
hb.render({ selector: '[data-table-widget="datatable"]' });
let widgets = document.querySelectorAll('[data-table-widget="datatable"]');
expect(document.body.innerHTML).toContain("LOADING BIG TABLE");
expect(widgets[0].innerHTML).toContain(TEST_TITLE);
expect(widgets.length).toBe(1);
});
});