import { defineComponent } from 'vue' import { mount } from '@vue/test-utils' import { describe, it, expect, fn, afterEach, vi } from 'vitest' import { useAttrs } from '../use-attrs' const CLASS = 'a' const WIDTH = '50px' const TEST_KEY = 'test' const TEST_VALUE = 'fake' const ANOTHER_TEST_VALUE = 'fake1' const handleClick = fn() const genComp = ( inheritAttrs = true, excludeListeners = false, excludeKeys: string[] = [] ) => { return defineComponent({ inheritAttrs, props: {}, setup() { const attrs = useAttrs({ excludeListeners, excludeKeys }) return () => (
) }, }) } const _mount = (Comp: ReturnType) => { return mount({ setup() { return () => ( ) }, }) } describe('useAttrs', () => { afterEach(() => { vi.restoreAllMocks() }) it('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) }) it("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) }) it('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) }) it('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() }) })