Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add e2e test #467

Draft
wants to merge 2 commits into
base: rc
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/main/webapp/app/components/tabs/tabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react';
import { Col, Container, Row } from 'reactstrap';
import * as styles from './styles.module.scss';
import classNames from 'classnames';
import { getTabDataTestId } from 'app/shared/util/test-id-utils';

export type Tab = {
id?: string;
Expand All @@ -15,9 +16,10 @@ export interface ITabsProps {
isCollapsed?: boolean;
className?: string;
contentClassName?: string;
dataTestIdPrefix?: string;
}

const Tabs = ({ tabs, isCollapsed = false, defaultOpenTabIndex = 0, className, contentClassName }: ITabsProps) => {
const Tabs = ({ tabs, isCollapsed = false, defaultOpenTabIndex = 0, className, contentClassName, dataTestIdPrefix }: ITabsProps) => {
const [openTabIndex, setOpenTabIndex] = useState(defaultOpenTabIndex);

useEffect(() => {
Expand All @@ -37,6 +39,7 @@ const Tabs = ({ tabs, isCollapsed = false, defaultOpenTabIndex = 0, className, c
key={index}
style={{ marginRight: index !== tabs.length - 1 ? 16 : 0 }}
className={`${styles.tab} ${index === openTabIndex ? styles.selected : ''} col-sm-auto`}
data-testid={getTabDataTestId(index, dataTestIdPrefix)}
>
<h6>{tab.title}</h6>
</div>
Expand Down
1 change: 1 addition & 0 deletions src/main/webapp/app/config/constants/html-id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export const REVIEW_PAGE_ID = 'review-page';
export const RCT_MODAL_BUTTON_ID = 'relevant-cancer-types-button';
export const RCT_MODAL_ID = 'relevant-cancer-type-modal';

// add mutation modal
export const DEFAULT_ADD_MUTATION_MODAL_ID = 'default-add-mutation-modal';
export const ADD_MUTATION_MODAL_INPUT_ID = 'add-mutation-modal-input';

Expand Down
22 changes: 21 additions & 1 deletion src/main/webapp/app/shared/modal/AddMutationModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import Select from 'react-select/dist/declarations/src/Select';
import InfoIcon from '../icons/InfoIcon';
import { Linkout } from '../links/Linkout';
import { SopPageLink } from '../links/SopPageLink';
import { AddMutationModalFieldTestIdType, getAddMuationModalFieldDataTestId } from '../util/test-id-utils';

type AlterationData = {
type: AlterationTypeEnum;
Expand Down Expand Up @@ -711,13 +712,15 @@ function AddMutationModal({
isLoading={_.isNil(excludingIndex) ? isFetchingAlteration : isFetchingExcludingAlteration}
placeholder="Input alteration"
onChange={newValue => handleAlterationChange(newValue, alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.ALTERATION, alterationIndex, excludingIndex)}
/>
{content}
<AddMutationModalField
label="Comment"
value={alterationData.comment}
placeholder="Input comment"
onChange={newValue => handleFieldChange(newValue, 'comment', alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.COMMENT, alterationIndex, excludingIndex)}
/>
{excludingSection}
</>
Expand All @@ -732,6 +735,7 @@ function AddMutationModal({
value={alterationData.name}
placeholder="Input name"
onChange={newValue => handleFieldChange(newValue, 'name', alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.NAME, alterationIndex, excludingIndex)}
/>
<AddMutationModalField
label="Protein Change"
Expand Down Expand Up @@ -782,6 +786,7 @@ function AddMutationModal({
value={alterationData.name}
placeholder="Input name"
onChange={newValue => handleFieldChange(newValue, 'name', alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.NAME, alterationIndex, excludingIndex)}
/>
<AddMutationModalField
label="Protein Change"
Expand All @@ -801,6 +806,7 @@ function AddMutationModal({
value={alterationData.name}
placeholder="Input name"
onChange={newValue => handleFieldChange(newValue, 'name', alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.NAME, alterationIndex, excludingIndex)}
/>
<AddMutationModalField
label="Protein Change"
Expand All @@ -820,6 +826,7 @@ function AddMutationModal({
value={alterationData.name}
placeholder="Input name"
onChange={newValue => handleFieldChange(newValue, 'name', alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.NAME, alterationIndex, excludingIndex)}
/>
</div>
);
Expand All @@ -833,6 +840,7 @@ function AddMutationModal({
value={alterationData.name}
placeholder="Input name"
onChange={newValue => handleFieldChange(newValue, 'name', alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.NAME, alterationIndex, excludingIndex)}
/>
<AddMutationModalField
label="Genes"
Expand All @@ -853,6 +861,7 @@ function AddMutationModal({
value={alterationData.name}
placeholder="Input name"
onChange={newValue => handleFieldChange(newValue, 'name', alterationIndex, excludingIndex)}
dataTestId={getAddMuationModalFieldDataTestId(AddMutationModalFieldTestIdType.NAME, alterationIndex, excludingIndex)}
/>
</div>
);
Expand Down Expand Up @@ -922,6 +931,7 @@ function AddMutationModal({
content: getTabContent(ex, alterationIndex, index),
}))}
isCollapsed={excludingCollapsed}
dataTestIdPrefix="excluding"
/>
</div>
</Col>
Expand Down Expand Up @@ -1117,9 +1127,18 @@ interface IAddMutationModalFieldProps {
onChange: (newValue: string) => void;
isLoading?: boolean;
disabled?: boolean;
dataTestId?: string;
}

function AddMutationModalField({ label, value: value, placeholder, onChange, isLoading, disabled }: IAddMutationModalFieldProps) {
function AddMutationModalField({
label,
value: value,
placeholder,
onChange,
isLoading,
disabled,
dataTestId,
}: IAddMutationModalFieldProps) {
return (
<div className="d-flex align-items-center mb-3">
<Col className="px-0 col-3 me-3 align-items-center">
Expand All @@ -1130,6 +1149,7 @@ function AddMutationModalField({ label, value: value, placeholder, onChange, isL
</Col>
<Col className="px-0">
<Input
data-testid={dataTestId}
disabled={disabled}
value={value}
onChange={event => {
Expand Down
98 changes: 98 additions & 0 deletions src/main/webapp/app/shared/util/firebase/firebase-utils.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import 'jest-expect-message';
import {
DuplicateMutationInfo,
compareFirebaseOncogenicities,
compareMutationsByCategoricalAlteration,
compareMutationsByProteinChangePosition,
compareMutationsBySingleAlteration,
geneNeedsReview,
getCancerTypeStats,
getDuplicateMutations,
getFirebasePath,
getMutationModifiedTimestamp,
getMutationName,
Expand All @@ -30,6 +32,8 @@ import {
TX_LEVELS,
Treatment,
Tumor,
Vus,
VusObjList,
} from 'app/shared/model/firebase/firebase.model';
import { generateUuid } from '../utils';
import { IDrug } from 'app/shared/model/drug.model';
Expand Down Expand Up @@ -687,5 +691,99 @@ describe('FirebaseUtils', () => {
expect(JSON.stringify(getCancerTypeStats(null), null, 4)).toEqual(JSON.stringify(expected, null, 4));
});
});

describe('getDuplicateMutations', () => {
const currentMutations = ['V600', 'V600 {excluding V600E}', 'VUS1 {excluding VUS2}', 'VUS3'];
const mutationList: Partial<Mutation>[] = [
{ name: 'V600', name_uuid: '1' },
{ name: 'V600 {excluding V600E}', name_uuid: '2' },
{ name: 'V600 {excluding V600G}', name_uuid: '3' },
{ name: 'V600E, V600G', name_uuid: '3' },
];
const vusList: { [uuid: string]: Partial<Vus> } = {
0: { name: 'VUS2' },
1: { name: 'VUS3' },
};

it('should match names by alteration when no options specified', () => {
const expectedDuplicateMutations: DuplicateMutationInfo[] = [
{
duplicate: 'V600',
inMutationList: true,
inVusList: false,
},
{
duplicate: 'VUS3',
inMutationList: false,
inVusList: true,
},
];

const duplicateMutations = getDuplicateMutations(currentMutations, mutationList as readonly Mutation[], vusList as VusObjList, {});
expect(duplicateMutations).toEqual(expectedDuplicateMutations);
});

it('should match names exactly when useFullAlterationName is true', () => {
const expectedDuplicateMutations: DuplicateMutationInfo[] = [
{
duplicate: 'V600',
inMutationList: true,
inVusList: false,
},
{
duplicate: 'V600 {excluding V600E}',
inMutationList: true,
inVusList: false,
},
{
duplicate: 'VUS3',
inMutationList: false,
inVusList: true,
},
];

const duplicateMutations = getDuplicateMutations(currentMutations, mutationList as readonly Mutation[], vusList as VusObjList, {
useFullAlterationName: true,
});
expect(duplicateMutations).toEqual(expectedDuplicateMutations);
});

it('should leave string mutations concatenated when exact is specified', () => {
const expectedDuplicateMutations: DuplicateMutationInfo[] = [
{
duplicate: 'V600E, V600G',
inMutationList: true,
inVusList: false,
},
];

const duplicateMutations = getDuplicateMutations(['V600E', 'V600G'], mutationList as readonly Mutation[], vusList as VusObjList, {
exact: true,
});
expect(duplicateMutations).toEqual(expectedDuplicateMutations);
});

it('should split mutations by comma when exact is not specified', () => {
const expectedDuplicateMutations: DuplicateMutationInfo[] = [
{
duplicate: 'V600E',
inMutationList: true,
inVusList: false,
},
{
duplicate: 'V600G',
inMutationList: true,
inVusList: false,
},
];
const duplicateMutations = getDuplicateMutations(
['V600E', 'V600G'],
mutationList as readonly Mutation[],
vusList as VusObjList,
{},
);
expect(duplicateMutations).toEqual(expectedDuplicateMutations);
});
});
});
});
21 changes: 21 additions & 0 deletions src/main/webapp/app/shared/util/test-id-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,24 @@ export enum CollapsibleDataTestIdType {
export function getCollapsibleDataTestId(dataTestid: CollapsibleDataTestIdType, identifier: string | undefined) {
return `${identifier}-${dataTestid}`;
}

export enum AddMutationModalFieldTestIdType {
ALTERATION = 'alteration',
NAME = 'name',
COMMENT = 'comment',
}

export function getAddMuationModalFieldDataTestId(
dataTestId: AddMutationModalFieldTestIdType,
alterationIndex: number,
excludingIndex: number | undefined,
) {
return `${dataTestId}-${alterationIndex}-${excludingIndex};`;
}

export function getTabDataTestId(index: number, prefix?: string) {
if (prefix) {
return `${prefix}-tab-${index}`;
}
return `${prefix}-tab-${index}`;
}
44 changes: 44 additions & 0 deletions src/test/javascript/data/api-annotate-alterations-v600g.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
[
{
"entity": {
"id": null,
"type": "PROTEIN_CHANGE",
"name": "V600G",
"alteration": "V600G",
"proteinChange": "V600G",
"start": 600,
"end": 600,
"refResidues": "V",
"variantResidues": "G",
"flags": [],
"genes": [{ "id": 41135, "entrezGeneId": 673, "hugoSymbol": "BRAF", "hgncId": "1097" }],
"transcripts": [],
"consequence": {
"id": 16,
"term": "MISSENSE_VARIANT",
"name": "Missense Variant",
"isGenerallyTruncating": false,
"description": "A sequence variant, that changes one or more bases, resulting in a different amino acid sequence but where the length is preserved"
},
"associations": []
},
"message": "",
"type": "OK",
"queryId": "V600G",
"annotation": {
"hotspot": {
"associatedHotspots": [
{ "type": "HOTSPOT_V1", "alteration": "V600" },
{ "type": "THREE_D", "alteration": "V600" },
{ "type": "HOTSPOT_V1", "alteration": "V600" },
{ "type": "THREE_D", "alteration": "V600" }
],
"hotspot": true
},
"exons": [{ "range": { "start": 581, "end": 620 }, "exon": 15 }]
},
"warning": false,
"ok": true,
"error": false
}
]
5 changes: 4 additions & 1 deletion src/test/javascript/setup-mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@ const DATA_DIR = 'src/test/javascript/data/';

const getAlterationMockResponse = (requestBody: string, readFile = true) => {
const body = JSON.parse(requestBody);
const alterationName = body[0]?.alteration?.alteration?.toLowerCase();
const alterationName: string = body[0]?.alteration?.alteration?.toLowerCase();
let filePath = `${DATA_DIR}api-annotate-alterations-`;
switch (alterationName) {
case 'v600e':
filePath += alterationName;
break;
case 'v600g':
filePath += alterationName;
break;
default:
break;
}
Expand Down
8 changes: 5 additions & 3 deletions src/test/javascript/shared/utils.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import { ADD_MUTATION_MODAL_INPUT_ID, DEFAULT_ADD_MUTATION_MODAL_ID } from '../../../main/webapp/app/config/constants/html-id';

export const createMutationOnCurationPage = async (mutationName: string) => {
export const addMutationInAddMutationModal = async (mutationName: string) => {
const mutationNameInput = await $(`input#${ADD_MUTATION_MODAL_INPUT_ID}`);
await mutationNameInput.setValue(mutationName);
await browser.keys('Enter');

const addMutationModal = await $(`div[id="${DEFAULT_ADD_MUTATION_MODAL_ID}"]`);
await addMutationModal.waitForDisplayed();
};

export const createMutationOnCurationPage = async (mutationName: string) => {
await addMutationInAddMutationModal(mutationName);

const modalConfirmBtn = await $('button=Confirm');
await modalConfirmBtn.click();

return { mutationNameInput, addMutationModal, modalConfirmBtn };
};
Loading