From 00c01ee035ce82acfd3847f22278a844686a94ba Mon Sep 17 00:00:00 2001 From: rahulch07 Date: Sat, 1 Feb 2025 00:35:49 +0530 Subject: [PATCH] added docs and tests --- .../docs/docs/getting-started/installation.md | 113 ++++++++++++++ .../img/markdown/installation/Register.png | Bin 0 -> 35742 bytes src/components/OrgListCard/OrgListCard.tsx | 2 +- .../SecuredRoute/securedRoute.spec.tsx | 43 +++++ src/screens/LoginPage/LoginPage.spec.tsx | 147 +++++++++++++++++- src/screens/LoginPage/LoginPage.tsx | 6 +- 6 files changed, 298 insertions(+), 13 deletions(-) create mode 100644 docs/static/img/markdown/installation/Register.png create mode 100644 src/components/SecuredRoute/securedRoute.spec.tsx diff --git a/docs/docs/docs/getting-started/installation.md b/docs/docs/docs/getting-started/installation.md index fc14fd7320..59ad2dc621 100644 --- a/docs/docs/docs/getting-started/installation.md +++ b/docs/docs/docs/getting-started/installation.md @@ -267,3 +267,116 @@ REACT_APP_RECAPTCHA_SITE_KEY="this_is_the_recaptcha_key" #### Setting up Compiletime and Runtime logs Set the `ALLOW_LOGS` to "YES" if you want warnings , info and error messages in your console or leave it blank if you dont need them or want to keep the console clean + +## First Time SignIn as Admin + +After setting up **`talawa-admin`** and **`talawa-api`**, your PostgreSQL database will have only one user: **Administrator**. +To sign in as an **Admin**, you need to **register a user** and then manually grant them **Administrator** privileges. + +--- + +## 📌 Steps to Sign In as an Administrator + +### 1️⃣ Register as an Admin + +You can register using the **frontend**. + +> **Optional:** If needed, insert an image showing the registration page here: +> ![Registering a new user](../../../static/img/markdown/installation/Register.png) + +--- + +### 2️⃣ Grant Administrator Role to the Registered User + +> 🔹 **Note:** Since the **Super Admin** is not yet configured, we will use the **GraphQL frontend** for this. + +1. Open **GraphiQL** in your browser: + +2. **Sign in as Administrator** + + - Use the following GraphQL **query** to get an **authentication token** for authorization in later queries: + + ```graphql + mutation { + signIn( + input: { emailAddress: "administrator@email.com", password: "password" } + ) { + authenticationToken + user { + id + name + } + } + } + ``` + +2) **Make the registered user an Administrator** + + - Use the following GraphQL **mutation** to assign **administrator** role to user: + + ```graphql + mutation { + updateUser(input: { id: "user-id", role: administrator }) { + id + name + } + } + ``` + +3) **Next create an organization** + + - Use the following GraphQL **mutation** to create an organization: + + ```graphql + mutation { + createOrganization( + input: { + addressLine1: "Los Angeles" + addressLine2: "USA" + city: "Los Angeles" + countryCode: in + description: "testing" + name: "Test Org 7" + postalCode: "876876" + state: "California" + } + ) { + id + } + } + ``` + +4) **Make user an administrator of the organization** + + - Use the following GraphQL **mutation** to assign **administrator** role to user: + + ```graphql + createOrganizationMembership( + input: { + memberId: "user-id" + organizationId: "org-id" + role: administrator + } + ) { + id + name + addressLine1 + createdAt + members(first: 5) { + pageInfo { + hasNextPage + startCursor + } + edges { + cursor + node { + id + name + } + } + } + } + } + ``` + +Now sign successfully in with your registered ADMIN. diff --git a/docs/static/img/markdown/installation/Register.png b/docs/static/img/markdown/installation/Register.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7023934c317b1bb7a27e7b11a891ac4a0d1850 GIT binary patch literal 35742 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 {/* Description of the organization */}
- +
{/* Display the organization address if available */} diff --git a/src/components/SecuredRoute/securedRoute.spec.tsx b/src/components/SecuredRoute/securedRoute.spec.tsx new file mode 100644 index 0000000000..2b10ef0b94 --- /dev/null +++ b/src/components/SecuredRoute/securedRoute.spec.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { MemoryRouter, Route, Routes } from 'react-router-dom'; +import { render, screen } from '@testing-library/react'; +import SecuredRoute from './SecuredRoute'; +import useLocalStorage from 'utils/useLocalstorage'; + +const { setItem } = useLocalStorage(); + +describe('SecuredRoute', () => { + it('for administrator', () => { + // Set the 'IsLoggedIn' value to 'TRUE' in localStorage to simulate a logged-in user and do not set 'AdminFor' so that it remains undefined. + setItem('IsLoggedIn', 'TRUE'); + setItem('role', 'administrator'); + + render( + + + }> + + + + , + ); + }); + + it('for administrator', () => { + // Set the 'IsLoggedIn' value to 'TRUE' in localStorage to simulate a logged-in user and do not set 'AdminFor' so that it remains undefined. + setItem('IsLoggedIn', 'TRUE'); + setItem('role', 'regular'); + + render( + + + }> + + + + , + ); + + expect(screen.getByText('talawaUser')).toBeInTheDocument(); + }); +}); diff --git a/src/screens/LoginPage/LoginPage.spec.tsx b/src/screens/LoginPage/LoginPage.spec.tsx index 4c04785f1a..e8a3c9dd19 100644 --- a/src/screens/LoginPage/LoginPage.spec.tsx +++ b/src/screens/LoginPage/LoginPage.spec.tsx @@ -42,6 +42,7 @@ const MOCKS = [ signIn: { user: { id: '1', + role: 'administrator', }, authenticationToken: 'authenticationToken', }, @@ -52,20 +53,16 @@ const MOCKS = [ request: { query: SIGNUP_MUTATION, variables: { - name: 'John Patrick', + name: 'John Doe', email: 'johndoe@gmail.com', - password: 'johnDoe', + password: 'Johndoe@123', }, }, result: { data: { - register: { + signUp: { user: { id: '1', - name: 'John Patrick', - emailAddress: 'johndoe@gmail.com', - role: 'User', - countryCode: '12', }, authenticationToken: 'authenticationToken', }, @@ -200,9 +197,24 @@ const MOCKS3 = [ }, ]; +const MOCKS4 = [ + { + request: { + query: SIGNIN_QUERY, + variables: { + email: 'johndoe@gmail.com', + password: 'johndoe1', + id: 'yttyt', + }, + }, + error: new Error('Invalid credentials'), + }, +]; + const link = new StaticMockLink(MOCKS, true); // const link2 = new StaticMockLink(MOCKS2, true); const link3 = new StaticMockLink(MOCKS3, true); +const link4 = new StaticMockLink(MOCKS4, true); async function wait(ms = 100): Promise { await act(() => { @@ -539,6 +551,50 @@ describe('Testing Login Page Screen', () => { expect(screen.getByTestId('goToRegisterPortion')).toBeInTheDocument(); }); + it('switches to login tab on successful registration correct data', async () => { + const formData = { + name: 'John Doe', + email: 'johndoe@gmail.com', + password: 'Johndoe@123', + confirmPassword: 'Johndoe@123', + orgId: 'abc', + }; + + render( + + + + + + + + + , + ); + + await wait(); + + userEvent.click(screen.getByTestId(/goToRegisterPortion/i)); + + await wait(); + userEvent.type(screen.getByPlaceholderText(/Name/i), formData.name); + + userEvent.type(screen.getByTestId(/signInEmail/i), formData.email); + userEvent.type(screen.getByPlaceholderText('Password'), formData.password); + userEvent.type( + screen.getByPlaceholderText('Confirm Password'), + formData.confirmPassword, + ); + + userEvent.click(screen.getByTestId('registrationBtn')); + + await wait(); + + // Check if the login tab is now active by checking for elements that only appear in the login tab + expect(screen.getByTestId('loginBtn')).toBeInTheDocument(); + expect(screen.getByTestId('goToRegisterPortion')).toBeInTheDocument(); + }); + it('Testing toggle login register portion', async () => { render( @@ -592,6 +648,37 @@ describe('Testing Login Page Screen', () => { await wait(); }); + it('Testing wrong login functionality', async () => { + const formData = { + email: 'johndoe@gmail.com', + password: 'johndoe1', + }; + + render( + + + + + + + + + , + ); + + await wait(); + + userEvent.type(screen.getByTestId(/loginEmail/i), formData.email); + userEvent.type( + screen.getByPlaceholderText(/Enter Password/i), + formData.password, + ); + + userEvent.click(screen.getByTestId('loginBtn')); + + await wait(); + }); + it('Testing ReCaptcha functionality, it should refresh on unsuccessful SignUp, using duplicate email', async () => { const formData = { name: 'John Doe', @@ -1063,4 +1150,50 @@ describe('Talawa-API server fetch check', () => { expect(fetch).toHaveBeenCalledWith(BACKEND_URL); }); + + // it('Testing ReCaptcha functionality, it should fail', async () => { + // const formData = { + // name: 'John Doe', + // email: 'johndoe@gmail.com', + // password: 'johnDoe@1', + // confirmPassword: 'johnDoe@1', + // }; + + // vi.mock('Constant/constant.ts', async () => ({ + // ...(await vi.importActual('Constant/constant.ts')), + // REACT_APP_USE_RECAPTCHA: 'No', + // RECAPTCHA_SITE_KEY: 'xxx', + // })); + + // render( + // + // + // + // + // + // + // + // + // , + // ); + + // await wait(); + + // userEvent.click(screen.getByTestId(/goToRegisterPortion/i)); + + // userEvent.type(screen.getByPlaceholderText(/Name/i), formData.name); + + // userEvent.type(screen.getByTestId(/signInEmail/i), formData.email); + // userEvent.type(screen.getByPlaceholderText('Password'), formData.password); + // userEvent.type( + // screen.getByPlaceholderText('Confirm Password'), + // formData.confirmPassword, + // ); + + // userEvent.click(screen.getByTestId('registrationBtn')); + + // await waitFor(() => { + // expect(resetReCAPTCHA).toBeCalled(); + // }); + // }); }); diff --git a/src/screens/LoginPage/LoginPage.tsx b/src/screens/LoginPage/LoginPage.tsx index c260be45b1..ea34138f9f 100644 --- a/src/screens/LoginPage/LoginPage.tsx +++ b/src/screens/LoginPage/LoginPage.tsx @@ -186,8 +186,7 @@ const loginPage = (): JSX.Element => { const signupLink = async (e: ChangeEvent): Promise => { e.preventDefault(); - const { signName, signEmail, signPassword, cPassword, signOrg } = - signformState; + const { signName, signEmail, signPassword, cPassword } = signformState; const isVerified = await verifyRecaptcha(recaptchaToken); @@ -226,7 +225,6 @@ const loginPage = (): JSX.Element => { name: signName, email: signEmail, password: signPassword, - orgId: signOrg, }, }); @@ -291,7 +289,6 @@ const loginPage = (): JSX.Element => { const { signIn } = signInData; const { user, authenticationToken } = signIn; const isAdmin: boolean = user.role === 'administrator'; - if (role === 'admin' && !isAdmin) { toast.warn(tErrors('notAuthorised') as string); return; @@ -307,7 +304,6 @@ const loginPage = (): JSX.Element => { // setItem('FirstName', user.firstName); // setItem('LastName', user.lastName); // setItem('UserImage', user.avatarURL); - if (role === 'admin') { setItem('id', loggedInUserId); } else {