thenavisapp
Version:
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
228 lines (203 loc) • 6.88 kB
text/typescript
import { parseDOM } from "htmlparser2";
import {
append,
appendChild,
prepend,
prependChild,
replaceElement,
removeElement,
} from "./manipulation.js";
import type { Element } from "domhandler";
describe("manipulation", () => {
describe("append", () => {
it("should not be duplicated when called twice", () => {
const dom = parseDOM(
"<div><p><img/></p><p><object/></p></div>",
)[0] as Element;
const child = parseDOM("<span></span>")[0] as Element;
const parents = dom.children as Element[];
append(parents[0].children[0], child);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<img />
<span />
</p>
<p>
<object />
</p>
</div>
`);
append(parents[1].children[0], child);
expect(parents[0].children).toHaveLength(1);
expect(parents[1].children).toHaveLength(2);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<img />
</p>
<p>
<object />
<span />
</p>
</div>
`);
});
});
describe("appendChild", () => {
it("should not be duplicated when called twice", () => {
const dom = parseDOM(
"<div><p><img/></p><p><object/></p></div>",
)[0] as Element;
const child = parseDOM("<span></span>")[0] as Element;
const parents = dom.children as Element[];
appendChild(parents[0], child);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<img />
<span />
</p>
<p>
<object />
</p>
</div>
`);
appendChild(parents[1], child);
expect(parents[0].children).toHaveLength(1);
expect(parents[1].children).toHaveLength(2);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<img />
</p>
<p>
<object />
<span />
</p>
</div>
`);
});
});
describe("removeElement", () => {
it("should correctly remove element", () => {
const dom = parseDOM(
"<div><p><img/><object/></p><p></p></div>",
)[0] as Element;
const parents = dom.children as Element[];
const image = parents[0].children[0];
removeElement(image);
expect(image.next).toBeNull();
expect(image.prev).toBeNull();
expect(image.parent).toBeNull();
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<object />
</p>
<p />
</div>
`);
appendChild(parents[1], image);
expect(parents[0].children).toHaveLength(1);
expect(parents[1].children).toHaveLength(1);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<object />
</p>
<p>
<img />
</p>
</div>
`);
});
});
describe("prepend", () => {
it("should not be duplicated when called twice", () => {
const dom = parseDOM(
"<div><p><img/></p><p><object/></p></div>",
)[0] as Element;
const child = parseDOM("<span></span>")[0] as Element;
const parents = dom.children as Element[];
prepend(parents[0].children[0], child);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<span />
<img />
</p>
<p>
<object />
</p>
</div>
`);
prepend(parents[1].children[0], child);
expect(parents[0].children).toHaveLength(1);
expect(parents[1].children).toHaveLength(2);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<img />
</p>
<p>
<span />
<object />
</p>
</div>
`);
});
});
describe("prependChild", () => {
it("should not be duplicated when called twice", () => {
const dom = parseDOM(
"<div><p><img/></p><p><object/></p></div>",
)[0] as Element;
const child = parseDOM("<span></span>")[0] as Element;
const parents = dom.children as Element[];
prependChild(parents[0], child);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<span />
<img />
</p>
<p>
<object />
</p>
</div>
`);
prependChild(parents[1], child);
expect(parents[0].children).toHaveLength(1);
expect(parents[1].children).toHaveLength(2);
expect(dom).toMatchInlineSnapshot(`
<div>
<p>
<img />
</p>
<p>
<span />
<object />
</p>
</div>
`);
});
});
describe("replaceElement", () => {
it("should allow replaced elements to be appended later (#966)", () => {
const div = parseDOM("<div><p>")[0] as Element;
const template = parseDOM("<template></template>")[0] as Element;
const p = div.children[0];
// We want to wrap the inner <p> in a <template>
replaceElement(p, template);
appendChild(template, p);
expect(div).toMatchInlineSnapshot(`
<div>
<template>
<p />
</template>
</div>
`);
});
});
});