import { mount } from 'enzyme';
import React from 'react';
import { useContainerClassNames } from './useContainerClassNames.hook';
const TestComponent = ({ classNames }: { classNames: string[] }) => {
useContainerClassNames(classNames);
return null as JSX.Element;
};
const containerClassName = 'spinnaker-container';
const testClassNames = ['testClass1', 'testClass2'];
describe('useContainerClassNames', () => {
let containerElement: HTMLDivElement;
beforeEach(() => {
containerElement = document.createElement('div');
containerElement.classList.add(containerClassName);
});
it('should add class names to the container element when mounted', () => {
spyOn(document, 'querySelector').and.returnValue(containerElement);
mount();
expect(containerElement.classList.contains(testClassNames[0])).toBe(true);
expect(containerElement.classList.contains(testClassNames[1])).toBe(true);
});
it('should remove class names from the container element when unmounted', () => {
spyOn(document, 'querySelector').and.returnValue(containerElement);
const component = mount();
component.render();
component.unmount();
expect(containerElement.classList.contains(testClassNames[0])).toBe(false);
expect(containerElement.classList.contains(testClassNames[1])).toBe(false);
});
it('should add and remove class names when the elements in "classNames" change', () => {
spyOn(document, 'querySelector').and.returnValue(containerElement);
const component = mount();
expect(containerElement.classList.contains(testClassNames[0])).toBe(true);
expect(containerElement.classList.contains(testClassNames[1])).toBe(true);
component.setProps({ classNames: testClassNames.concat('additionalClass') });
component.render();
expect(containerElement.classList.contains(testClassNames[0])).toBe(true);
expect(containerElement.classList.contains(testClassNames[1])).toBe(true);
expect(containerElement.classList.contains('additionalClass')).toBe(true);
component.setProps({ classNames: [testClassNames[0]] });
component.render();
expect(containerElement.classList.contains(testClassNames[0])).toBe(true);
expect(containerElement.classList.contains(testClassNames[1])).toBe(false);
expect(containerElement.classList.contains('additionalClass')).toBe(false);
component.setProps({ classNames: [] });
component.render();
expect(containerElement.classList.contains(testClassNames[0])).toBe(false);
});
it('should silently do nothing when the container element does not exist', () => {
spyOn(document, 'querySelector').and.returnValue(null);
expect(() => mount()).not.toThrow();
});
});