import React from 'react'; import { cleanup, fireEvent, render } from '@testing-library/react'; import { composeStories } from '@storybook/testing-react'; import * as stories from './Button.stories'; import color from '../../styles/colors'; import rgbToHex from '../../utils/rgbToHex'; const { ColoredBlue, ColoredGreen, ColoredRed, ColoredYellow, Ghost, Link, LoadingButton, LoadingButtonCustomProps, Outline, Primary, PrimaryLarge, PrimarySmall, PrimaryWithIcon, PrimaryWithIconAfter, PrimaryWithIconOnly, PrimaryWithIconOnlyLarge, PrimaryWithIconOnlySmall, Secondary, StatusDanger, StatusSuccess, StatusWarning, Text, } = composeStories(stories); let container: HTMLDivElement; const testClickEvent = jest.fn(); export const buttonTestId = 'test-button'; describe('Button - Primary', () => { const testText = Primary?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { cleanup(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Primary button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.green); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.white); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Primary Large', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders PrimaryLarge button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.white); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.green); expect(styles?.borderWidth).toBe('2px'); expect(styles?.fontSize).toBe('16px'); expect(styles?.padding).toBe('6px 22px'); }); }); describe('Button - Primary Small', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders PrimaryLarge button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.white); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.green); expect(styles?.fontSize).toBe('14px'); expect(styles?.padding).toBe('0px 16px'); }); }); describe('Button - Primary with icon', () => { const testText = PrimaryWithIcon?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe('plus icon' + testText); }); it('renders icon correctly', () => { const iconElement = container.querySelector( `[data-testid="${buttonTestId}"] > div > svg`, ); expect(iconElement).not.toBeNull(); }); }); describe('Button - Primary icon after', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders PrimaryLarge button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); expect(styles?.flexDirection).toBe('row-reverse'); }); }); describe('Button - Primary icon only', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders PrimaryLarge button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); expect(styles?.borderWidth).toBe('0px'); expect(styles?.height).toBe('32px'); expect(styles?.width).toBe('32px'); expect(styles?.textIndent).toBe('-99999px'); }); }); describe('Button - Primary icon only large', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders PrimaryLarge button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); expect(styles?.borderWidth).toBe('4px'); expect(styles?.height).toBe('40px'); expect(styles?.width).toBe('40px'); expect(styles?.textIndent).toBe('-99999px'); }); }); describe('Button - Primary icon only small', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders PrimaryLarge button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); expect(styles?.height).toBe('24px'); expect(styles?.width).toBe('24px'); expect(styles?.textIndent).toBe('-99999px'); }); }); describe('Button - Secondary', () => { const testText = Secondary?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Secondary button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.blueLight); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.blue); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Outline', () => { const testText = Outline?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Outline button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.white); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.blue); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - ColoredRed', () => { const testText = ColoredRed?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Red button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.red); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.red); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - ColoredBlue', () => { const testText = ColoredBlue?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Blue button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.blue); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.blue); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - ColoredGreen', () => { const testText = ColoredGreen?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Green button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.green); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.green); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - ColoredYellow', () => { const testText = ColoredYellow?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Yellow button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.yellow); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.yellow); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Outline', () => { const testText = ColoredYellow?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Yellow button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.yellow); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.yellow); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Loading', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.green); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.white); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Loading', () => { beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.green); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.white); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - StatusWarning', () => { const testText = StatusWarning?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Warning button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.yellowLight); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.yellow); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - StatusDanger', () => { const testText = StatusDanger?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Warning button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.red); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.red); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - StatusSuccess', () => { const testText = StatusSuccess?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Warning button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && rgbToHex(styles.backgroundColor).toUpperCase(); expect(bgColorHex).toBe(color.green); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.green); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Ghost', () => { const testText = Ghost?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Warning button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.white); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Link', () => { const testText = Link?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Warning button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && (styles.backgroundColor); expect(bgColorHex).toBe('transparent'); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.blue); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); }); describe('Button - Text', () => { const testText = Text?.args?.text; beforeEach(() => { container = document.createElement('div'); render(, { container: document.body.appendChild(container), }); }); afterEach(() => { document.body.removeChild(container); container.remove(); }); it('renders the component', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element).not.toBeNull(); }); it('renders text correctly', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); expect(element?.textContent).toBe(testText); }); it('renders Warning button with correct styles', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); const styles = element && getComputedStyle(element); const bgColorHex = styles && (styles.backgroundColor); expect(bgColorHex).toBe('transparent'); const colorHex = styles && rgbToHex(styles.color).toUpperCase(); expect(colorHex).toBe(color.blue); }); it('returns the normal onClick event', () => { const element = container.querySelector( `[data-testid="${buttonTestId}"]`, ); element && fireEvent.click(element); expect(testClickEvent).toHaveBeenCalled(); }); });