Skip to content

Commit

Permalink
feat(frontend): Add create league form
Browse files Browse the repository at this point in the history
  • Loading branch information
alexstojda committed Jul 24, 2023
1 parent 87a81cf commit 1f655df
Show file tree
Hide file tree
Showing 8 changed files with 402 additions and 99 deletions.
12 changes: 8 additions & 4 deletions web/app/src/components/Alert/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@ export type AlertData = {
detail: string;
}

export default function Alert(props: AlertData) {
type AlertProps = {
alert: AlertData
}

export default function Alert(props: AlertProps) {
return (
<ChakraAlert status={props.status}>
<ChakraAlert status={props.alert.status}>
<AlertIcon/>
<AlertTitle>{props.title}</AlertTitle>
<AlertDescription>{props.detail}</AlertDescription>
<AlertTitle>{props.alert.title}</AlertTitle>
<AlertDescription>{props.alert.detail}</AlertDescription>
</ChakraAlert>
)
}
9 changes: 6 additions & 3 deletions web/app/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import {BrowserRouter, Route, Routes} from "react-router-dom";
import {BrowserRouter, Navigate, Route, Routes} from "react-router-dom";
import {ChakraProvider, ColorModeScript} from "@chakra-ui/react";
import Login from "./pages/Login";
import theme from "./theme"
import AuthTest from "./pages/AuthTest";
import SignUpPage from "./pages/SignUp";
import LeagueListPage from "./pages/LeagueList";
import LeagueListPage from "./pages/Leagues";

const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
Expand All @@ -23,10 +23,13 @@ root.render(
);

function Router() {

return (
<BrowserRouter basename={'/app'}>
<Routes>
<Route path="/" element={<LeagueListPage/>}/>
<Route path="/" element={<Navigate to={'/leagues'}/>}/>
<Route path="/leagues" element={<LeagueListPage/>}/>
<Route path={"/leagues/create"} element={<LeagueListPage createFormOpen={true} />}/>
<Route path={"/login"} element={<Login/>}/>
<Route path={"/signup"} element={<SignUpPage/>}/>
<Route path={"/authenticated"} element={<AuthTest/>}/>
Expand Down
2 changes: 1 addition & 1 deletion web/app/src/layouts/auth/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export default function AuthLayout(props: AuthLayoutProps) {
}

{props.alert &&
<Alert status={props.alert.status} title={props.alert.title} detail={props.alert.detail}/>
<Alert alert={props.alert}/>
}

<Box
Expand Down
83 changes: 0 additions & 83 deletions web/app/src/pages/LeagueList/index.tsx

This file was deleted.

100 changes: 100 additions & 0 deletions web/app/src/pages/Leagues/Form.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import {act, render, RenderResult} from "@testing-library/react";
import LeagueForm from "./Form";
import {faker} from "@faker-js/faker";
import {Simulate} from "react-dom/test-utils";
import {randomInt} from "crypto";
import * as helpers from '../../helpers'
import {Api, LeaguesApi} from "../../api";
import {fake} from "../../test";

jest.mock('../../api')
const mockApi = jest.mocked(Api)

const mockedNavigate = jest.fn();
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom') as any,
useNavigate: () => mockedNavigate,
}));

beforeEach(() => {
mockedNavigate.mockReset()
mockApi.prototype.leaguesApi.mockReset()
mockApi.prototype.parseError.mockReset()
})

describe('LeagueForm', function () {
it('should render', function () {
render(
<LeagueForm mode={'create'}/>
)
});
it('redirects to /leagues if successful', async function () {
jest.mocked(LeaguesApi).prototype.leaguesPost.mockResolvedValue({
config: {},
data: {
league: fake.league()
},
headers: {},
request: {},
status: 201,
statusText: "",
})
mockApi.prototype.leaguesApi.mockReturnValue(new LeaguesApi())

const result = render(
<LeagueForm mode={'create'}/>
)
await typeLeagueInfo(result)

const submitButton = await result.findByText("Create")
await act(() => {
Simulate.click(submitButton)
})

expect(mockedNavigate).toHaveBeenCalledWith('/leagues')
})

it('renders error from API', async () => {
const mockError = fake.errorResponse()
mockApi.prototype.parseError.mockReturnValue(mockError)

jest.mocked(LeaguesApi).prototype.leaguesPost.mockRejectedValue(false)
mockApi.prototype.leaguesApi.mockReturnValue(new LeaguesApi())

const result = render(
<LeagueForm mode={'create'}/>
)
await typeLeagueInfo(result)

const submitButton = await result.findByText("Create")
await act(() => {
Simulate.click(submitButton)
})

expect(mockApi.prototype.parseError).toBeCalled()
expect(result.getByText(mockError.title)).toBeInTheDocument()
})
});


async function typeLeagueInfo(result: RenderResult) {
const name = faker.random.words(randomInt(3, 10))

const nameField = await result.findByPlaceholderText("name")
nameField.setAttribute("value", faker.name.fullName())
await act(() => {
Simulate.change(nameField)
})

const slugField = await result.findByPlaceholderText("slug")
slugField.setAttribute("value", helpers.slugify(name))
await act(() => {
Simulate.change(slugField)
})

const locationField = await result.findByPlaceholderText("location")
locationField.setAttribute("value", faker.random.words(4))
await act(() => {
Simulate.change(locationField)
})
}
Loading

0 comments on commit 1f655df

Please sign in to comment.