You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.0 KiB
80 lines
2.0 KiB
import PropTypes from 'prop-types'; |
|
import React, { Component } from 'react'; |
|
|
|
import { render, fireEvent } from '@testing-library/react'; |
|
|
|
class Media extends Component { |
|
|
|
constructor(props) { |
|
super(props); |
|
|
|
this.state = { |
|
paused: props.paused || false, |
|
}; |
|
} |
|
|
|
handleMediaClick = () => { |
|
const { onClick } = this.props; |
|
|
|
this.setState(prevState => ({ |
|
paused: !prevState.paused, |
|
})); |
|
|
|
if (typeof onClick === 'function') { |
|
onClick(); |
|
} |
|
|
|
const { title } = this.props; |
|
const mediaElements = document.querySelectorAll(`div[title="${title}"]`); |
|
|
|
setTimeout(() => { |
|
mediaElements.forEach(element => { |
|
if (element !== this && !element.classList.contains('paused')) { |
|
element.click(); |
|
} |
|
}); |
|
}, 0); |
|
}; |
|
|
|
render() { |
|
const { title } = this.props; |
|
const { paused } = this.state; |
|
|
|
return ( |
|
<button title={title} onClick={this.handleMediaClick}> |
|
Media Component - {paused ? 'Paused' : 'Playing'} |
|
</button> |
|
); |
|
} |
|
|
|
} |
|
|
|
Media.propTypes = { |
|
title: PropTypes.string.isRequired, |
|
onClick: PropTypes.func, |
|
paused: PropTypes.bool, |
|
}; |
|
|
|
describe('Media attachments test', () => { |
|
let currentMedia = null; |
|
const togglePlayMock = jest.fn(); |
|
|
|
it('plays a new media file and pauses others that were playing', () => { |
|
const container = render( |
|
<div> |
|
<Media title='firstMedia' paused onClick={togglePlayMock} /> |
|
<Media title='secondMedia' paused onClick={togglePlayMock} /> |
|
</div>, |
|
); |
|
|
|
fireEvent.click(container.getByTitle('firstMedia')); |
|
expect(togglePlayMock).toHaveBeenCalledTimes(1); |
|
currentMedia = container.getByTitle('firstMedia'); |
|
expect(currentMedia.textContent).toMatch(/Playing/); |
|
|
|
fireEvent.click(container.getByTitle('secondMedia')); |
|
expect(togglePlayMock).toHaveBeenCalledTimes(2); |
|
currentMedia = container.getByTitle('secondMedia'); |
|
expect(currentMedia.textContent).toMatch(/Playing/); |
|
}); |
|
});
|
|
|