UNPKG

one

Version:

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

60 lines (59 loc) 2.7 kB
var import_vitest = require("vitest"), import_prefetchViewport = require("./prefetchViewport"); let mockIOCallback; const mockObserved = /* @__PURE__ */ new Set(); import_vitest.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 }], {} ); } (0, import_vitest.describe)("prefetchViewport", () => { let prefetched, vp; (0, import_vitest.beforeEach)(() => { prefetched = [], mockObserved.clear(), vp = (0, import_prefetchViewport.createPrefetchViewport)(), vp.start((href) => prefetched.push(href)); }), (0, import_vitest.it)("prefetches when link enters viewport", () => { const el = {}; vp.observe(el, "/about"), simulateIntersect(el, !0), (0, import_vitest.expect)(prefetched).toEqual(["/about"]); }), (0, import_vitest.it)("does not prefetch when link exits viewport", () => { const el = {}; vp.observe(el, "/about"), simulateIntersect(el, !1), (0, import_vitest.expect)(prefetched).toEqual([]); }), (0, import_vitest.it)("only prefetches each href once", () => { const el = {}; vp.observe(el, "/about"), simulateIntersect(el, !0), simulateIntersect(el, !1), simulateIntersect(el, !0), (0, import_vitest.expect)(prefetched).toEqual(["/about"]); }), (0, import_vitest.it)("cleanup re-enables prefetch for href", () => { const el = {}, cleanup = vp.observe(el, "/about"); simulateIntersect(el, !0), (0, import_vitest.expect)(prefetched).toEqual(["/about"]), cleanup(), prefetched.length = 0, vp.observe(el, "/about"), simulateIntersect(el, !0), (0, import_vitest.expect)(prefetched).toEqual(["/about"]); }), (0, import_vitest.describe)("memory and performance", () => { (0, import_vitest.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}`)); } (0, import_vitest.expect)(vp.nodes.size).toBe(100), cleanups.forEach((c) => c()), (0, import_vitest.expect)(vp.nodes.size).toBe(0), (0, import_vitest.expect)(vp.done.size).toBe(0); }), (0, import_vitest.it)("handles rapid observe/unobserve cycles", () => { const el = {}; for (let i = 0; i < 100; i++) vp.observe(el, "/test")(); (0, import_vitest.expect)(vp.nodes.size).toBe(0); }); }); }); //# sourceMappingURL=prefetchViewport.test.js.map