import Affix from '..';
import Button from '../../button';
import { mount } from '@vue/test-utils';
const events = {};

const AffixMounter = {
  props: ['offsetBottom', 'offsetTop'],
  mounted() {
    this.$refs.container.addEventListener = jest.fn().mockImplementation((event, cb) => {
      events[event] = cb;
    });
  },
  methods: {
    getTarget() {
      return this.$refs.container;
    },
  },

  render() {
    return (
      <div
        style={{
          height: '100px',
          overflowY: 'scroll',
        }}
        ref="container"
      >
        <div
          className="background"
          style={{
            paddingTop: '60px',
            height: '300px',
          }}
        >
          <Affix target={() => this.$refs.container} ref="affix" {...{ props: this.$props }}>
            <Button type="primary">Fixed at the top of container</Button>
          </Affix>
        </div>
      </div>
    );
  },
};
describe('Affix Render', () => {
  let wrapper;
  beforeAll(() => {
    document.body.innerHTML = '';
    jest.useFakeTimers();
  });

  afterAll(() => {
    jest.useRealTimers();
  });
  const scrollTo = top => {
    wrapper.vm.$refs.affix.$refs.fixedNode.parentNode.getBoundingClientRect = jest.fn(() => {
      return {
        bottom: 100,
        height: 28,
        left: 0,
        right: 0,
        top: 50 - top,
        width: 195,
      };
    });
    wrapper.vm.$refs.container.scrollTop = top;
    events.scroll({
      type: 'scroll',
    });
    jest.runAllTimers();
  };
  it('Anchor render perfectly', () => {
    wrapper = mount(AffixMounter, { attachToDocument: true });
    jest.runAllTimers();

    scrollTo(0);
    expect(wrapper.vm.$refs.affix.affixStyle).toBe(null);

    scrollTo(100);
    expect(wrapper.vm.$refs.affix.affixStyle).not.toBe(null);

    scrollTo(0);
    expect(wrapper.vm.$refs.affix.affixStyle).toBe(null);
  });
  it('support offsetBottom', () => {
    wrapper = mount(AffixMounter, {
      attachToDocument: true,
      propsData: {
        offsetBottom: 0,
      },
    });

    jest.runAllTimers();

    scrollTo(0);
    expect(wrapper.vm.$refs.affix.affixStyle).not.toBe(null);

    scrollTo(100);
    expect(wrapper.vm.$refs.affix.affixStyle).toBe(null);

    scrollTo(0);
    expect(wrapper.vm.$refs.affix.affixStyle).not.toBe(null);
  });

  it('updatePosition when offsetTop changed', () => {
    wrapper = mount(AffixMounter, {
      attachToDocument: true,
      propsData: {
        offsetTop: 0,
      },
    });

    jest.runAllTimers();

    scrollTo(100);
    expect(wrapper.vm.$refs.affix.affixStyle.top).toBe('0px');
    wrapper.setProps({
      offsetTop: 10,
    });
    jest.runAllTimers();
    expect(wrapper.vm.$refs.affix.affixStyle.top).toBe('10px');
  });
});