diff --git a/src/App.jsx b/src/App.jsx index f37bc9c..c41d189 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,6 +5,8 @@ import { Switch, Route } from 'react-router-dom'; import MainPage from './pages/MainPage'; import WritePage from './pages/WritePage'; import IntroducePage from './pages/IntroducePage'; +import LoginPage from './pages/LoginPage'; +import RegisterPage from './pages/RegisterPage'; import HeaderContainer from './containers/common/HeaderContainer'; const App = () => ( @@ -13,6 +15,8 @@ const App = () => ( + + diff --git a/src/App.test.jsx b/src/App.test.jsx index dcf46a6..7a1393d 100644 --- a/src/App.test.jsx +++ b/src/App.test.jsx @@ -62,4 +62,20 @@ describe('App', () => { expect(container).toHaveTextContent('스터디 그룹 개설하기'); }); }); + + context('with path /login', () => { + it('renders the study login page', () => { + const { container } = renderApp({ path: '/login' }); + + expect(container).toHaveTextContent('Login'); + }); + }); + + context('with path /register', () => { + it('renders the study register page', () => { + const { container } = renderApp({ path: '/register' }); + + expect(container).toHaveTextContent('Register'); + }); + }); }); diff --git a/src/components/auth/AuthForm.jsx b/src/components/auth/AuthForm.jsx new file mode 100644 index 0000000..66679ef --- /dev/null +++ b/src/components/auth/AuthForm.jsx @@ -0,0 +1,20 @@ +import React from 'react'; + +import styled from '@emotion/styled'; +import Responsive from '../../styles/Responsive'; + +const AuthFormWrapper = styled(Responsive)``; + +const AuthForm = ({ type }) => ( + +

{type}

+ + + {type === 'Register' && ( + + )} + +
+); + +export default AuthForm; diff --git a/src/components/auth/AuthForm.test.jsx b/src/components/auth/AuthForm.test.jsx new file mode 100644 index 0000000..fdf6256 --- /dev/null +++ b/src/components/auth/AuthForm.test.jsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import { render } from '@testing-library/react'; + +import AuthForm from './AuthForm'; + +describe('AuthForm', () => { + const renderAuthForm = ({ type }) => render(( + + )); + + context('when type is login', () => { + const login = { + type: 'Login', + }; + + it('renders login form text', () => { + const { container, getByPlaceholderText } = renderAuthForm(login); + + expect(container).toHaveTextContent('Login'); + expect(getByPlaceholderText('이메일')).not.toBeNull(); + expect(getByPlaceholderText('비밀번호')).not.toBeNull(); + }); + }); + + context('when type is register', () => { + const register = { + type: 'Register', + }; + + it('renders register form text', () => { + const { container, getByPlaceholderText } = renderAuthForm(register); + + expect(container).toHaveTextContent('Register'); + expect(getByPlaceholderText('이메일')).not.toBeNull(); + expect(getByPlaceholderText('비밀번호')).not.toBeNull(); + expect(getByPlaceholderText('비밀번호 확인')).not.toBeNull(); + }); + }); +}); diff --git a/src/components/common/Header.jsx b/src/components/common/Header.jsx index c407a77..eaa9008 100644 --- a/src/components/common/Header.jsx +++ b/src/components/common/Header.jsx @@ -1,13 +1,61 @@ import React from 'react'; +import { Link } from 'react-router-dom'; + import styled from '@emotion/styled'; -const HeaderWrapper = styled.div``; +import Responsive from '../../styles/Responsive'; +import palette from '../../styles/palette'; + +const HeaderWrapper = styled.div` + position: fixed; + width: 100%; + background: white; + box-shadow: 0px 2px 4px ${palette.teal[2]}; +`; + +const Wrapper = styled(Responsive)` + height: 5rem; + display: flex; + align-items: center; + justify-content: space-between; + div{ + margin-right: 4rem; + } +`; + +const TitleWrapper = styled(Link)` + font-weight: bold; + font-size: 1.8rem; +`; + +const LinkWrapper = styled(Link)` + :first-of-type{ + margin-right: 1rem; + } + :hover { + color: ${palette.gray[6]}; + } + font-weight: bold; +`; + +const Spacer = styled.div` + height: 6rem; +`; const Header = () => ( - -

헤더

-
+ <> + + + 제목(미정) +
+ 로그인 + 회원가입 +
+
+
+ + ); export default Header; diff --git a/src/components/common/Header.test.jsx b/src/components/common/Header.test.jsx index f6a5b47..b453f41 100644 --- a/src/components/common/Header.test.jsx +++ b/src/components/common/Header.test.jsx @@ -1,17 +1,22 @@ import React from 'react'; +import { MemoryRouter } from 'react-router-dom'; import { render } from '@testing-library/react'; import Header from './Header'; describe('Header', () => { - const renderHeader = () => render( -
, - ); + const renderHeader = () => render(( + +
+ + )); - it('renders Header Title', () => { + it('renders Header text', () => { const { container } = renderHeader(); - expect(container).toHaveTextContent('헤더'); + expect(container).toHaveTextContent('제목(미정)'); + expect(container).toHaveTextContent('로그인'); + expect(container).toHaveTextContent('회원가입'); }); }); diff --git a/src/containers/common/HeaderContainer.jsx b/src/containers/common/HeaderContainer.jsx index 2d3b7eb..108fc19 100644 --- a/src/containers/common/HeaderContainer.jsx +++ b/src/containers/common/HeaderContainer.jsx @@ -1,15 +1,10 @@ import React from 'react'; -import styled from '@emotion/styled'; - import Header from '../../components/common/Header'; -const HeaderWrapper = styled.div``; - -const HeaderContainer = () => ( - -
- +const HeaderContainer = () => (( +
+) ); export default HeaderContainer; diff --git a/src/containers/common/HeaderContainer.test.jsx b/src/containers/common/HeaderContainer.test.jsx index 9807b46..0900540 100644 --- a/src/containers/common/HeaderContainer.test.jsx +++ b/src/containers/common/HeaderContainer.test.jsx @@ -2,16 +2,19 @@ import React from 'react'; import { render } from '@testing-library/react'; +import { MemoryRouter } from 'react-router-dom'; import HeaderContainer from './HeaderContainer'; describe('HeaderContainer', () => { - const renderHeaderContainer = () => render( - , - ); + const renderHeaderContainer = () => render(( + + + + )); it('renders Header Title', () => { const { container } = renderHeaderContainer(); - expect(container).toHaveTextContent('헤더'); + expect(container).toHaveTextContent('제목(미정)'); }); }); diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx new file mode 100644 index 0000000..2e55beb --- /dev/null +++ b/src/pages/LoginPage.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +import AuthForm from '../components/auth/AuthForm'; + +const LoginPage = () => ( + +); + +export default LoginPage; diff --git a/src/pages/LoginPage.test.jsx b/src/pages/LoginPage.test.jsx new file mode 100644 index 0000000..a5de1f8 --- /dev/null +++ b/src/pages/LoginPage.test.jsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { render } from '@testing-library/react'; + +import LoginPage from './LoginPage'; + +describe('LoginPage', () => { + const renderLoginPage = () => render(( + + )); + + describe('renders Login page text contents', () => { + it('renders Login page Title', () => { + const { container } = renderLoginPage(); + + expect(container).toHaveTextContent('Login'); + }); + }); +}); diff --git a/src/pages/RegisterPage.jsx b/src/pages/RegisterPage.jsx new file mode 100644 index 0000000..ab98c1b --- /dev/null +++ b/src/pages/RegisterPage.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +import AuthForm from '../components/auth/AuthForm'; + +const RegisterPage = () => ( + +); + +export default RegisterPage; diff --git a/src/pages/RegisterPage.test.jsx b/src/pages/RegisterPage.test.jsx new file mode 100644 index 0000000..98cb5b2 --- /dev/null +++ b/src/pages/RegisterPage.test.jsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { render } from '@testing-library/react'; + +import RegisterPage from './RegisterPage'; + +describe('RegisterPage', () => { + const renderRegisterPage = () => render(( + + )); + + describe('renders Register page text contents', () => { + it('renders Register page Title', () => { + const { container } = renderRegisterPage(); + + expect(container).toHaveTextContent('Register'); + }); + }); +});