import { EPersonMock } from '../../../shared/testing/eperson-mock';
import { EPeopleRegistryCancelEPersonAction, EPeopleRegistryEditEPersonAction } from './epeople-registry.actions';
import { ePeopleRegistryReducer, EPeopleRegistryState } from './epeople-registry.reducers';

const initialState: EPeopleRegistryState = {
  editEPerson: null,
};

const editState: EPeopleRegistryState = {
  editEPerson: EPersonMock,
};

class NullAction extends EPeopleRegistryEditEPersonAction {
  type = null;

  constructor() {
    super(undefined);
  }
}

describe('epeopleRegistryReducer', () => {

  it('should return the current state when no valid actions have been made', () => {
    const state = initialState;
    const action = new NullAction();
    const newState = ePeopleRegistryReducer(state, action);

    expect(newState).toEqual(state);
  });

  it('should start with an initial state', () => {
    const state = initialState;
    const action = new NullAction();
    const initState = ePeopleRegistryReducer(undefined, action);

    expect(initState).toEqual(state);
  });

  it('should update the current state to change the editEPerson to a new eperson when EPeopleRegistryEditEPersonAction is dispatched', () => {
    const state = editState;
    const action = new EPeopleRegistryEditEPersonAction(EPersonMock);
    const newState = ePeopleRegistryReducer(state, action);

    expect(newState.editEPerson).toEqual(EPersonMock);
  });

  it('should update the current state to remove the editEPerson from the state when EPeopleRegistryCancelEPersonAction is dispatched', () => {
    const state = editState;
    const action = new EPeopleRegistryCancelEPersonAction();
    const newState = ePeopleRegistryReducer(state, action);

    expect(newState.editEPerson).toEqual(null);
  });
});