Skip to content

Instantly share code, notes, and snippets.

@eduardinni
Created January 10, 2020 01:06
Show Gist options
  • Save eduardinni/68fe065ae98e6bd0b637b5635efbd721 to your computer and use it in GitHub Desktop.
Save eduardinni/68fe065ae98e6bd0b637b5635efbd721 to your computer and use it in GitHub Desktop.

JavaScript testing

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);
  });
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment