Skip to content

Commit a9e9dd5

Browse files
authored
Merge pull request #98 from oslabs-beta/bryan/main-reducer-testing
Bryan/main reducer testing
2 parents c78fcd2 + e229080 commit a9e9dd5

File tree

7 files changed

+265
-5
lines changed

7 files changed

+265
-5
lines changed

package-lock.json

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package/react-time-travel-1.0.1.tgz

49.4 KB
Binary file not shown.

package/react-time-travel-1.0.4.tgz

54.2 KB
Binary file not shown.
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
/* eslint-disable max-len */
2+
import mainReducer from '../reducers/mainReducer';
3+
import {
4+
toggleMode, addNewSnapshots, initialConnect, setPort, emptySnapshots, changeView, changeSlider, moveBackward, moveForward, playForward, pause, startPlaying, importSnapshots, setTab, deleteTab,
5+
} from '../actions/actions';
6+
7+
8+
describe('mainReducer testing', () => {
9+
let state;
10+
let currentTab;
11+
beforeEach(() => {
12+
state = {
13+
tabs: {
14+
87: {
15+
snapshots: [1, 2, 3, 4],
16+
sliderIndex: 2,
17+
viewIndex: -1,
18+
mode: {
19+
paused: false,
20+
locked: false,
21+
persist: false,
22+
},
23+
intervalId: 87,
24+
playing: true,
25+
},
26+
75: {
27+
snapshots: [1, 2, 3, 4],
28+
sliderIndex: 3,
29+
viewIndex: -1,
30+
mode: {
31+
paused: false,
32+
locked: false,
33+
persist: false,
34+
},
35+
intervalId: 75,
36+
playing: false,
37+
},
38+
},
39+
currentTab: 87,
40+
port: {
41+
postMessage: () => {},
42+
},
43+
};
44+
45+
// eslint-disable-next-line prefer-destructuring
46+
currentTab = state.currentTab;
47+
});
48+
49+
describe('moveBackward', () => {
50+
it('should decrement sliderIndex by 1', () => {
51+
expect(mainReducer(state, moveBackward()).tabs[currentTab].sliderIndex).toEqual(1);
52+
expect(mainReducer(state, moveBackward()).tabs[currentTab].playing).toEqual(false);
53+
});
54+
it('should not decrement if sliderIndex is zero', () => {
55+
state.tabs[currentTab].sliderIndex = 0;
56+
const { sliderIndex } = mainReducer(state, moveBackward()).tabs[currentTab];
57+
expect(sliderIndex).toBe(0);
58+
});
59+
});
60+
61+
describe('moveForward', () => {
62+
it('should increment sliderIndex by 1', () => {
63+
expect(mainReducer(state, moveForward()).tabs[currentTab].sliderIndex).toEqual(3);
64+
expect(mainReducer(state, moveForward()).tabs[currentTab].playing).toEqual(false);
65+
});
66+
it('should not increment if sliderIndex at end', () => {
67+
state.tabs[currentTab].sliderIndex = 3;
68+
const { sliderIndex } = mainReducer(state, moveForward()).tabs[currentTab];
69+
expect(sliderIndex).toBe(3);
70+
});
71+
it('should not change playing if not coming from user', () => {
72+
const { playing } = mainReducer(state, playForward()).tabs[currentTab];
73+
expect(playing).toBe(true);
74+
});
75+
});
76+
77+
describe('changeView', () => {
78+
it('unselect view if same index was selected', () => {
79+
state.tabs[currentTab].viewIndex = 1;
80+
expect(mainReducer(state, changeView(1)).tabs[currentTab].viewIndex).toEqual(-1);
81+
});
82+
it('change viewIndex when unselected', () => {
83+
expect(mainReducer(state, changeView(2)).tabs[currentTab].viewIndex).toEqual(2);
84+
});
85+
});
86+
87+
describe('changeSlider', () => {
88+
it('should change sliderIndex', () => {
89+
expect(mainReducer(state, changeSlider(2)).tabs[currentTab].sliderIndex).toEqual(2);
90+
});
91+
});
92+
93+
describe('empty', () => {
94+
it('should empty snapshots except the first one', () => {
95+
expect(mainReducer(state, emptySnapshots()).tabs[currentTab].sliderIndex).toEqual(0);
96+
expect(mainReducer(state, emptySnapshots()).tabs[currentTab].viewIndex).toEqual(-1);
97+
expect(mainReducer(state, emptySnapshots()).tabs[currentTab].playing).toEqual(false);
98+
expect(mainReducer(state, emptySnapshots()).tabs[currentTab]
99+
.snapshots).toEqual(state.tabs[currentTab].snapshots.slice(0, 1));
100+
});
101+
});
102+
103+
describe('setPort', () => {
104+
it('should set port when connection', () => {
105+
expect(mainReducer(state, setPort('newPort')).port).toEqual('newPort');
106+
});
107+
});
108+
109+
describe('Import', () => {
110+
it('impoting file should replace snapshots of devtool', () => {
111+
expect(mainReducer(state, importSnapshots([100, 101])).tabs[currentTab].snapshots).toEqual([100, 101]);
112+
});
113+
});
114+
115+
describe('Toggle Mode', () => {
116+
it('clicking pause button should only change pause mode', () => {
117+
const { mode } = mainReducer(state, toggleMode('paused')).tabs[currentTab];
118+
expect(mode.paused).toBe(true);
119+
expect(mode.locked).toBe(false);
120+
expect(mode.persist).toBe(false);
121+
});
122+
it('clicking lock button should only change lock mode', () => {
123+
const { mode } = mainReducer(state, toggleMode('locked')).tabs[currentTab];
124+
expect(mode.paused).toBe(false);
125+
expect(mode.locked).toBe(true);
126+
expect(mode.persist).toBe(false);
127+
});
128+
it('clicking persist button should only change persist mode', () => {
129+
const { mode } = mainReducer(state, toggleMode('persist')).tabs[currentTab];
130+
expect(mode.paused).toBe(false);
131+
expect(mode.locked).toBe(false);
132+
expect(mode.persist).toBe(true);
133+
});
134+
it('undefined payload does nothing', () => {
135+
const { mode } = mainReducer(state, toggleMode('undefined')).tabs[currentTab];
136+
expect(mode.paused).toBe(false);
137+
expect(mode.locked).toBe(false);
138+
expect(mode.persist).toBe(false);
139+
});
140+
});
141+
142+
describe('slider pause', () => {
143+
it('should set playing to false and intervalId to null', () => {
144+
const playedTab = mainReducer(state, pause()).tabs[currentTab];
145+
expect(playedTab.playing).toBe(false);
146+
expect(playedTab.intervalId).toBe(null);
147+
});
148+
});
149+
150+
describe('slider play', () => {
151+
it('should set playing to true and intervalId to payload', () => {
152+
const playedTab = mainReducer(state, startPlaying(333)).tabs[currentTab];
153+
expect(playedTab.playing).toBe(true);
154+
expect(playedTab.intervalId).toBe(333);
155+
});
156+
});
157+
158+
describe('Initial Connect', () => {
159+
const newTab = {
160+
104: {
161+
snapshots: [1, 2, 3, 8],
162+
sliderIndex: 3,
163+
viewIndex: -1,
164+
mode: {
165+
paused: false,
166+
locked: false,
167+
persist: false,
168+
},
169+
intervalId: 912,
170+
playing: true,
171+
},
172+
};
173+
it('should add new tab', () => {
174+
const addedTab = mainReducer(state, initialConnect(newTab)).tabs[104];
175+
expect(addedTab).not.toBe(undefined);
176+
});
177+
it('should force some values to default', () => {
178+
const addedTab = mainReducer(state, initialConnect(newTab)).tabs[104];
179+
expect(addedTab.sliderIndex).toBe(0);
180+
expect(addedTab.viewIndex).toBe(-1);
181+
expect(addedTab.intervalId).toBe(null);
182+
expect(addedTab.playing).toBe(false);
183+
});
184+
it('snapshots should match the payload', () => {
185+
const addedTab = mainReducer(state, initialConnect(newTab)).tabs[104];
186+
expect(addedTab.snapshots).toEqual(newTab[104].snapshots);
187+
});
188+
it('if currentTab undefined currentTab becomes firstTab', () => {
189+
state.currentTab = undefined;
190+
const addedTab = mainReducer(state, initialConnect(newTab));
191+
expect(addedTab.currentTab).toBe(104);
192+
});
193+
});
194+
195+
describe('new snapshots', () => {
196+
const newSnapshots = {
197+
87: {
198+
snapshots: [1, 2, 3, 4, 5],
199+
sliderIndex: 2,
200+
viewIndex: -1,
201+
mode: {
202+
paused: false,
203+
locked: false,
204+
persist: false,
205+
},
206+
intervalId: 87,
207+
playing: true,
208+
},
209+
};
210+
it('update snapshots of corresponding tabId', () => {
211+
const updated = mainReducer(state, addNewSnapshots(newSnapshots));
212+
expect(updated.tabs[87].snapshots).toEqual(newSnapshots[87].snapshots);
213+
});
214+
it('should delete tabs that are deleted from background script', () => {
215+
const updated = mainReducer(state, addNewSnapshots(newSnapshots));
216+
expect(updated.tabs[75]).toBe(undefined);
217+
});
218+
it('if currentTab undefined currentTab becomes first Tab', () => {
219+
state.currentTab = undefined;
220+
const updated = mainReducer(state, addNewSnapshots(newSnapshots));
221+
expect(updated.currentTab).toBe(87);
222+
});
223+
});
224+
225+
describe('set_tab', () => {
226+
it('should set tab to payload', () => {
227+
const newCurrentTab = mainReducer(state, setTab(75)).currentTab;
228+
expect(newCurrentTab).toBe(75);
229+
});
230+
});
231+
232+
describe('delete_tab', () => {
233+
it('should delete only payload tab from state', () => {
234+
const afterDelete = mainReducer(state, deleteTab(75));
235+
expect(afterDelete.tabs[75]).toBe(undefined);
236+
expect(afterDelete.tabs[87]).not.toBe(undefined);
237+
});
238+
it('should change current tab if deleted tab matches current tab', () => {
239+
const afterDelete = mainReducer(state, deleteTab(87));
240+
expect(afterDelete.tabs[87]).toBe(undefined);
241+
expect(afterDelete.tabs[75]).not.toBe(undefined);
242+
expect(afterDelete.currentTab).toBe(75);
243+
});
244+
});
245+
246+
describe('default', () => {
247+
const action = {
248+
type: 'doesNotExist',
249+
payload: 'trigger',
250+
};
251+
it('if there are no match of action types, throw error', () => {
252+
try {
253+
mainReducer(state, action);
254+
} catch (err) {
255+
expect(err).toBeInstanceOf(Error);
256+
}
257+
});
258+
});
259+
});

src/app/containers/ButtonsContainer.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function ButtonsContainer() {
3939
snapshots,
4040
mode: { paused, locked, persist },
4141
} = tabs[currentTab];
42-
// const [{ snapshots, mode: { paused, locked, persist } }, dispatch] = useStoreContext();
42+
4343
return (
4444
<div className="buttons-container">
4545
<button className="pause-button" type="button" onClick={() => dispatch(toggleMode('paused'))}>

src/app/reducers/mainReducer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export default (state, action) => produce(state, draft => {
9292
actionText = 'setPersist';
9393
break;
9494
default:
95+
break;
9596
}
9697
port.postMessage({ action: actionText, payload: newMode, tabId: currentTab });
9798
break;

src/app/styles/layout/_headContainer.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
// removes min-height of dropdown and change it to 100%
5858
.css-yk16xz-control,
5959
.css-1pahdxg-control {
60-
min-height: 100%;
60+
min-height: initial;
61+
height: 100%;
6162
}
6263
}

0 commit comments

Comments
 (0)