import Button from 'packages/button';
import VanLoading from 'packages/loading';
import { mount } from 'avoriaz';

describe('Button', () => {
  let wrapper;

  afterEach(() => {
    wrapper && wrapper.destroy();
  });

  it('create a simple button', () => {
    wrapper = mount(Button);

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--default')).to.be.true;
    expect(wrapper.hasClass('van-button--normal')).to.be.true;

    const eventStub = sinon.stub(wrapper.vm, '$emit');
    wrapper.trigger('click');

    expect(eventStub.calledOnce).to.be.true;
    expect(eventStub.calledWith('click')).to.be.true;
  });

  it('create a primary button', () => {
    wrapper = mount(Button, {
      propsData: {
        type: 'primary'
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--primary')).to.be.true;
  });

  it('create a danger button', () => {
    wrapper = mount(Button, {
      propsData: {
        type: 'danger'
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--danger')).to.be.true;
  });

  it('create a large button', () => {
    wrapper = mount(Button, {
      propsData: {
        size: 'large'
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--large')).to.be.true;
  });

  it('create a small button', () => {
    wrapper = mount(Button, {
      propsData: {
        size: 'small'
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--small')).to.be.true;
  });

  it('create a mini button', () => {
    wrapper = mount(Button, {
      propsData: {
        size: 'mini'
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--mini')).to.be.true;
  });

  it('create a block button', () => {
    wrapper = mount(Button, {
      propsData: {
        block: true
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--block')).to.be.true;
  });

  it('create a bottom action button', () => {
    wrapper = mount(Button, {
      propsData: {
        bottomAction: true
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--bottom-action')).to.be.true;
  });

  it('create a disabled button', () => {
    wrapper = mount(Button, {
      propsData: {
        disabled: true
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--disabled')).to.be.true;

    const eventStub = sinon.stub(wrapper.vm, '$emit');
    wrapper.trigger('click');

    expect(eventStub.called).to.be.false;
  });

  it('create a loading button', () => {
    wrapper = mount(Button, {
      propsData: {
        loading: true
      }
    });
    const loading = wrapper.find(VanLoading)[0];

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(loading.isVueComponent).to.be.true;

    const eventStub = sinon.stub(wrapper.vm, '$emit');
    wrapper.trigger('click');

    expect(eventStub.called).to.be.false;
  });

  it('create a primary loading button', () => {
    wrapper = mount(Button, {
      propsData: {
        type: 'primary',
        loading: true
      }
    });

    expect(wrapper.hasClass('van-button')).to.be.true;
    expect(wrapper.hasClass('van-button--primary')).to.be.true;

    const loading = wrapper.find(VanLoading)[0];
    expect(loading.isVueComponent).to.be.true;
  });
});