UNPKG

one

Version:

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

84 lines (82 loc) 3.39 kB
import { describe, expect, it, beforeEach, vi } from "vitest"; import { createPrefetchViewport } from "./prefetchViewport.native.js"; function _class_call_check(instance, Constructor) { if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); } } function _create_class(Constructor, protoProps, staticProps) { return protoProps && _defineProperties(Constructor.prototype, protoProps), staticProps && _defineProperties(Constructor, staticProps), Constructor; } var mockIOCallback, mockObserved = /* @__PURE__ */new Set(); vi.stubGlobal("IntersectionObserver", /* @__PURE__ */function () { "use strict"; function _class(callback) { _class_call_check(this, _class), mockIOCallback = callback; } return _create_class(_class, [{ key: "observe", value: function (el) { mockObserved.add(el); } }, { key: "unobserve", value: function (el) { mockObserved.delete(el); } }, { key: "disconnect", value: function () { mockObserved.clear(); } }]), _class; }()); function simulateIntersect(el, isIntersecting) { mockIOCallback([{ target: el, isIntersecting }], {}); } describe("prefetchViewport", function () { var prefetched, vp; beforeEach(function () { prefetched = [], mockObserved.clear(), vp = createPrefetchViewport(), vp.start(function (href) { return prefetched.push(href); }); }), it("prefetches when link enters viewport", function () { var el = {}; vp.observe(el, "/about"), simulateIntersect(el, !0), expect(prefetched).toEqual(["/about"]); }), it("does not prefetch when link exits viewport", function () { var el = {}; vp.observe(el, "/about"), simulateIntersect(el, !1), expect(prefetched).toEqual([]); }), it("only prefetches each href once", function () { var 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", function () { var 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", function () { it("does not leak elements after cleanup", function () { for (var elements = [], cleanups = [], i = 0; i < 100; i++) { var el = {}; elements.push(el), cleanups.push(vp.observe(el, `/page-${i}`)); } expect(vp.nodes.size).toBe(100), cleanups.forEach(function (c) { return c(); }), expect(vp.nodes.size).toBe(0), expect(vp.done.size).toBe(0); }), it("handles rapid observe/unobserve cycles", function () { for (var el = {}, i = 0; i < 100; i++) { var cleanup = vp.observe(el, "/test"); cleanup(); } expect(vp.nodes.size).toBe(0); }); }); }); //# sourceMappingURL=prefetchViewport.test.native.js.map