UNPKG

one

Version:

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

61 lines (60 loc) 2.35 kB
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