// Copyright 2015-2017 Parity Technologies (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity.  If not, see <http://www.gnu.org/licenses/>.

import { shallow } from 'enzyme';
import React from 'react';
import sinon from 'sinon';

import { createApi } from './node.test.js';
import Node from './';

let component;
let instance;

function render (props = {}) {
  component = shallow(
    <Node { ...props } />,
    { context: { api: createApi() } }
  );
  instance = component.instance();
  // console.log(component.debug());

  return component;
}

describe('views/Settings/Node', () => {
  beforeEach(() => {
    render();
    sinon.spy(instance.store, 'loadMode');
    sinon.spy(instance.store, 'loadChain');
  });

  afterEach(() => {
    instance.store.loadMode.restore();
    instance.store.loadChain.restore();
  });

  it('renders defaults', () => {
    expect(component).to.be.ok;
  });

  describe('componentWillMount', () => {
    beforeEach(() => {
      return instance.componentWillMount();
    });

    it('loads the mode in the store', () => {
      expect(instance.store.loadMode).to.have.been.called;
    });

    it('loads the chain in the store', () => {
      expect(instance.store.loadChain).to.have.been.called;
    });
  });

  describe('components', () => {
    it('renders a Container component', () => {
      expect(component.find('Container')).to.have.length(1);
    });

    it('renders a LanguageSelector component', () => {
      expect(component.find('LanguageSelector')).to.have.length(1);
    });

    it('renders a Features component', () => {
      expect(component.find('LanguageSelector')).to.have.length(1);
    });
  });

  describe('Parity features', () => {
    describe('mode selector', () => {
      let select;

      beforeEach(() => {
        select = component.find('Dropdown[id="parityModeSelect"]');
        sinon.spy(instance.store, 'changeMode');
      });

      afterEach(() => {
        instance.store.changeMode.restore();
      });

      it('renders a mode selector', () => {
        expect(select).to.have.length(1);
      });
    });

    describe('chain selector', () => {
      let select;

      beforeEach(() => {
        select = component.find('Dropdown[id="parityChainSelect"]');
        sinon.spy(instance.store, 'changeChain');
      });

      afterEach(() => {
        instance.store.changeChain.restore();
      });

      it('renders a chain selector', () => {
        expect(select).to.have.length(1);
      });
    });
  });
});
