one
Version:
One is a new React Framework that makes Vite serve both native and web.
61 lines (60 loc) • 2.35 kB
JavaScript
import { describe, expect, it, beforeEach, vi } from "vitest";
import { createPrefetchViewport } from "./prefetchViewport";
let mockIOCallback;
const mockObserved = /* @__PURE__ */ new Set();
vi.stubGlobal(
"IntersectionObserver",
class {
constructor(callback) {
mockIOCallback = callback;
}
observe(el) {
mockObserved.add(el);
}
unobserve(el) {
mockObserved.delete(el);
}
disconnect() {
mockObserved.clear();
}
}
);
function simulateIntersect(el, isIntersecting) {
mockIOCallback(
[{ target: el, isIntersecting }],
{}
);
}
describe("prefetchViewport", () => {
let prefetched, vp;
beforeEach(() => {
prefetched = [], mockObserved.clear(), vp = createPrefetchViewport(), vp.start((href) => prefetched.push(href));
}), it("prefetches when link enters viewport", () => {
const el = {};
vp.observe(el, "/about"), simulateIntersect(el, !0), expect(prefetched).toEqual(["/about"]);
}), it("does not prefetch when link exits viewport", () => {
const el = {};
vp.observe(el, "/about"), simulateIntersect(el, !1), expect(prefetched).toEqual([]);
}), it("only prefetches each href once", () => {
const el = {};
vp.observe(el, "/about"), simulateIntersect(el, !0), simulateIntersect(el, !1), simulateIntersect(el, !0), expect(prefetched).toEqual(["/about"]);
}), it("cleanup re-enables prefetch for href", () => {
const el = {}, cleanup = vp.observe(el, "/about");
simulateIntersect(el, !0), expect(prefetched).toEqual(["/about"]), cleanup(), prefetched.length = 0, vp.observe(el, "/about"), simulateIntersect(el, !0), expect(prefetched).toEqual(["/about"]);
}), describe("memory and performance", () => {
it("does not leak elements after cleanup", () => {
const elements = [], cleanups = [];
for (let i = 0; i < 100; i++) {
const el = {};
elements.push(el), cleanups.push(vp.observe(el, `/page-${i}`));
}
expect(vp.nodes.size).toBe(100), cleanups.forEach((c) => c()), expect(vp.nodes.size).toBe(0), expect(vp.done.size).toBe(0);
}), it("handles rapid observe/unobserve cycles", () => {
const el = {};
for (let i = 0; i < 100; i++)
vp.observe(el, "/test")();
expect(vp.nodes.size).toBe(0);
});
});
});
//# sourceMappingURL=prefetchViewport.test.js.map