Skip to content

Commit 15fffa2

Browse files
committed
Code clean and explanation page tests
1 parent c36f83b commit 15fffa2

30 files changed

+598
-1343
lines changed

src/__tests__/components/chart/ControlledRadarChartCard.test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ it('renders', () => {
1515
expect(element.find(SelectField).length).toBe(2);
1616

1717
expect(element.find(SelectField).at(0).props().menuItems.length).toBeGreaterThanOrEqual(1);
18+
expect(element.find(SelectField).at(0).props().menuItems).toContain('average');
1819
expect(element.find(SelectField).at(1).props().menuItems.length).toBeGreaterThanOrEqual(1);
20+
expect(element.find(SelectField).at(1).props().menuItems).toContain('All');
1921
});
2022

2123
it('maps jobs to chart', () => {
@@ -41,3 +43,4 @@ it('when updating', () => {
4143
expect(Math.max(...radarChartProps.data[0].data)).toBeLessThanOrEqual(1);
4244
expect(Math.min(...radarChartProps.data[0].data)).toBeGreaterThanOrEqual(0);
4345
});
46+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React from 'react';
2+
import {shallow} from 'enzyme';
3+
import ReactApexChart from 'react-apexcharts';
4+
import HorizontalBarChartCard from '../../../components/chart/HorizontalBarChartCard';
5+
6+
const labels = ['event', 'event1', 'event2', 'event3', 'event4'];
7+
const values = [1, 0.8, 0.1, 0.3, 0];
8+
9+
describe('HorizontalBarChartCard', () => {
10+
it('renders with empty data', () => {
11+
const element = shallow(<HorizontalBarChartCard data={[]} labels={[]}/>);
12+
expect(element).toBeDefined();
13+
expect(element.find(ReactApexChart).length).toBe(0);
14+
});
15+
16+
it('renders with empty labels', () => {
17+
const element = shallow(<HorizontalBarChartCard data={values} labels={[]}/>);
18+
expect(element).toBeDefined();
19+
expect(element.find(ReactApexChart).length).toBe(1);
20+
21+
const chartProps = element.find(ReactApexChart).props();
22+
expect(chartProps.options.xaxis.categories.length).toBe(0);
23+
expect(chartProps.series[0].data.length).toBe(5);
24+
});
25+
26+
it('renders with non empty data and label', () => {
27+
const element = shallow(<HorizontalBarChartCard data={values} labels={labels}/>);
28+
expect(element).toBeDefined();
29+
expect(element.find(ReactApexChart).length).toBe(1);
30+
31+
const chartProps = element.find(ReactApexChart).props();
32+
expect(chartProps.options.xaxis.categories.length).toBe(5);
33+
expect(chartProps.series[0].data.length).toBe(5);
34+
});
35+
});

src/__tests__/components/chart/RadarChartCard.test.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,32 @@ const labels = ['f1_score', 'accuracy', 'precision', 'recall', 'auc'];
77
const values = [1, 0.8, 0.1, 0.3, 0];
88

99
describe('RadarChartCard', () => {
10-
it('renders', () => {
10+
it('renders with full data', () => {
1111
const element = shallow(<RadarChartCard data={values} labels={labels}/>);
1212
expect(element).toBeDefined();
13-
expect(element.find(ReactApexChart).length).toBe(1);
14-
});
15-
16-
it('maps and sorts data', () => {
17-
const element = shallow(<RadarChartCard data={values} labels={labels}/>);
1813
const chartProps = element.find(ReactApexChart).props();
14+
expect(element.find(ReactApexChart).length).toBe(1);
1915
expect(chartProps.options.labels.length).toBe(5);
2016
expect(chartProps.options.labels[0]).toEqual('f1_score');
2117
expect(chartProps.options.labels[4]).toEqual('auc');
18+
expect(chartProps.series).toEqual(values);
19+
});
20+
21+
it('renders without labels', () => {
22+
const element = shallow(<RadarChartCard data={values} labels={[]}/>);
23+
expect(element).toBeDefined();
24+
const chartProps = element.find(ReactApexChart).props();
25+
expect(element.find(ReactApexChart).length).toBe(1);
26+
expect(chartProps.options.labels.length).toBe(0);
27+
expect(chartProps.series).toEqual(values);
28+
});
29+
30+
it('renders without data', () => {
31+
const element = shallow(<RadarChartCard data={[]} labels={[]}/>);
32+
expect(element).toBeDefined();
33+
const chartProps = element.find(ReactApexChart).props();
34+
expect(element.find(ReactApexChart).length).toBe(1);
35+
expect(chartProps.options.labels.length).toBe(0);
36+
expect(chartProps.series).toEqual([]);
2237
});
2338
});
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import React from 'react';
2+
import {shallow} from 'enzyme';
3+
import FetchState from '../../../components/FetchState';
4+
import SelectField from 'react-md/lib/SelectFields';
5+
import ExplanationHeaderCard from '../../../components/explanation/ExplanationHeaderCard';
6+
import {CLASSIFICATION, LABELLING, REGRESSION, LINEAR, NO_CLUSTER} from '../../../reference';
7+
import LabelConfigTable from '../../../components/validation/LabelConfigTable';
8+
import {label1} from '../../../../stories/Advanced';
9+
10+
const fetchState = {
11+
inFlight: false
12+
};
13+
const splitChange = jest.fn();
14+
const jobChange = jest.fn();
15+
const splitLabels = [{value: 1, label: 'Split #1'}, {value: 2, label: 'Split #2'}];
16+
17+
const jobs = [{
18+
'config': {
19+
'clustering': {'clustering_method': NO_CLUSTER},
20+
'encoding': {},
21+
'evaluation': {},
22+
'hyperparameter_optimizer': {
23+
'use_hyperopt': true,
24+
'max_evals': 100,
25+
'performance_metric': 'acc'
26+
},
27+
'incremental_train': null,
28+
'labelling': label1,
29+
'predictive_model': {
30+
'model_path': 'cache/model_cache/job_2-split_4-predictive_model-prediction-v0.sav',
31+
'prediction_method': LINEAR,
32+
'predictive_model': REGRESSION
33+
},
34+
'split': {
35+
'id': 1,
36+
'splitting_method': 'strict_temporal',
37+
'test_log_path': 'cache/log_cache/80-100_1559742742743335.xes',
38+
'test_size': 0.2,
39+
'train_log_path': 'cache/log_cache/0-80_1559742738260318.xes',
40+
'type': 'double'
41+
},
42+
},
43+
'created_date': '2018-02-07T22:47:32.146583Z',
44+
'error': '',
45+
'id': 53,
46+
'modified_date': '2018-02-07T22:47:32.146583Z',
47+
'status': 'created',
48+
'type': 'prediction'
49+
}];
50+
describe('ExplanationHeaderCard', () => {
51+
it('renders', () => {
52+
const element = shallow(<ExplanationHeaderCard jobs={jobs}
53+
splitLabels={splitLabels}
54+
fetchState={fetchState}
55+
splitChange={splitChange}
56+
selectedSplitId={1}
57+
predictionMethod={REGRESSION}
58+
onClick={jest.fn()}
59+
jobChange={jobChange}
60+
jobId={53}/>);
61+
expect(element).toBeDefined();
62+
expect(element.find(LabelConfigTable).length).toBe(1);
63+
expect(element.find(FetchState).length).toBe(1);
64+
expect(element.find(SelectField).length).toBe(2);
65+
expect(element.find(SelectField).at(0).props().menuItems.length).toBe(splitLabels.length);
66+
expect(element.find(SelectField).at(0).props().menuItems).toBe(splitLabels);
67+
expect(element.find(SelectField).at(1).props().menuItems.length).toBe(1);
68+
});
69+
70+
it('empty jobs with classification method', () => {
71+
const element = shallow(<ExplanationHeaderCard jobs={[]}
72+
splitLabels={splitLabels}
73+
fetchState={fetchState}
74+
splitChange={splitChange}
75+
selectedSplitId={1}
76+
predictionMethod={CLASSIFICATION}
77+
onClick={jest.fn()}
78+
jobChange={jest.fn()}
79+
jobId={0}/>);
80+
expect(element).toBeDefined();
81+
expect(element.find(LabelConfigTable).length).toBe(1);
82+
expect(element.find(FetchState).length).toBe(1);
83+
expect(element.find(SelectField).length).toBe(2);
84+
expect(element.find(SelectField).at(0).props().menuItems.length).toBe(splitLabels.length);
85+
expect(element.find(SelectField).at(0).props().menuItems).toBe(splitLabels);
86+
expect(element.find(SelectField).at(1).props().menuItems.length).toBe(0);
87+
});
88+
89+
it('empty jobs with labelling method', () => {
90+
const element = shallow(<ExplanationHeaderCard jobs={[]}
91+
splitLabels={splitLabels}
92+
fetchState={fetchState}
93+
splitChange={splitChange}
94+
selectedSplitId={1}
95+
predictionMethod={LABELLING}
96+
onClick={jest.fn()}
97+
jobChange={jest.fn()}
98+
jobId={1}/>);
99+
expect(element).toBeDefined();
100+
expect(element.find(LabelConfigTable).length).toBe(1);
101+
expect(element.find(FetchState).length).toBe(1);
102+
expect(element.find(SelectField).length).toBe(2);
103+
expect(element.find(SelectField).at(0).props().menuItems.length).toBe(splitLabels.length);
104+
expect(element.find(SelectField).at(0).props().menuItems).toBe(splitLabels);
105+
expect(element.find(SelectField).at(1).props().menuItems.length).toBe(0);
106+
});
107+
108+
it('calls splitChange', () => {
109+
const element = shallow(<ExplanationHeaderCard jobs={jobs}
110+
splitLabels={splitLabels}
111+
fetchState={fetchState}
112+
splitChange={splitChange}
113+
selectedSplitId={1}
114+
predictionMethod={REGRESSION}
115+
onClick={jest.fn()}
116+
jobChange={jobChange}
117+
jobId={53}/>);
118+
element.find(SelectField).at(0).simulate('change', 'Split #2');
119+
expect(splitChange).toHaveBeenCalledWith('Split #2');
120+
});
121+
122+
it('calls jobChange', () => {
123+
const element = shallow(<ExplanationHeaderCard jobs={jobs}
124+
splitLabels={splitLabels}
125+
fetchState={fetchState}
126+
splitChange={splitChange}
127+
selectedSplitId={1}
128+
predictionMethod={REGRESSION}
129+
onClick={jest.fn()}
130+
jobChange={jobChange}
131+
jobId={53}/>);
132+
element.find(SelectField).at(1).simulate('change', '53');
133+
expect(jobChange).toHaveBeenCalledWith('53');
134+
});
135+
});
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
import {shallow} from 'enzyme';
3+
import SelectField from 'react-md/lib/SelectFields';
4+
import TraceExplanation from '../../../components/explanation/TraceExplanation';
5+
import TraceTable from '../../../components/explanation/TraceTable';
6+
import {traceList} from '../../../../stories/Explanation';
7+
8+
const traceIdList = ['1', '2'];
9+
const jobs = [];
10+
const traceChange = jest.fn();
11+
describe('TraceExplanation', () => {
12+
it('renders', () => {
13+
const element = shallow(<TraceExplanation jobs={jobs}
14+
traceChange={traceChange}
15+
traceIdList={traceIdList}
16+
selectedTrace={'1'}
17+
traceList={traceList}/>);
18+
expect(element).toBeDefined();
19+
expect(element.find(TraceTable).length).toBe(1);
20+
expect(element.find(SelectField).length).toBe(1);
21+
expect(element.find(SelectField).at(0).props().menuItems.length).toBe(traceIdList.length);
22+
expect(element.find(SelectField).at(0).props().menuItems).toBe(traceIdList);
23+
});
24+
25+
it('call select trace change', () => {
26+
const element = shallow(<TraceExplanation jobs={jobs}
27+
traceChange={traceChange}
28+
traceIdList={traceIdList}
29+
selectedTrace={'1'}
30+
traceList={traceList}/>);
31+
element.find(SelectField).at(0).simulate('change', '2');
32+
expect(traceChange).toHaveBeenCalledWith('2');
33+
});
34+
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import React from 'react';
2+
import {shallow} from 'enzyme';
3+
import TraceTable from '../../../components/explanation/TraceTable';
4+
import {getTraceAttributes} from '../../../util/dataReducers';
5+
import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index';
6+
import {traceList} from '../../../../stories/Explanation';
7+
8+
9+
const traceAttributes = getTraceAttributes(traceList, '00000912');
10+
const traceAttributesHeader = traceAttributes.traceAttributesHeader;
11+
const traceEventsHeaders = traceAttributes.traceEventsHeaders;
12+
const traceArr = traceAttributes.traceArr;
13+
14+
describe('TraceTable', () => {
15+
it('renders', () => {
16+
const element = shallow(<TraceTable
17+
traceAttributesHeader={traceAttributesHeader}
18+
traceEventsHeaders={traceEventsHeaders}
19+
traceArr={traceArr} />);
20+
expect(element).toBeDefined();
21+
expect(element.find(DataTable).length).toBe(2);
22+
23+
expect(element.find(DataTable).at(0).find(TableRow).length).toBe(2);
24+
expect(element.find(DataTable).at(0).find(TableHeader).find(TableRow).length).toBe(1);
25+
expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(1);
26+
expect(element.find(DataTable).at(0).find(TableBody).find(TableRow)
27+
.find(TableColumn).length).toBe(traceAttributesHeader.length);
28+
29+
expect(element.find(DataTable).at(1).find(TableRow).length).toBe(3);
30+
expect(element.find(DataTable).at(1).find(TableHeader).find(TableRow).length).toBe(1);
31+
expect(element.find(DataTable).at(1).find(TableBody).find(TableRow).length).toBe(2);
32+
expect(element.find(DataTable).at(1).find(TableBody).find(TableRow)
33+
.find(TableColumn).length).toBe(traceEventsHeaders.length * 2);
34+
35+
expect(element.find(TableRow).length).toBe(5);
36+
expect(element.find(TablePagination).length).toBe(1);
37+
});
38+
39+
it('no element', () => {
40+
const element = shallow(<TraceTable
41+
traceAttributesHeader={traceAttributesHeader}
42+
traceEventsHeaders={traceEventsHeaders}
43+
traceArr={{'attributes': [], 'events': []}} />);
44+
expect(element).toBeDefined();
45+
expect(element.find(DataTable).length).toBe(0);
46+
expect(element.find(TablePagination).length).toBe(0);
47+
expect(element.find(TableRow).length).toBe(0);
48+
});
49+
});
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import React from 'react';
2+
import {shallow} from 'enzyme';
3+
import PostHocExplanation from '../../../components/explanation/post_hoc';
4+
import HorizontalBarChartCard from '../../../components/chart/HorizontalBarChartCard';
5+
import {parseLimeResult} from '../../../util/dataReducers';
6+
import {limeList} from '../../../../stories/Explanation';
7+
8+
describe('TraceTable', () => {
9+
it('renders without data', () => {
10+
const element = shallow(<PostHocExplanation
11+
jobs={[]}
12+
limeValueList={[]}/>);
13+
expect(element).toBeDefined();
14+
expect(element.find(HorizontalBarChartCard).length).toBe(0);
15+
});
16+
17+
it('renders with data', () => {
18+
const element = shallow(<PostHocExplanation
19+
jobs={[]}
20+
limeValueList={parseLimeResult(limeList)}/>);
21+
expect(element).toBeDefined();
22+
expect(element.find(HorizontalBarChartCard).length).toBe(1);
23+
});
24+
});

src/__tests__/reducers/Lime.test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import lime from '../../reducers/Lime';
2+
import {limeValueListRequested, limeValueListRetrieved, limeValueListFailed} from '../../actions/LimeActions';
3+
import {limeList} from '../../../stories/Explanation';
4+
5+
6+
const initialState = {
7+
fetchState: {inFlight: false},
8+
limeValueList: {}
9+
};
10+
describe('LimeReducer', () => {
11+
it('has nothing initially', () => {
12+
expect(lime(undefined, {})).toEqual(initialState);
13+
});
14+
15+
describe('limeList', () => {
16+
const stateWithRequest = lime(undefined, limeValueListRequested());
17+
18+
it('changes fetchState when requesting', () => {
19+
expect(stateWithRequest.fetchState).toEqual({inFlight: true});
20+
});
21+
22+
it('changes fetchState when request completed', () => {
23+
const state2 = lime(stateWithRequest, limeValueListRetrieved(limeList));
24+
expect(state2.fetchState).toEqual({inFlight: false});
25+
});
26+
27+
it('changes fetchState when request failed', () => {
28+
const state2 = lime(stateWithRequest, limeValueListFailed('error'));
29+
expect(state2.fetchState).toEqual({inFlight: false, error: 'error'});
30+
});
31+
32+
it('puts lime into store', () => {
33+
const state2 = lime(stateWithRequest, limeValueListRetrieved(limeList));
34+
const {limeValueList} = state2;
35+
expect(limeValueList).toEqual(limeList);
36+
});
37+
});
38+
});

0 commit comments

Comments
 (0)