diff --git a/package.json b/package.json index 5bc350b..71a7e2c 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@storybook/testing-library": "^0.0.9", "@svgr/webpack": "^6.2.1", "@testing-library/jest-dom": "^5.16.2", - "@testing-library/react": "^12.1.3", + "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.3.0", "@types/jest": "^27.4.1", "@types/node": "^17.0.21", diff --git a/src/app/providers/router/config/routeConfig.tsx b/src/app/providers/router/config/routeConfig.tsx index 79f3356..269c7b0 100644 --- a/src/app/providers/router/config/routeConfig.tsx +++ b/src/app/providers/router/config/routeConfig.tsx @@ -10,63 +10,63 @@ import { ForbiddenPage } from '@/pages/ForbiddenPage'; import { NotFoundPage } from '@/pages/NotFoundPage'; import { AppRoutes, - getRouterAbout, - getRouterAdminPanel, - getRouterArticleCreate, - getRouterArticleDetails, - getRouterArticleEdit, - getRouterArticles, getRouterForbidden, - getRouterMain, getRouterNotFound, - getRouterProfile, + getRouteAbout, + getRouteAdminPanel, + getRouteArticleCreate, + getRouteArticleDetails, + getRouteArticleEdit, + getRouteArticles, getRouteForbidden, + getRouteMain, getRouteNotFound, + getRouteProfile, } from '@/shared/const/router'; import { AppRoutesProps } from '@/shared/types/router'; export const routeConfig: Record = { [AppRoutes.MAIN]: { - path: getRouterMain(), + path: getRouteMain(), element: , }, [AppRoutes.ABOUT]: { - path: getRouterAbout(), + path: getRouteAbout(), element: , }, [AppRoutes.PROFILE]: { - path: getRouterProfile(':id'), + path: getRouteProfile(':id'), element: , authOnly: true, }, [AppRoutes.ARTICLES]: { - path: getRouterArticles(), + path: getRouteArticles(), element: , authOnly: true, }, [AppRoutes.ARTICLE_DETAILS]: { - path: getRouterArticleDetails(':id'), + path: getRouteArticleDetails(':id'), element: , authOnly: true, }, [AppRoutes.ARTICLE_CREATE]: { - path: getRouterArticleCreate(), + path: getRouteArticleCreate(), element: , authOnly: true, }, [AppRoutes.ARTICLE_EDIT]: { - path: getRouterArticleEdit(':id'), + path: getRouteArticleEdit(':id'), element: , authOnly: true, }, [AppRoutes.ADMIN_PANEL]: { - path: getRouterAdminPanel(), + path: getRouteAdminPanel(), element: , authOnly: true, roles: [UserRole.ADMIN, UserRole.MANAGER], }, [AppRoutes.FORBIDDEN]: { - path: getRouterForbidden(), + path: getRouteForbidden(), element: , }, [AppRoutes.NOT_FOUND]: { - path: getRouterNotFound(), + path: getRouteNotFound(), element: , }, }; diff --git a/src/app/providers/router/ui/AppRouter.test.tsx b/src/app/providers/router/ui/AppRouter.test.tsx new file mode 100644 index 0000000..0bd0171 --- /dev/null +++ b/src/app/providers/router/ui/AppRouter.test.tsx @@ -0,0 +1,66 @@ +import { screen } from '@testing-library/react'; +import AppRouter from './AppRouter'; +import { componentRender } from '@/shared/lib/tests/componentRender/componentRender'; +import { getRouteAbout, getRouteAdminPanel, getRouteProfile } from '@/shared/const/router'; +import { UserRole } from '@/entities/User'; + +describe('AppRouter', () => { + test('Test render', async () => { + componentRender(, { + route: getRouteAbout(), + }); + const page = await screen.findByTestId('AboutPage'); + expect(page).toBeInTheDocument(); + }); + test('no page foundN', async () => { + componentRender(, { + route: '/dadsdsad', + }); + const page = await screen.findByTestId('NotFoundPage'); + expect(page).toBeInTheDocument(); + }); + test('redirect no auth to main page', async () => { + componentRender(, { + route: getRouteProfile('1'), + }); + + const page = await screen.findByTestId('MainPage'); + expect(page).toBeInTheDocument(); + }); + + test('access to profile', async () => { + componentRender(, { + route: getRouteProfile('1'), + initialState: { + user: { _inited: true, authData: {} }, + }, + }); + + const page = await screen.findByTestId('ProfilePage'); + expect(page).toBeInTheDocument(); + }); + + test('access denied (no roles)', async () => { + componentRender(, { + route: getRouteAdminPanel(), + initialState: { + user: { _inited: true, authData: {} }, + }, + }); + + const page = await screen.findByTestId('ForbiddenPage'); + expect(page).toBeInTheDocument(); + }); + + test('access granted (have roles)', async () => { + componentRender(, { + route: getRouteAdminPanel(), + initialState: { + user: { _inited: true, authData: { roles: [UserRole.ADMIN] } }, + }, + }); + + const page = await screen.findByTestId('AdminPanelPage'); + expect(page).toBeInTheDocument(); + }); +}); diff --git a/src/app/providers/router/ui/RequireAuth.tsx b/src/app/providers/router/ui/RequireAuth.tsx index 3bb7108..bd0c0b0 100644 --- a/src/app/providers/router/ui/RequireAuth.tsx +++ b/src/app/providers/router/ui/RequireAuth.tsx @@ -6,7 +6,7 @@ import { getUserRoles, UserRole, } from '../../../../entities/User'; -import { getRouterForbidden, getRouterMain } from '@/shared/const/router'; +import { getRouteForbidden, getRouteMain } from '@/shared/const/router'; interface RequireAuthProps { children: JSX.Element; @@ -27,11 +27,11 @@ export function RequireAuth({ children, roles }: RequireAuthProps) { }, [roles, userRoles]); if (!auth) { - return ; + return ; } if (!hasRequiredRoles) { - return ; + return ; } return children; diff --git a/src/entities/Article/ui/ArticleListItem/ArticleListItem.tsx b/src/entities/Article/ui/ArticleListItem/ArticleListItem.tsx index e539720..6e85790 100644 --- a/src/entities/Article/ui/ArticleListItem/ArticleListItem.tsx +++ b/src/entities/Article/ui/ArticleListItem/ArticleListItem.tsx @@ -12,7 +12,7 @@ import { ArticleBlockType, ArticleView } from '../../model/consts/consts'; import { ArticleTextBlockComponent } from '../ArticleTextBlockComponent/ArticleTextBlockComponent'; import { Article, ArticleTextBlock } from '../../model/types/article'; import cls from './ArticleListItem.module.scss'; -import { getRouterArticleDetails } from '@/shared/const/router'; +import { getRouteArticleDetails } from '@/shared/const/router'; import { AppImage } from '@/shared/ui/AppImage'; import { Skeleton } from '@/shared/ui/Skeleton'; @@ -66,7 +66,7 @@ export const ArticleListItem = memo((props: ArticleListItemProps) => {