one
Version:
One is a new React Framework that makes Vite serve both native and web.
84 lines (82 loc) • 3.39 kB
JavaScript
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