@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);
+    });
+});