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