Unit testing for Node.js / Redux using Jest
// State Management
const createStore = require('redux').createStore;
const applyMiddleware = require('redux').applyMiddleware;
const thunk = require('redux-thunk').default;
const reducers = require('../reducers');
// Actions/Operations
const activateDriver = require('../actions/driverActions').activateDriver;
const banDriver = require('../actions/driverActions').banDriver;
const processRide = require('../actions/driverActions').processRide;
// Input test cases
const newDriver = {
driverId: 'driver-1',
name: 'test',
car: 'Lambo',
};
const ride1Start = {
ride: {
id: "ride-1",
user: "user-1",
estimatedKm: 12,
etaMinutes: 25,
estimatedPrice: 45,
status: "start"
},
driver: "driver-1"
};
const ride1Finish = {
ride: {
id: "ride-1",
user: "user-1",
estimatedKm: 12,
etaMinutes: 25,
estimatedPrice: 45,
status: "finished",
km: 13,
minutes: 20,
price: 38
},
driver: "driver-1"
};
const ride2Start = {
ride: {
id: "ride-2",
user: "user-2",
estimatedKm: 12,
etaMinutes: 25,
estimatedPrice: 45,
status: "start"
},
driver: "driver-1"
};
const ride2Finish = {
ride: {
id: "ride-2",
user: "user-2",
estimatedKm: 12,
etaMinutes: 25,
estimatedPrice: 45,
status: "finished",
km: 13,
minutes: 20,
price: 38
},
driver: "driver-1"
};
describe('Activate driver', () => {
test('activate driver', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: false,
currentRide: null,
violations: [],
}
]
};
store.dispatch(activateDriver(newDriver));
expect(store.getState()).toEqual(expectedState);
});
test('activate driver two times', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: false,
currentRide: null,
violations: ['driver-already-created']
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(activateDriver(newDriver));
expect(store.getState()).toEqual(expectedState);
});
});
describe('Ban driver', () => {
test('ban activated driver', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'banned',
onRide: false,
currentRide: null,
violations: [],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(banDriver(newDriver.driverId));
expect(store.getState()).toEqual(expectedState);
});
test('ban activated driver on ride', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: true,
currentRide: 'ride-1',
violations: ['driver-on-ride'],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(processRide(newDriver.driverId, ride1Start.ride));
store.dispatch(banDriver(newDriver.driverId));
expect(store.getState()).toEqual(expectedState);
});
test('ban banned driver', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'banned',
onRide: false,
currentRide: null,
violations: ['driver-already-banned'],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(banDriver(newDriver.driverId));
store.dispatch(banDriver(newDriver.driverId));
expect(store.getState()).toEqual(expectedState);
});
});
describe('Accept a ride', () => {
test('activated driver accepts a ride', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: true,
currentRide: 'ride-1',
violations: [],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(processRide(newDriver.driverId, ride1Start.ride));
expect(store.getState()).toEqual(expectedState);
});
test('activated driver on ride accepts a ride', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: true,
currentRide: 'ride-1',
violations: ['driver-on-ride'],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(processRide(newDriver.driverId, ride1Start.ride));
store.dispatch(processRide(newDriver.driverId, ride2Start.ride));
expect(store.getState()).toEqual(expectedState);
});
test('banned driver accepts a ride', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'banned',
onRide: false,
currentRide: null,
violations: ['driver-banned'],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(banDriver(newDriver.driverId));
store.dispatch(processRide(newDriver.driverId, ride1Start.ride));
expect(store.getState()).toEqual(expectedState);
});
});
describe('Finish a ride', () => {
test('activated driver on ride-1 finishes ride-1', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: false,
currentRide: null,
violations: [],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(processRide(newDriver.driverId, ride1Start.ride));
store.dispatch(processRide(newDriver.driverId, ride1Finish.ride));
expect(store.getState()).toEqual(expectedState);
});
test('activated driver finishes a ride', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: false,
currentRide: null,
violations: ['ride-was-never-started'],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(processRide(newDriver.driverId, ride1Finish.ride));
expect(store.getState()).toEqual(expectedState);
});
test('activated driver on ride-1 finishes ride-2', () => {
const store = createStore(reducers, applyMiddleware(thunk));
const expectedState = {
drivers: [
{
driver: 'driver-1',
name: 'test',
car: 'Lambo',
status: 'activated',
onRide: true,
currentRide: 'ride-1',
violations: ['ride-was-never-started'],
}
]
};
store.dispatch(activateDriver(newDriver));
store.dispatch(processRide(newDriver.driverId, ride1Start.ride));
store.dispatch(processRide(newDriver.driverId, ride2Finish.ride));
expect(store.getState()).toEqual(expectedState);
});
});