diff --git a/web/src/pages/landing/Landing.test.tsx b/web/src/pages/landing/Landing.test.tsx index 031f644..9cd524e 100644 --- a/web/src/pages/landing/Landing.test.tsx +++ b/web/src/pages/landing/Landing.test.tsx @@ -74,9 +74,7 @@ test("button click requests user data", async () => { expect(getSpy).toHaveBeenCalledWith(serverMeEndpoint, { withCredentials: true, }); - expect(history.replace).toHaveBeenCalledWith("/welcome", { - user: testUser, - }); + expect(history.replace).toHaveBeenCalledWith("/welcome"); }); }); diff --git a/web/src/pages/landing/Landing.tsx b/web/src/pages/landing/Landing.tsx index 4998313..eca5db3 100644 --- a/web/src/pages/landing/Landing.tsx +++ b/web/src/pages/landing/Landing.tsx @@ -20,7 +20,7 @@ function Landing() { if (result.error) { return Promise.reject(result.error); } - history.replace("/welcome", { user: result.data }); + history.replace("/welcome"); }) .catch((e: AxiosError) => { if (e.response?.status === 401) { diff --git a/web/src/pages/welcome/Welcome.test.tsx b/web/src/pages/welcome/Welcome.test.tsx index ab387bd..3363061 100644 --- a/web/src/pages/welcome/Welcome.test.tsx +++ b/web/src/pages/welcome/Welcome.test.tsx @@ -1,26 +1,74 @@ import { render, screen, waitFor } from "@testing-library/react"; -import { createMemoryHistory } from "history"; +import { setLogger } from "react-query"; import { Router } from "react-router-dom"; +import { setupServer } from "msw/node"; +import { ResponseComposition, rest, RestContext, RestRequest } from "msw"; +import { createMemoryHistory } from "history"; import Welcome from "./Welcome"; import TestWrapper from "../../testing/test-wrapper"; +import { User } from "../../data/user"; + +const testUser: User = { organizationUuid: "foo", displayName: "bar" }; +const serverMeEndpoint = "https://localhost:8001/v1/me"; + +const server = setupServer(); + +beforeAll(() => { + server.listen(); + setLogger({ + log: () => {}, + warn: () => {}, + error: () => {}, + }); +}); + +afterEach(() => server.resetHandlers()); + +afterAll(() => { + server.close(); +}); -test("redirects when user is missing", () => { +test("redirects when user request errors", async () => { const history = createMemoryHistory(); + history.replace = jest.fn(); + + Object.defineProperty(window, "location", { + writable: true, + value: { assign: jest.fn() }, + }); + + server.use( + rest.get( + serverMeEndpoint, + (req: RestRequest, res: ResponseComposition, ctx: RestContext) => { + return res(ctx.status(500), ctx.json("error")); + } + ) + ); + render( , { wrapper: TestWrapper } ); - expect(history.location.pathname).toBe("/"); + + await waitFor(() => { + expect(history.replace).toHaveBeenCalledWith("/"); + }); }); -test("renders user passed by state", async () => { +test("renders user from request", async () => { const history = createMemoryHistory(); - history.location.state = { - user: { organizationUuid: "foo", displayName: "bar" }, - }; + + server.use( + rest.get( + serverMeEndpoint, + (req: RestRequest, res: ResponseComposition, ctx: RestContext) => + res(ctx.json(testUser)) + ) + ); render( diff --git a/web/src/pages/welcome/Welcome.tsx b/web/src/pages/welcome/Welcome.tsx index 78e9b8b..60d225c 100644 --- a/web/src/pages/welcome/Welcome.tsx +++ b/web/src/pages/welcome/Welcome.tsx @@ -1,31 +1,41 @@ -import { Box, Heading, Text, VStack } from "@chakra-ui/react"; +import { Box, Heading, Spinner, Text, VStack } from "@chakra-ui/react"; +import { AxiosError } from "axios"; import { useHistory } from "react-router-dom"; import "./Welcome.css"; +import { useUser } from "../../hooks/use-user"; +import { QueryObserverResult } from "react-query"; import { User } from "../../data/user"; function Welcome() { const history = useHistory(); - const state = history.location.state as WelcomeState; + const user = useUser(); - if (!state?.user) { - history.replace("/"); - return <>; + if (!user.data) { + user.refetch().then((result: QueryObserverResult) => { + if (result.error) { + history.replace("/"); + } + }); + } + + if (user.isLoading || !user.data) { + return ( + + + + ); } return ( Welcome - Org id: {state.user.organizationUuid} - Display name: {state.user.displayName} + Org id: {user.data.organizationUuid} + Display name: {user.data.displayName} ); } -interface WelcomeState { - user: User; -} - export default Welcome;