import React from 'react'
import { render, screen } from '@testing-library/react'
import { vi } from 'vitest'
import { VideoPlayer } from './VideoPlayer'
const matchMedia = {
media: '',
onchange: null,
addListener: vi.fn(),
removeListener: vi.fn(),
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
}
const mockPrefersReducedMotion = {
matches: true,
...matchMedia,
}
const mockDoesNotPreferReducedMotion = {
matches: false,
...matchMedia,
}
const mockPlay = vi.fn().mockResolvedValue(undefined)
const mockLoad = vi.fn()
const mockPause = vi.fn()
describe('', () => {
beforeEach(() => {
window.HTMLMediaElement.prototype.load = mockLoad
window.HTMLMediaElement.prototype.play = mockPlay
window.HTMLMediaElement.prototype.pause = mockPause
window.matchMedia = vi.fn().mockImplementation(() => mockDoesNotPreferReducedMotion)
// this will stop throwing the unstable_flushDiscreteUpdates console error cause by react bug
// https://stackoverflow.com/a/65338472/18285270
Object.defineProperty(HTMLMediaElement.prototype, 'muted', {
set: vi.fn(),
})
})
afterEach(() => {
vi.clearAllMocks()
})
it('renders a video player in the document and autoplay', () => {
render(
,
)
const videoPlayer = screen.getByTestId('kz-video-player')
expect(videoPlayer).toBeInTheDocument()
expect(mockPlay).toHaveBeenCalled()
})
it('respects the use-reduced-motion preferences of the user', () => {
window.matchMedia = vi.fn().mockImplementation(() => mockPrefersReducedMotion)
render(
,
)
const videoPlayer = screen.getByTestId('kz-video-player')
expect(videoPlayer).not.toHaveAttribute('autoplay')
expect(mockPause).toHaveBeenCalled()
})
it('defaults to autoplay when user does not set use-reduced-motion preferences', () => {
window.matchMedia = vi.fn().mockImplementation(() => mockDoesNotPreferReducedMotion)
render(
,
)
const videoPlayer = screen.getByTestId('kz-video-player')
expect(videoPlayer).toHaveAttribute('autoplay')
expect(mockPlay).toHaveBeenCalled()
})
})