import reducer, { setSelectedTab } from '../tab';
import * as actions from '../actions';
import { locationChanged } from 'utils/router';

describe('tab reducer', () => {
  it('selects the tab and adds it to history', () => {
    let state = reducer(undefined, setSelectedTab('srv', '#chan'));

    expect(state).toEqual({
      selected: { server: 'srv', name: '#chan' },
      history: [{ server: 'srv', name: '#chan' }]
    });

    state = reducer(state, setSelectedTab('srv', 'user1'));

    expect(state).toEqual({
      selected: { server: 'srv', name: 'user1' },
      history: [
        { server: 'srv', name: '#chan' },
        { server: 'srv', name: 'user1' }
      ]
    });
  });

  it('removes the tab from history on PART', () => {
    let state = reducer(undefined, setSelectedTab('srv', '#chan'));
    state = reducer(state, setSelectedTab('srv1', 'bob'));
    state = reducer(state, setSelectedTab('srv', '#chan'));
    state = reducer(state, setSelectedTab('srv', '#chan3'));

    state = reducer(state, {
      type: actions.PART,
      server: 'srv',
      channels: ['#chan']
    });

    expect(state).toEqual({
      selected: { server: 'srv', name: '#chan3' },
      history: [
        { server: 'srv1', name: 'bob' },
        { server: 'srv', name: '#chan3' }
      ]
    });
  });

  it('removes the tab from history on CLOSE_PRIVATE_CHAT', () => {
    let state = reducer(undefined, setSelectedTab('srv', '#chan'));
    state = reducer(state, setSelectedTab('srv1', 'bob'));
    state = reducer(state, setSelectedTab('srv', '#chan'));
    state = reducer(state, setSelectedTab('srv', '#chan3'));

    state = reducer(state, {
      type: actions.CLOSE_PRIVATE_CHAT,
      server: 'srv1',
      nick: 'bob'
    });

    expect(state).toEqual({
      selected: { server: 'srv', name: '#chan3' },
      history: [
        { server: 'srv', name: '#chan' },
        { server: 'srv', name: '#chan' },
        { server: 'srv', name: '#chan3' }
      ]
    });
  });

  it('removes all tabs related to server from history on DISCONNECT', () => {
    let state = reducer(undefined, setSelectedTab('srv', '#chan'));
    state = reducer(state, setSelectedTab('srv1', 'bob'));
    state = reducer(state, setSelectedTab('srv', '#chan'));
    state = reducer(state, setSelectedTab('srv', '#chan3'));

    state = reducer(state, {
      type: actions.DISCONNECT,
      server: 'srv'
    });

    expect(state).toEqual({
      selected: { server: 'srv', name: '#chan3' },
      history: [{ server: 'srv1', name: 'bob' }]
    });
  });

  it('clears the tab when navigating to a non-tab page', () => {
    let state = reducer(undefined, setSelectedTab('srv', '#chan'));

    state = reducer(state, locationChanged('settings'));

    expect(state).toEqual({
      selected: {},
      history: [{ server: 'srv', name: '#chan' }]
    });
  });

  it('selects the tab and adds it to history when navigating to a tab', () => {
    const state = reducer(
      undefined,
      locationChanged('chat', {
        server: 'srv',
        name: '#chan'
      })
    );

    expect(state).toEqual({
      selected: { server: 'srv', name: '#chan' },
      history: [{ server: 'srv', name: '#chan' }]
    });
  });
});