From d174586317c68ab6cde5be0f37f32b95f7569e99 Mon Sep 17 00:00:00 2001 From: Tran Manh Date: Fri, 21 Jul 2023 15:22:22 +0700 Subject: [PATCH] [#30] Fill the data into the Question page --- src/components/Answer/index.test.tsx | 176 ++++++++++++++++++++++ src/components/Answer/index.tsx | 59 ++++++++ src/components/AppSlider/index.test.tsx | 2 +- src/components/AppSlider/index.tsx | 27 ++-- src/components/Dropdown/index.test.tsx | 4 +- src/components/Dropdown/index.tsx | 11 +- src/components/ElevatedButton/index.tsx | 6 +- src/components/MultiChoice/index.test.tsx | 4 +- src/components/MultiChoice/index.tsx | 11 +- src/components/MultiInputs/index.test.tsx | 25 +++ src/components/MultiInputs/index.tsx | 56 +++++++ src/components/Nps/index.test.tsx | 11 +- src/components/Nps/index.tsx | 11 +- src/components/Rating/index.test.tsx | 4 +- src/components/Rating/index.tsx | 15 +- src/components/TextArea/index.test.tsx | 11 +- src/components/TextArea/index.tsx | 34 ++++- src/screens/Question/index.tsx | 71 ++++++--- src/store/reducers/Survey/action.ts | 9 +- src/store/reducers/Survey/index.ts | 6 +- src/types/question.ts | 3 +- src/types/request/surveySubmitRequest.ts | 2 +- 22 files changed, 495 insertions(+), 63 deletions(-) create mode 100644 src/components/Answer/index.test.tsx create mode 100644 src/components/Answer/index.tsx create mode 100644 src/components/MultiInputs/index.test.tsx create mode 100644 src/components/MultiInputs/index.tsx diff --git a/src/components/Answer/index.test.tsx b/src/components/Answer/index.test.tsx new file mode 100644 index 0000000..3a76e8e --- /dev/null +++ b/src/components/Answer/index.test.tsx @@ -0,0 +1,176 @@ +import React from 'react'; + +import { render, screen } from '@testing-library/react'; + +import { Question } from 'types/question'; + +import Answer from '.'; + +describe('Answer', () => { + describe('given the display type is star', () => { + it('renders Rating component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'star', + answers: [], + }; + const dataTestId = 'answer'; + render(); + + const star = screen.getByTestId(dataTestId); + + expect(star).toBeVisible(); + expect(star).toHaveAttribute('id', 'rating-id'); + }); + }); + + describe('given the display type is choice', () => { + it('renders MultiChoice component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'choice', + answers: [], + }; + const dataTestId = 'answer'; + render(); + + const multiChoice = screen.getByTestId(dataTestId); + + expect(multiChoice).toBeVisible(); + expect(multiChoice).toHaveAttribute('id', 'multi-choice-id'); + }); + }); + + describe('given the display type is nps', () => { + it('renders Nps component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'nps', + answers: [], + }; + const dataTestId = 'answer'; + render(); + + const nps = screen.getByTestId(dataTestId); + + expect(nps).toBeVisible(); + expect(nps).toHaveAttribute('id', 'nps-id'); + }); + }); + + describe('given the display type is textarea', () => { + it('renders TextArea component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'textarea', + answers: [ + { + id: 'id', + resourceType: 'answer', + text: '', + }, + ], + }; + const dataTestId = 'answer'; + render(); + + const textArea = screen.getByTestId(dataTestId); + + expect(textArea).toBeVisible(); + expect(textArea).toHaveAttribute('id', 'text-area-id'); + }); + }); + + describe('given the display type is textfield', () => { + it('renders MultiInputs component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'textfield', + answers: [ + { + id: 'id', + resourceType: 'answer', + text: '', + }, + ], + }; + const dataTestId = 'answer'; + render(); + + const multiInputs = screen.getByTestId(dataTestId); + + expect(multiInputs).toBeVisible(); + expect(multiInputs).toHaveAttribute('id', 'multi-inputs-id'); + }); + }); + + describe('given the display type is dropdown', () => { + it('renders Dropdown component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'dropdown', + answers: [ + { + id: 'id', + resourceType: 'answer', + text: '', + }, + ], + }; + const dataTestId = 'answer'; + render(); + + const dropdown = screen.getByTestId(dataTestId); + + expect(dropdown).toBeVisible(); + expect(dropdown).toHaveAttribute('id', 'dropdown-id'); + }); + }); + + describe('given the display type is slider', () => { + it('renders Dropdown component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'slider', + answers: [ + { + id: 'id', + resourceType: 'answer', + text: '', + }, + ], + }; + const dataTestId = 'answer'; + render(); + + const slider = screen.getByTestId(dataTestId); + + expect(slider).toBeVisible(); + expect(slider).toHaveAttribute('id', 'slider-id'); + }); + }); + + describe('given the display type is intro', () => { + it('renders Dropdown component', () => { + const question: Question = { + id: 'id', + resourceType: 'question', + displayType: 'intro', + answers: [], + }; + const dataTestId = 'answer'; + render(); + + const intro = screen.getByTestId(dataTestId); + + expect(intro).toBeVisible(); + }); + }); +}); diff --git a/src/components/Answer/index.tsx b/src/components/Answer/index.tsx new file mode 100644 index 0000000..a9ed91c --- /dev/null +++ b/src/components/Answer/index.tsx @@ -0,0 +1,59 @@ +import React from 'react'; + +import AppSlider from 'components/AppSlider'; +import Dropdown from 'components/Dropdown'; +import MultiChoice from 'components/MultiChoice'; +import MultiInputs from 'components/MultiInputs'; +import Nps from 'components/Nps'; +import Rating from 'components/Rating'; +import TextArea from 'components/TextArea'; +import { DisplayType, Question, getDisplayTypeEnum } from 'types/question'; + +interface AnswerProps { + question: Question; + 'data-test-id'?: string; +} +const Answer = ({ question, ...rest }: AnswerProps): JSX.Element => { + const displayTypeEnum = getDisplayTypeEnum(question); + + switch (displayTypeEnum) { + case DisplayType.Heart: + case DisplayType.Smiley: + case DisplayType.Thumbs: + case DisplayType.Star: + return ( + + ); + case DisplayType.Choice: + return ( + + ); + case DisplayType.Nps: + return ; + case DisplayType.Textarea: + return