import React from 'react'; import { fireEvent, render, screen, cleanup } from '@testing-library/react'; import { expect } from 'chai'; import sinon from 'sinon'; import { ResizeHandle, ResizeDirection } from './resize-handle'; describe('ResizeHandle Component', function () { afterEach(function () { cleanup(); }); describe('resize direction RIGHT', function () { let onChangeSpy: sinon.SinonSpy; beforeEach(function () { onChangeSpy = sinon.spy(); render( ); }); it('should render the title in the aria description', function () { const actionableElement = screen.getByRole('slider'); expect(actionableElement.getAttribute('aria-label')).to.equal( 'Width of the Pineapple, resize using arrow keys' ); }); describe('when a change event occurs on the slider', function () { beforeEach(function () { const actionableElement = screen.getByRole('slider'); fireEvent.change(actionableElement, { target: { value: 80 } }); }); it('should call to resize the width', function () { expect(onChangeSpy).to.have.been.called; }); it('should call resize with the new width', function () { expect(onChangeSpy).to.have.been.calledWith(80); }); }); describe('when its attempted to be resized out of its bounds', function () { it('should stick to the upper bounds', function () { const actionableElement = screen.getByRole('slider'); fireEvent.change(actionableElement, { target: { value: 1234 } }); expect(onChangeSpy).to.have.been.calledWith(150); }); it('should stick to the lower bounds', function () { const actionableElement = screen.getByRole('slider'); fireEvent.change(actionableElement, { target: { value: 10 } }); expect(onChangeSpy).to.have.been.calledWith(50); }); }); it('when focused, after mouse up it should unfocus', function () { const actionableElement = screen.getByRole('slider'); actionableElement.focus(); expect(actionableElement.ownerDocument.activeElement).to.equal( actionableElement ); fireEvent.mouseUp(actionableElement); expect(actionableElement.ownerDocument.activeElement).to.not.equal( actionableElement ); }); }); describe('resize direction TOP', function () { let onChangeSpy: sinon.SinonSpy; beforeEach(function () { onChangeSpy = sinon.spy(); render( ); }); it('should render the title in the aria description', function () { const actionableElement = screen.getByRole('slider'); expect(actionableElement.getAttribute('aria-label')).to.equal( 'Height of the Pineapple, resize using arrow keys' ); }); describe('when a change event occurs on the slider', function () { beforeEach(function () { const actionableElement = screen.getByRole('slider'); fireEvent.change(actionableElement, { target: { value: 80 } }); }); it('should call to resize the width', function () { expect(onChangeSpy).to.have.been.called; }); it('should call resize with the new width', function () { expect(onChangeSpy).to.have.been.calledWith(80); }); }); describe('when its attempted to be resized out of its bounds', function () { it('should stick to the upper bounds', function () { const actionableElement = screen.getByRole('slider'); fireEvent.change(actionableElement, { target: { value: 1234 } }); expect(onChangeSpy).to.have.been.calledWith(150); }); }); it('when focused, after mouse up it should unfocus', function () { const actionableElement = screen.getByRole('slider'); actionableElement.focus(); expect(actionableElement.ownerDocument.activeElement).to.equal( actionableElement ); fireEvent.mouseUp(actionableElement); expect(actionableElement.ownerDocument.activeElement).to.not.equal( actionableElement ); }); }); });