import { mount } from '@vue/test-utils' import useAttrs from '../use-attrs' import type { ComponentOptions } from 'vue' const CLASS = 'a' const WIDTH = '50px' const TEST_KEY = 'test' const TEST_VALUE = 'fake' const ANOTHER_TEST_VALUE = 'fake1' const handleClick = jest.fn() const genComp = ( inheritAttrs = true, excludeListeners = false, excludeKeys: string[] = [], ) => { return { template: `
`, inheritAttrs, props: {}, setup() { const attrs = useAttrs({ excludeListeners, excludeKeys }) return { attrs, } }, } } const _mount = (Comp: ComponentOptions) => { return mount({ components: { Comp }, template: ` `, methods: { handleClick, }, }) } afterEach(() => { handleClick.mockClear() }) describe('useAttrs', () => { test('class and style should not bind to child node', async () => { const wrapper = _mount(genComp()) const container = wrapper.element as HTMLDivElement const span = wrapper.find('span') expect(wrapper.classes(CLASS)).toBe(true) expect(container.style.width).toBe(WIDTH) expect(span.classes(CLASS)).toBe(false) expect(span.element.style.width).toBe('') expect(span.attributes(TEST_KEY)).toBe(TEST_VALUE) await span.trigger('click') expect(handleClick).toBeCalledTimes(2) }) test('child node\'s attributes should update when prop change', async () => { const wrapper = _mount(genComp()) const span = wrapper.find('span') await wrapper.setProps({ [TEST_KEY]: ANOTHER_TEST_VALUE }) expect(span.attributes(TEST_KEY)).toBe(ANOTHER_TEST_VALUE) }) test('excluded listeners should not bind to child node', async () => { const wrapper = _mount(genComp(true, true)) const span = wrapper.find('span') await span.trigger('click') expect(handleClick).toBeCalledTimes(1) }) test('excluded attributes should not bind to child node', async () => { const wrapper = _mount(genComp(true, false, [TEST_KEY])) const span = wrapper.find('span') expect(span.attributes(TEST_KEY)).toBeUndefined() }) })