import { beforeEach, describe, expect, it } from 'vitest' import { mount } from '@vue/test-utils' import type { VueWrapper } from '@vue/test-utils' import { defineComponent } from 'vue' import BCarousel from '@components/carousel/Carousel.vue' import BCarouselItem from '@components/carousel/CarouselItem.vue' type BCarouselInstance = InstanceType type BCarouselItemInstance = InstanceType const WrapperComp = defineComponent({ components: { BCarousel, BCarouselItem }, props: { // to indirectly change BCarousel's animated prop animated: { type: String, default: 'slide' } }, template: ` ` }) let wrapper: VueWrapper let wrapperParent: VueWrapper> let wrapperCarousel: VueWrapper describe('BCarouselItem', () => { beforeEach(() => { wrapperParent = mount(WrapperComp) wrapperCarousel = wrapperParent.findComponent({ ref: 'carousel' }) wrapper = wrapperParent.findComponent({ ref: 'testItem' }) }) it('is called', () => { expect(wrapper.vm).toBeTruthy() expect(wrapper.vm.$options.name).toBe('BCarouselItem') }) it('render correctly', () => { expect(wrapper.html()).toMatchSnapshot() }) it('computes its position correctly', () => { expect(wrapper.vm.index).toBe(1) }) it('transition correctly', async () => { wrapperCarousel.vm.changeActive(2) expect(wrapper.vm.transition).toBe('slide-prev') wrapperCarousel.vm.changeActive(0) expect(wrapper.vm.transition).toBe('slide-next') await wrapperParent.setProps({ animated: 'fade' }) wrapperCarousel.vm.changeActive(0) expect(wrapper.vm.transition).toBe('fade') }) it('update active state', () => { expect(wrapper.vm.isActive).toBe(false) wrapperCarousel.vm.changeActive(1) expect(wrapper.vm.isActive).toBe(true) wrapperCarousel.vm.changeActive(2) expect(wrapper.vm.isActive).toBe(false) }) describe('with explicit order', () => { let wrapperCarousel: VueWrapper let wrapperTestItem: VueWrapper beforeEach(() => { const wrapper = mount({ template: ` `, components: { BCarousel, BCarouselItem } }) wrapperCarousel = wrapper.findComponent({ ref: 'carousel' }) wrapperTestItem = wrapper.findComponent({ ref: 'testItem' }) }) it('update active state', () => { expect(wrapperTestItem.vm.isActive).toBe(false) wrapperCarousel.vm.changeActive(1) expect(wrapperTestItem.vm.isActive).toBe(true) wrapperCarousel.vm.changeActive(2) expect(wrapperTestItem.vm.isActive).toBe(false) }) }) })