import * as React from 'react'; import { expect } from 'chai'; import { createRenderer, describeConformance } from 'test/utils'; import Step, { StepProps, stepClasses } from '@mui/material/Step'; import StepLabel from '@mui/material/StepLabel'; import StepConnector, { stepConnectorClasses } from '@mui/material/StepConnector'; import StepContent, { stepContentClasses } from '@mui/material/StepContent'; import Stepper, { stepperClasses as classes } from '@mui/material/Stepper'; describe('', () => { const { render } = createRenderer(); describeConformance( , () => ({ classes, inheritComponent: 'div', render, muiName: 'MuiStepper', refInstanceof: window.HTMLDivElement, testVariantProps: { variant: 'foo' }, testStateOverrides: { prop: 'alternativeLabel', value: true, styleKey: 'alternativeLabel' }, skip: ['componentsProp'], }), ); describe('rendering children', () => { it('renders 3 Step and 2 StepConnector components', () => { const { container } = render( , ); const connectors = container.querySelectorAll(`.${stepConnectorClasses.root}`); const steps = container.querySelectorAll(`.${stepClasses.root}`); expect(connectors).to.have.length(2); expect(steps).to.have.length(3); }); }); describe('controlling child props', () => { it('controls children linearly based on the activeStep prop', () => { const { container, setProps } = render( , ); const steps = container.querySelectorAll(`.${stepClasses.root}`); const connectors = container.querySelectorAll(`.${stepConnectorClasses.root}`); expect(steps[0]).not.to.have.class(stepClasses.completed); expect(steps[1]).not.to.have.class(stepClasses.completed); expect(steps[2]).not.to.have.class(stepClasses.completed); expect(connectors[0]).to.have.class(stepConnectorClasses.disabled); expect(connectors[1]).to.have.class(stepConnectorClasses.disabled); setProps({ activeStep: 1 }); expect(steps[0]).to.have.class(stepClasses.completed); expect(steps[1]).not.to.have.class(stepClasses.completed); expect(steps[2]).not.to.have.class(stepClasses.completed); expect(connectors[0]).not.to.have.class(stepConnectorClasses.disabled); expect(connectors[0]).to.have.class(stepConnectorClasses.active); expect(connectors[1]).to.have.class(stepConnectorClasses.disabled); }); it('controls children non-linearly based on the activeStep prop', () => { const { container, setProps } = render( , ); const steps = container.querySelectorAll(`.${stepClasses.root}`); const connectors = container.querySelectorAll(`.${stepConnectorClasses.root}`); expect(steps[0]).not.to.have.class(stepClasses.completed); expect(steps[1]).not.to.have.class(stepClasses.completed); expect(steps[2]).not.to.have.class(stepClasses.completed); expect(connectors[0]).not.to.have.class(stepConnectorClasses.disabled); expect(connectors[1]).not.to.have.class(stepConnectorClasses.disabled); setProps({ activeStep: 1 }); expect(steps[0]).not.to.have.class(stepClasses.completed); expect(steps[1]).not.to.have.class(stepClasses.completed); expect(steps[2]).not.to.have.class(stepClasses.completed); expect(connectors[0]).not.to.have.class(stepConnectorClasses.disabled); expect(connectors[0]).to.have.class(stepConnectorClasses.active); expect(connectors[1]).not.to.have.class(stepConnectorClasses.disabled); setProps({ activeStep: 2 }); expect(steps[0]).not.to.have.class(stepClasses.completed); expect(steps[1]).not.to.have.class(stepClasses.completed); expect(steps[2]).not.to.have.class(stepClasses.completed); expect(connectors[0]).not.to.have.class(stepConnectorClasses.disabled); expect(connectors[1]).not.to.have.class(stepConnectorClasses.disabled); expect(connectors[1]).to.have.class(stepConnectorClasses.active); }); it('passes index down correctly when rendering children containing arrays', () => { function CustomStep({ index }: StepProps) { return
; } const { getAllByTestId } = render( {[, ]} , ); const steps = getAllByTestId('step'); expect(steps[0]).to.have.attribute('data-index', '0'); expect(steps[1]).to.have.attribute('data-index', '1'); expect(steps[2]).to.have.attribute('data-index', '2'); }); }); describe('step connector', () => { it('should have a default step connector', () => { const { container } = render( , ); const connectors = container.querySelectorAll(`.${stepConnectorClasses.root}`); expect(connectors).to.have.length(1); }); it('should allow the developer to specify a custom step connector', () => { function CustomConnector() { return
; } const { container } = render( }> , ); const defaultConnectors = container.querySelectorAll(`.${stepConnectorClasses.root}`); const customConnectors = container.querySelectorAll('.CustomConnector'); expect(defaultConnectors).to.have.length(0); expect(customConnectors).to.have.length(1); }); it('should allow the step connector to be removed', () => { const { container } = render( , ); const connectors = container.querySelectorAll(`.${stepConnectorClasses.root}`); expect(connectors).to.have.length(0); }); it('should pass active prop to connector when second step is active', () => { const { container } = render( , ); const connector = container.querySelector(`.${stepConnectorClasses.root}`); expect(connector).to.have.class(stepConnectorClasses.active); }); it('should pass completed prop to connector when second step is completed', () => { const { container } = render( , ); const connector = container.querySelector(`.${stepConnectorClasses.root}`); expect(connector).to.have.class(stepConnectorClasses.completed); }); it('should pass correct active and completed props to the StepConnector with nonLinear prop', () => { const steps = ['Step1', 'Step2', 'Step3']; const { container } = render( }> {steps.map((label, index) => ( {label} ))} , ); const connectors = container.querySelectorAll(`.${stepConnectorClasses.root}`); expect(connectors).to.have.length(2); expect(connectors[0]).to.have.class(stepConnectorClasses.active); expect(connectors[0]).not.to.have.class(stepConnectorClasses.completed); expect(connectors[1]).to.have.class(stepConnectorClasses.active); expect(connectors[1]).to.have.class(stepConnectorClasses.completed); }); }); it('renders with a null child', () => { const { container } = render( {null} , ); const steps = container.querySelectorAll(`.${stepClasses.root}`); expect(steps).to.have.length(1); }); it('should hide the last connector', () => { const { container } = render( one two , ); const stepContent = container.querySelectorAll(`.${stepContentClasses.root}`); expect(stepContent[0]).not.to.have.class(stepContentClasses.last); expect(stepContent[1]).to.have.class(stepContentClasses.last); }); });