| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- import { describe, it, expect, vi, beforeEach } from 'vitest'
- import { mount } from '@vue/test-utils'
- import VideoPlayer from '@/components/VideoPlayer.vue'
- // Mock hls.js
- vi.mock('hls.js', () => ({
- default: class MockHls {
- static isSupported() {
- return true
- }
- static Events = {
- MANIFEST_PARSED: 'hlsManifestParsed',
- ERROR: 'hlsError'
- }
- static ErrorTypes = {
- NETWORK_ERROR: 'networkError',
- MEDIA_ERROR: 'mediaError'
- }
- loadSource = vi.fn()
- attachMedia = vi.fn()
- on = vi.fn()
- destroy = vi.fn()
- startLoad = vi.fn()
- recoverMediaError = vi.fn()
- }
- }))
- describe('VideoPlayer', () => {
- beforeEach(() => {
- vi.clearAllMocks()
- })
- describe('Native Video Player', () => {
- it('should render native video element by default', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(wrapper.find('video').exists()).toBe(true)
- expect(wrapper.find('video').attributes('src')).toBe('https://example.com/video.mp4')
- })
- it('should pass controls prop to video element', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native',
- controls: true
- }
- })
- expect(wrapper.find('video').attributes('controls')).toBeDefined()
- })
- it('should pass autoplay prop to video element', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native',
- autoplay: true
- }
- })
- expect(wrapper.find('video').attributes('autoplay')).toBeDefined()
- })
- it('should pass muted prop to video element', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native',
- muted: true
- }
- })
- expect(wrapper.find('video').attributes('muted')).toBeDefined()
- })
- it('should pass loop prop to video element', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native',
- loop: true
- }
- })
- expect(wrapper.find('video').attributes('loop')).toBeDefined()
- })
- it('should pass poster prop to video element', () => {
- const poster = 'https://example.com/poster.jpg'
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native',
- poster
- }
- })
- expect(wrapper.find('video').attributes('poster')).toBe(poster)
- })
- })
- describe('Cloudflare Stream Player', () => {
- it('should render iframe for cloudflare player type', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- videoId: 'test-video-id',
- playerType: 'cloudflare'
- }
- })
- expect(wrapper.find('iframe').exists()).toBe(true)
- })
- it('should generate correct iframe src', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- videoId: 'test-video-id',
- playerType: 'cloudflare',
- customerDomain: 'example.cloudflarestream.com'
- }
- })
- const iframeSrc = wrapper.find('iframe').attributes('src')
- expect(iframeSrc).toContain('https://example.cloudflarestream.com/test-video-id/iframe')
- })
- it('should include autoplay in iframe src when enabled', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- videoId: 'test-video-id',
- playerType: 'cloudflare',
- autoplay: true
- }
- })
- const iframeSrc = wrapper.find('iframe').attributes('src')
- expect(iframeSrc).toContain('autoplay=true')
- })
- it('should include muted in iframe src when enabled', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- videoId: 'test-video-id',
- playerType: 'cloudflare',
- muted: true
- }
- })
- const iframeSrc = wrapper.find('iframe').attributes('src')
- expect(iframeSrc).toContain('muted=true')
- })
- it('should include loop in iframe src when enabled', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- videoId: 'test-video-id',
- playerType: 'cloudflare',
- loop: true
- }
- })
- const iframeSrc = wrapper.find('iframe').attributes('src')
- expect(iframeSrc).toContain('loop=true')
- })
- })
- describe('HLS Player', () => {
- it('should render video element for HLS player type', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/stream.m3u8',
- playerType: 'hls'
- }
- })
- expect(wrapper.find('video').exists()).toBe(true)
- })
- })
- describe('Default Props', () => {
- it('should have default controls as true', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4'
- }
- })
- expect(wrapper.find('video').attributes('controls')).toBeDefined()
- })
- it('should have default muted as true', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4'
- }
- })
- expect(wrapper.find('video').attributes('muted')).toBeDefined()
- })
- it('should have default playerType as native', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4'
- }
- })
- // Should render video element directly, not iframe
- expect(wrapper.find('video').exists()).toBe(true)
- expect(wrapper.find('iframe').exists()).toBe(false)
- })
- })
- describe('Exposed Methods', () => {
- it('should expose play method', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(typeof wrapper.vm.play).toBe('function')
- })
- it('should expose pause method', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(typeof wrapper.vm.pause).toBe('function')
- })
- it('should expose stop method', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(typeof wrapper.vm.stop).toBe('function')
- })
- it('should expose setVolume method', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(typeof wrapper.vm.setVolume).toBe('function')
- })
- it('should expose setMuted method', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(typeof wrapper.vm.setMuted).toBe('function')
- })
- it('should expose screenshot method', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(typeof wrapper.vm.screenshot).toBe('function')
- })
- it('should expose fullscreen method', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4',
- playerType: 'native'
- }
- })
- expect(typeof wrapper.vm.fullscreen).toBe('function')
- })
- })
- describe('Wrapper Element', () => {
- it('should have video-player-wrapper class', () => {
- const wrapper = mount(VideoPlayer, {
- props: {
- src: 'https://example.com/video.mp4'
- }
- })
- expect(wrapper.find('.video-player-wrapper').exists()).toBe(true)
- })
- })
- })
|