@forge/react
11.18.0-next.011.18.0-next.1
out/router/components/__test__/Router.test.js+
out/router/components/__test__/Router.test.jsNew file+77
Index: package/out/router/components/__test__/Router.test.js
===================================================================
--- package/out/router/components/__test__/Router.test.js
+++ package/out/router/components/__test__/Router.test.js
@@ -0,0 +1,77 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const tslib_1 = require("tslib");
+const jsx_runtime_1 = require("react/jsx-runtime");
+const testUtils_1 = require("../../../__test__/testUtils");
+const reconcilerTestRenderer_1 = tslib_1.__importDefault(require("../../../__test__/reconcilerTestRenderer"));
+const Router_1 = require("../Router");
+const Route_1 = require("../Route");
+const __1 = require("../../..");
+const test_utils_1 = require("../../utils/test-utils");
+const mockCreateHistory = jest.fn(async () => (0, test_utils_1.createMockHistory)());
+jest.mock('@forge/bridge', () => ({
+ view: {
+ createHistory: () => mockCreateHistory()
+ }
+}));
+describe('Router', () => {
+ let bridgeCalls;
+ beforeAll(() => {
+ bridgeCalls = (0, testUtils_1.setupBridge)();
+ });
+ beforeEach(() => {
+ bridgeCalls.length = 0;
+ mockCreateHistory.mockClear();
+ mockCreateHistory.mockImplementation(async () => (0, test_utils_1.createMockHistory)());
+ });
+ afterEach(() => jest.clearAllMocks());
+ it('renders children after history is initialized', async () => {
+ await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsx)(Router_1.Router, { children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Home Page" }) }));
+ const forgeDoc = (0, testUtils_1.getLastBridgeCallForgeDoc)(bridgeCalls);
+ expect(forgeDoc).toHaveProperty('children[0].type', 'Text');
+ expect(forgeDoc).toHaveProperty('children[0].children[0].props.text', 'Home Page');
+ });
+ it('renders children when Route path matches', async () => {
+ await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsx)(Router_1.Router, { children: (0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Home Page" }) }) }));
+ const forgeDoc = (0, testUtils_1.getLastBridgeCallForgeDoc)(bridgeCalls);
+ expect(forgeDoc).toHaveProperty('children[0].type', 'Text');
+ expect(forgeDoc).toHaveProperty('children[0].children[0].props.text', 'Home Page');
+ });
+ it('does not render Route children when path does not match', async () => {
+ await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsx)(Router_1.Router, { children: (0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/settings", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Settings Page" }) }) }));
+ const forgeDoc = (0, testUtils_1.getLastBridgeCallForgeDoc)(bridgeCalls);
+ expect(forgeDoc?.children).toHaveLength(0);
+ });
+ it('throws when Route is used outside of Router', async () => {
+ await expect(reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Home" }) }))).rejects.toThrow('Route must be used within a Router component');
+ });
+ it('renders only the first matching Route when multiple routes match', async () => {
+ await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsxs)(Router_1.Router, { children: [(0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "First" }) }), (0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Second" }) })] }));
+ const forgeDoc = (0, testUtils_1.getLastBridgeCallForgeDoc)(bridgeCalls);
+ expect(forgeDoc).toHaveProperty('children[0].type', 'Text');
+ expect(forgeDoc).toHaveProperty('children[0].children[0].props.text', 'First');
+ expect(forgeDoc?.children).toHaveLength(1);
+ });
+ it('renders fallback when no Route matches', async () => {
+ mockCreateHistory.mockImplementation(async () => (0, test_utils_1.createMockHistory)('/unknown'));
+ await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsxs)(Router_1.Router, { fallback: (0, jsx_runtime_1.jsx)(__1.Text, { children: "No match" }), children: [(0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Home" }) }), (0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/settings", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Settings" }) })] }));
+ const forgeDoc = (0, testUtils_1.getLastBridgeCallForgeDoc)(bridgeCalls);
+ expect(forgeDoc).toHaveProperty('children[0].type', 'Text');
+ expect(forgeDoc).toHaveProperty('children[0].children[0].props.text', 'No match');
+ });
+ it('renders the catchall Route when no other route matches', async () => {
+ mockCreateHistory.mockImplementation(async () => (0, test_utils_1.createMockHistory)('/unknown'));
+ await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsxs)(Router_1.Router, { children: [(0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Home" }) }), (0, jsx_runtime_1.jsx)(Route_1.Route, { path: "*", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Not Found" }) })] }));
+ const forgeDoc = (0, testUtils_1.getLastBridgeCallForgeDoc)(bridgeCalls);
+ expect(forgeDoc).toHaveProperty('children[0].type', 'Text');
+ expect(forgeDoc).toHaveProperty('children[0].children[0].props.text', 'Not Found');
+ expect(forgeDoc?.children).toHaveLength(1);
+ });
+ it('renders a specific Route over catchall when it matches', async () => {
+ await reconcilerTestRenderer_1.default.create((0, jsx_runtime_1.jsxs)(Router_1.Router, { children: [(0, jsx_runtime_1.jsx)(Route_1.Route, { path: "/", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Home" }) }), (0, jsx_runtime_1.jsx)(Route_1.Route, { path: "*", children: (0, jsx_runtime_1.jsx)(__1.Text, { children: "Not Found" }) })] }));
+ const forgeDoc = (0, testUtils_1.getLastBridgeCallForgeDoc)(bridgeCalls);
+ expect(forgeDoc).toHaveProperty('children[0].type', 'Text');
+ expect(forgeDoc).toHaveProperty('children[0].children[0].props.text', 'Home');
+ expect(forgeDoc?.children).toHaveLength(1);
+ });
+});