diff --git a/src/Analysis/GWASV2/Components/Covariates/Covariates.css b/src/Analysis/GWASV2/Components/Covariates/Covariates.css index 2974e0740f..086f89d65c 100644 --- a/src/Analysis/GWASV2/Components/Covariates/Covariates.css +++ b/src/Analysis/GWASV2/Components/Covariates/Covariates.css @@ -11,13 +11,15 @@ margin-top: 8px; } +.GWASV2 .outcome-card { + background: #cae6f1; +} + .GWASV2 .dichotomous-card { - width: 189px; background: #ebfad3; } .GWASV2 .continuous-card { - width: 189px; background: #fde3d6; } diff --git a/src/Analysis/GWASV2/Components/Covariates/CovariatesCardList.stories.jsx b/src/Analysis/GWASV2/Components/Covariates/CovariatesCardList.stories.jsx new file mode 100644 index 0000000000..8b7860445c --- /dev/null +++ b/src/Analysis/GWASV2/Components/Covariates/CovariatesCardList.stories.jsx @@ -0,0 +1,30 @@ +import React, { useState } from 'react'; +import CovariatesCardsList from './CovariatesCardsList'; +import ValidState from '../../TestData/States/ValidState'; +import './Covariates.css'; +import '../../Steps/SelectCovariates/SelectCovariates.css'; +import '../../GWASV2.css'; + +export default { + title: 'Tests3/GWASV2/CovariatesCardsList', + component: CovariatesCardsList, +}; + +const Template = (args) => ( +
+
+
+
+ + alert('called deleteCovariate Method') + } + /> +
+
+
+); + +export const SuccessState = Template.bind({}); +SuccessState.args = ValidState; diff --git a/src/Analysis/GWASV2/Components/Covariates/CovariatesCardList.test.jsx b/src/Analysis/GWASV2/Components/Covariates/CovariatesCardList.test.jsx new file mode 100644 index 0000000000..e15be3c56d --- /dev/null +++ b/src/Analysis/GWASV2/Components/Covariates/CovariatesCardList.test.jsx @@ -0,0 +1,80 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { DeleteOutlined } from '@ant-design/icons'; +import CovariatesCardsList from './CovariatesCardsList'; +import ValidState from '../../TestData/States/ValidState'; + +describe('CovariatesCardsList component', () => { + let wrapper; + const mockDeleteCovariate = jest.fn(); + + const outcomeText = ValidState.outcome.concept_name; + const lastCovariateObj = ValidState.covariates.at(-1); + const lastContinousCovariateText = lastCovariateObj.concept_name; + const dichotomousObj = ValidState.covariates.filter( + (obj) => obj.variable_type === 'custom_dichotomous', + )[0]; + const dichotomousText = dichotomousObj.provided_name; + + beforeEach(() => { + const mockProps = { + outcome: ValidState.outcome, + covariates: ValidState.covariates, + deleteCovariate: mockDeleteCovariate, + }; + wrapper = mount(); + }); + + it('should render an outcome card', () => { + expect(wrapper.find('.outcome-card').exists()).toBe(true); + expect(wrapper.find('.outcome-card .ant-card-meta-title').text()).toBe( + 'Outcome Phenotype', + ); + expect( + wrapper.find('.outcome-card .ant-card-meta-description').text(), + ).toBe(outcomeText); + }); + + it('should render covariate cards', () => { + expect(wrapper.find('.dichotomous-card').exists()).toBe(true); + expect( + wrapper + .find('.dichotomous-card .ant-card-meta-title') + .last() + .text(), + ).toBe('Dichotomous Covariate'); + expect( + wrapper + .find('.dichotomous-card .ant-card-meta-description') + .last() + .text(), + ).toBe(dichotomousText); + + expect(wrapper.find('.continuous-card').exists()).toBe(true); + expect( + wrapper + .find('.continuous-card .ant-card-meta-title') + .last() + .text(), + ).toBe('Continuous Covariate'); + expect( + wrapper + .find('.continuous-card .ant-card-meta-description') + .last() + .text(), + ).toBe(lastContinousCovariateText); + }); + + it('should call deleteCovariate when the delete icon is clicked', () => { + wrapper + .find(DeleteOutlined) + .first() + .simulate('click'); + expect(mockDeleteCovariate).toHaveBeenCalledWith(dichotomousObj); + wrapper + .find(DeleteOutlined) + .last() + .simulate('click'); + expect(mockDeleteCovariate).toHaveBeenCalledWith(lastCovariateObj); + }); +}); diff --git a/src/Analysis/GWASV2/Components/Covariates/CovariatesCardsList.jsx b/src/Analysis/GWASV2/Components/Covariates/CovariatesCardsList.jsx index d9fd428448..eb9e59a174 100644 --- a/src/Analysis/GWASV2/Components/Covariates/CovariatesCardsList.jsx +++ b/src/Analysis/GWASV2/Components/Covariates/CovariatesCardsList.jsx @@ -5,13 +5,21 @@ import { Card } from 'antd'; const { Meta } = Card; -const CovariatesCardsList = ({ covariates, deleteCovariate }) => ( +const CovariatesCardsList = ({ covariates, outcome, deleteCovariate }) => (
+ {outcome && ( + + + + )} {covariates.map((covariate, key) => ( - + {covariate.provided_name && ( ( ); CovariatesCardsList.propTypes = { - covariates: PropTypes.array.isRequired, + covariates: PropTypes.array, + outcome: PropTypes.object, deleteCovariate: PropTypes.func.isRequired, }; +CovariatesCardsList.defaultProps = { + outcome: null, + covariates: [], +}; export default CovariatesCardsList; diff --git a/src/Analysis/GWASV2/Components/JobInputModal/JobInputModal.stories.jsx b/src/Analysis/GWASV2/Components/JobInputModal/JobInputModal.stories.jsx index a7cc624ca6..8fef897745 100644 --- a/src/Analysis/GWASV2/Components/JobInputModal/JobInputModal.stories.jsx +++ b/src/Analysis/GWASV2/Components/JobInputModal/JobInputModal.stories.jsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import ValidInitialState from '../../TestData/InitialStates/ValidInitialState'; +import ValidState from '../../TestData/States/ValidState'; import JobInputModal from './JobInputModal'; export default { @@ -24,7 +24,7 @@ const MockTemplate = () => { finalPopulationSizes, outcome, selectedStudyPopulationCohort, - } = ValidInitialState; + } = ValidState; return (
null; @@ -21,7 +21,7 @@ const { finalPopulationSizes, outcome, selectedStudyPopulationCohort, -} = ValidInitialState; +} = ValidState; describe('JobInputModal', () => { let wrapper; diff --git a/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.stories.jsx b/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.stories.jsx index 8eebba7b80..4af68178e7 100644 --- a/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.stories.jsx +++ b/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.stories.jsx @@ -5,7 +5,7 @@ import SelectionConfiguration from './SelectConfiguration'; import { rest } from 'msw'; import { QueryClient, QueryClientProvider } from 'react-query'; import '../../GWASV2.css'; -import ValidInitialState from '../../TestData/InitialStates/ValidInitialState'; +import ValidState from '../../TestData/States/ValidState'; export default { title: 'Tests3/GWASV2/SelectConfiguration', @@ -19,7 +19,7 @@ const mockedQueryClient = new QueryClient({ }); const MockTemplate = () => { - const [state, dispatch] = useReducer(reducer, ValidInitialState); + const [state, dispatch] = useReducer(reducer, ValidState); return ( diff --git a/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.test.jsx b/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.test.jsx index 80fedd4251..e2823255ee 100644 --- a/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.test.jsx +++ b/src/Analysis/GWASV2/Components/SelectConfiguration/SelectConfiguration.test.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import SelectConfiguration from './SelectConfiguration'; -import ValidInitialState from '../../TestData/InitialStates/ValidInitialState'; +import ValidState from '../../TestData/States/ValidState'; import ACTIONS from '../../Utils/StateManagement/Actions'; describe('SelectConfiguration component', () => { @@ -14,7 +14,7 @@ describe('SelectConfiguration component', () => { covariates, outcome, imputationScore, - } = ValidInitialState; + } = ValidState; beforeEach(() => { wrapper = shallow( diff --git a/src/Analysis/GWASV2/Components/SelectHare/SelectHareDropDown.test.jsx b/src/Analysis/GWASV2/Components/SelectHare/SelectHareDropDown.test.jsx index 1c16a6bbcd..68d63642dc 100644 --- a/src/Analysis/GWASV2/Components/SelectHare/SelectHareDropDown.test.jsx +++ b/src/Analysis/GWASV2/Components/SelectHare/SelectHareDropDown.test.jsx @@ -3,7 +3,7 @@ import { mount } from 'enzyme'; import { Select } from 'antd'; import { QueryClient, QueryClientProvider } from 'react-query'; import SelectHareDropDown from './SelectHareDropDown'; -import ValidInitialState from '../../TestData/InitialStates/ValidInitialState'; +import ValidState from '../../TestData/States/ValidState'; import ACTIONS from '../../Utils/StateManagement/Actions'; import { SourceContextProvider } from '../../Utils/Source'; import { @@ -30,7 +30,8 @@ fetchConceptStatsByHareSubset.mockResolvedValue({ ], }); useSourceFetch.mockResolvedValue({ - sourceId: 2, loading: false, + sourceId: 2, + loading: false, }); // Other generic arguments and functions shared by tests below: @@ -43,7 +44,8 @@ const mountDropDownForOutcome = ( selectedStudyPopulationCohort, covariates, outcome, - dispatch) => mount( + dispatch, +) => mount( { let wrapper; - const { - selectedStudyPopulationCohort, - covariates, - outcome, - } = ValidInitialState; + const { selectedStudyPopulationCohort, covariates, outcome } = ValidState; let dispatch; beforeEach(() => { dispatch = jest.fn(); // use mount() instead of shallow(): - wrapper = mountDropDownForOutcome(selectedStudyPopulationCohort, + wrapper = mountDropDownForOutcome( + selectedStudyPopulationCohort, covariates, outcome, - dispatch); + dispatch, + ); }); it('should render the SelectHareDropDown component', async () => { expect(wrapper.find(SelectHareDropDown).exists()).toBe(true); @@ -107,10 +107,7 @@ describe('SelectHareDropDown component - Quantitative outcome test scenarios', ( describe('SelectHareDropDown component - Dichotomous (case/control) test scenarios', () => { let wrapper; - const { - selectedStudyPopulationCohort, - covariates, - } = ValidInitialState; + const { selectedStudyPopulationCohort, covariates } = ValidState; // Custom dichotomous (case/control) outcome type: const outcome = { variable_type: 'custom_dichotomous', @@ -121,10 +118,12 @@ describe('SelectHareDropDown component - Dichotomous (case/control) test scenari beforeEach(() => { dispatch = jest.fn(); - wrapper = mountDropDownForOutcome(selectedStudyPopulationCohort, + wrapper = mountDropDownForOutcome( + selectedStudyPopulationCohort, covariates, outcome, - dispatch); + dispatch, + ); }); it('should render the SelectHareDropDown component', async () => { expect(wrapper.find(SelectHareDropDown).exists()).toBe(true); @@ -154,7 +153,8 @@ describe('SelectHareDropDown component - Dichotomous (case/control) test scenari payload: [ { population: 'Control', size: 39648 }, { population: 'Case', size: 39648 }, - { population: 'Total', size: 39648 * 2 }], + { population: 'Total', size: 39648 * 2 }, + ], }); }); }); diff --git a/src/Analysis/GWASV2/Steps/SelectCovariates/SelectCovariates.jsx b/src/Analysis/GWASV2/Steps/SelectCovariates/SelectCovariates.jsx index 45089d64fc..243e96de00 100644 --- a/src/Analysis/GWASV2/Steps/SelectCovariates/SelectCovariates.jsx +++ b/src/Analysis/GWASV2/Steps/SelectCovariates/SelectCovariates.jsx @@ -82,6 +82,7 @@ const SelectCovariates = ({
dispatch({ type: ACTIONS.DELETE_COVARIATE, payload: chosenCovariate, diff --git a/src/Analysis/GWASV2/Steps/SelectOutcome/SelectOutcome.jsx b/src/Analysis/GWASV2/Steps/SelectOutcome/SelectOutcome.jsx index 8e0edc3b83..2bb3c24915 100644 --- a/src/Analysis/GWASV2/Steps/SelectOutcome/SelectOutcome.jsx +++ b/src/Analysis/GWASV2/Steps/SelectOutcome/SelectOutcome.jsx @@ -76,6 +76,7 @@ const SelectOutcome = ({
dispatch({ type: ACTIONS.DELETE_COVARIATE, payload: chosenCovariate, diff --git a/src/Analysis/GWASV2/TestData/InitialStates/ValidInitialState.js b/src/Analysis/GWASV2/TestData/States/ValidState.js similarity index 84% rename from src/Analysis/GWASV2/TestData/InitialStates/ValidInitialState.js rename to src/Analysis/GWASV2/TestData/States/ValidState.js index 26b0ae9d1c..9b24ca4001 100644 --- a/src/Analysis/GWASV2/TestData/InitialStates/ValidInitialState.js +++ b/src/Analysis/GWASV2/TestData/States/ValidState.js @@ -1,4 +1,4 @@ -const ValidInitialState = { +const ValidState = { outcome: { variable_type: 'concept', concept_id: 2000000873, @@ -10,6 +10,11 @@ const ValidInitialState = { size: 510904, }, covariates: [ + { + variable_type: 'custom_dichotomous', + provided_name: 'providednamebyuser', + cohort_ids: [12, 32], + }, { variable_type: 'concept', concept_id: 2000000873, @@ -43,4 +48,4 @@ const ValidInitialState = { }, ], }; -export default ValidInitialState; +export default ValidState;