diff --git a/src/components/DxhCarousel.vue b/src/components/DxhCarousel.vue new file mode 100644 index 0000000..d6f03bb --- /dev/null +++ b/src/components/DxhCarousel.vue @@ -0,0 +1,150 @@ + + + diff --git a/src/components/__tests__/DxhCarousel.spec.ts b/src/components/__tests__/DxhCarousel.spec.ts new file mode 100644 index 0000000..153fc9f --- /dev/null +++ b/src/components/__tests__/DxhCarousel.spec.ts @@ -0,0 +1,67 @@ +import { describe, it, expect } from 'vitest' +import { mount } from '@vue/test-utils' +import DxhCarousel from '@/components/DxhCarousel.vue' + +describe('DxhCarousel.vue', () => { + it('renders carousel with images', async () => { + const items = [ + { id: 1, title: 'Image 1', src: 'image1.jpg' }, + { id: 2, title: 'Image 2', src: 'image2.jpg' }, + { id: 3, title: 'Image 3', src: 'image3.jpg' } + ] + + const wrapper = mount(DxhCarousel, { + props: { + items, + autoplay: false, + showArrows: true, + dots: true, + autoplaySpeed: 5000, + maxWidth: 600, + maxHeight: 400 + } + }) + + const carousel = wrapper.find('[data-test="carousel"]') + expect(carousel.exists()).toBe(true) + + const carouselImages = carousel.findAll('[data-test="carousel-item"] img') + expect(carouselImages.length).toBe(items.length) + + const prevArrow = wrapper.find('[data-test="prev-arrow"]') + const nextArrow = wrapper.find('[data-test="next-arrow"]') + expect(prevArrow.exists()).toBe(true) + expect(nextArrow.exists()).toBe(true) + + const dots = wrapper.findAll('[data-test="dot"]') + expect(dots.length).toBe(items.length) + }) + + it('stops autoplay on mouseenter and resumes on mouseleave', async () => { + const items = [ + { id: 1, title: 'Image 1', src: 'image1.jpg' }, + { id: 2, title: 'Image 2', src: 'image2.jpg' }, + { id: 3, title: 'Image 3', src: 'image3.jpg' } + ] + + const wrapper = mount(DxhCarousel, { + props: { + items, + autoplay: true, + showArrows: false, + dots: false, + autoplaySpeed: 5000, + maxWidth: 600, + maxHeight: 400 + } + }) + + await new Promise((resolve) => setTimeout(resolve, 3000)) + + await wrapper.trigger('mouseenter') + expect(wrapper.vm.autoplayInterval).not.toBe(null) + + await wrapper.trigger('mouseleave') + expect(wrapper.vm.autoplayInterval).not.toBe(null) + }) +}) diff --git a/src/index.ts b/src/index.ts index ee2ff8d..f73a4d6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ -import DButton from "./components/DButton.vue" -import DInput from "./components/DInput.vue" +import DButton from './components/DButton.vue' +import DInput from './components/DInput.vue' +import DxhCarousel from './components/DxhCarousel.vue' -export default {DButton, DInput} \ No newline at end of file +export default { DButton, DInput, DxhCarousel }