UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

90 lines (89 loc) 2.51 kB
import { describe, expect, it, beforeEach, vi } from "vitest"; import { createPrefetchViewport } from "./prefetchViewport.mjs"; 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; let 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, true); expect(prefetched).toEqual(["/about"]); }); it("does not prefetch when link exits viewport", () => { const el = {}; vp.observe(el, "/about"); simulateIntersect(el, false); expect(prefetched).toEqual([]); }); it("only prefetches each href once", () => { const el = {}; vp.observe(el, "/about"); simulateIntersect(el, true); simulateIntersect(el, false); simulateIntersect(el, true); expect(prefetched).toEqual(["/about"]); }); it("cleanup re-enables prefetch for href", () => { const el = {}; const cleanup = vp.observe(el, "/about"); simulateIntersect(el, true); expect(prefetched).toEqual(["/about"]); cleanup(); prefetched.length = 0; vp.observe(el, "/about"); simulateIntersect(el, true); expect(prefetched).toEqual(["/about"]); }); describe("memory and performance", () => { it("does not leak elements after cleanup", () => { const elements = []; const 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++) { const cleanup = vp.observe(el, "/test"); cleanup(); } expect(vp.nodes.size).toBe(0); }); }); }); //# sourceMappingURL=prefetchViewport.test.mjs.map