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'); }); });