UNPKG

one

Version:

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

159 lines (158 loc) 6.05 kB
import { jsx as _jsx } from "react/jsx-runtime"; import React from "react"; import TestRenderer, { act } from "react-test-renderer"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { registerScrollGroup, ScrollBehavior } from "./ScrollBehavior.native.js"; var subscriptions = vi.hoisted(function () { return { loading: void 0, root: void 0 }; }); vi.mock("../router/lastAction", function () { return { setLastAction: vi.fn() }; }); vi.mock("../router/router", function () { return { subscribeToLoadingState: function (subscriber) { subscriptions.loading = subscriber; return function () { subscriptions.loading = void 0; }; }, subscribeToRootState: function (subscriber) { subscriptions.root = subscriber; return function () { subscriptions.root = void 0; }; } }; }); globalThis.IS_REACT_ACT_ENVIRONMENT = true; var renderer; var location; var scrollTo; beforeEach(function () { process.env.VITE_ENVIRONMENT = "client"; location = { pathname: "/", search: "", hash: "" }; scrollTo = vi.fn(); var windowMock = Object.assign(new EventTarget(), { location, scrollTo, scrollY: 500 }); var storage = /* @__PURE__ */new Map(); vi.stubGlobal("window", windowMock); vi.stubGlobal("document", { getElementById: vi.fn() }); vi.stubGlobal("sessionStorage", { getItem: function (key) { var _storage_get; return (_storage_get = storage.get(key)) !== null && _storage_get !== void 0 ? _storage_get : null; }, setItem: function (key, value) { return storage.set(key, value); }, removeItem: function (key) { return storage.delete(key); } }); act(function () { renderer = TestRenderer.create(/* @__PURE__ */_jsx(ScrollBehavior, {})); }); }); afterEach(function () { act(function () { return renderer === null || renderer === void 0 ? void 0 : renderer.unmount(); }); renderer = void 0; vi.useRealTimers(); vi.unstubAllGlobals(); delete process.env.VITE_ENVIRONMENT; }); describe("ScrollBehavior initial navigation", function () { it("does not scroll when the navigator publishes its initial state after mount", function () { act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); expect(scrollTo).not.toHaveBeenCalled(); }); it("scrolls to the top when the first state notification is a real navigation", function () { location.pathname = "/compat/react-native-gesture-handler"; act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); expect(scrollTo).toHaveBeenCalledWith(0, 0); }); it("handles a query change as a first navigation", function () { location.search = "?platform=ios"; act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); expect(scrollTo).toHaveBeenCalledWith(0, 0); }); }); describe("ScrollBehavior groups", function () { it("preserves position between routes in the same group", function () { vi.useFakeTimers(); var unregister = registerScrollGroup("/compat/react-native-gesture-handler"); act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); location.pathname = "/compat/react-native-gesture-handler"; act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); scrollTo.mockClear(); act(function () { var _subscriptions_loading; return (_subscriptions_loading = subscriptions.loading) === null || _subscriptions_loading === void 0 ? void 0 : _subscriptions_loading.call(subscriptions, "loading"); }); location.pathname = "/compat/react-native-gesture-handler/pan-gesture"; act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); vi.runAllTimers(); expect(scrollTo).toHaveBeenCalledWith(0, 500); unregister(); vi.useRealTimers(); }); it("does not match a different route whose slug has the same prefix", function () { var unregister = registerScrollGroup("/compat/react-native"); act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); location.pathname = "/compat/react-native/core"; act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); scrollTo.mockClear(); act(function () { var _subscriptions_loading; return (_subscriptions_loading = subscriptions.loading) === null || _subscriptions_loading === void 0 ? void 0 : _subscriptions_loading.call(subscriptions, "loading"); }); location.pathname = "/compat/react-native-gesture-handler"; act(function () { var _subscriptions_root; return (_subscriptions_root = subscriptions.root) === null || _subscriptions_root === void 0 ? void 0 : _subscriptions_root.call(subscriptions, {}); }); expect(scrollTo).toHaveBeenCalledWith(0, 0); unregister(); }); }); //# sourceMappingURL=ScrollBehavior.test.native.js.map