import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import { composeStories } from '@storybook/testing-react'; import * as stories from './Accordion.stories'; import { tagTestId } from '../Tag/Tag.test'; import { iconTestId } from '../Icon/Icon.test'; import color from '../../styles/colors'; const { Default, FullDemo, HasIcon, HasSubtitle, HasTag, ThemeColor } = composeStories(stories); const testId = 'test-accordion'; const testTitle = 'test-accordion-title'; const testSubtitle = 'test-accordion-subtitle'; const testHeader = 'test-accordion-header'; test('Renders Default', () => { const titleText = Default?.args?.title; render(); const element = screen.getByTestId(testId); expect(element).not.toBeNull(); expect(element.id).toBe('accordion'); const title = screen.getByTestId(testTitle); expect(title).not.toBeNull(); expect(title.textContent).toBe(titleText); const subTitle = screen.queryByTestId(testSubtitle); expect(subTitle).toBeNull(); const tag = screen.queryByTestId(tagTestId); expect(tag).toBeNull(); const iconArray = screen.getAllByTestId(iconTestId); expect(iconArray[0]).not.toBeNull(); expect(iconArray[0].textContent).toBe('plus icon'); expect(iconArray[1].textContent).not.toBe('lock closed icon'); }); test('Renders FullDemo', () => { const titleText = FullDemo?.args?.title; const subtitleText = FullDemo?.args?.subTitle; const tagText = FullDemo?.args?.tagText; render(); const element = screen.getByTestId(testId); expect(element).not.toBeNull(); expect(element.id).toBe('accordion'); const title = screen.getByTestId(testTitle); expect(title).not.toBeNull(); expect(title.textContent).toBe(titleText); const subTitle = screen.getByTestId(testSubtitle); expect(subTitle).not.toBeNull(); expect(subTitle.textContent).toBe(subtitleText); const tag = screen.getByTestId(tagTestId); expect(tag).not.toBeNull(); expect(tag.textContent).toBe(tagText); const iconArray = screen.getAllByTestId(iconTestId); expect(iconArray[0]).not.toBeNull(); expect(iconArray[0].textContent).toBe('plus icon'); expect(iconArray[1]).not.toBeNull(); expect(iconArray[1].textContent).toBe('lock closed icon'); }); test('Component is interactive', () => { const isExpanded = FullDemo?.args?.isExpanded; render(); const headerElement = screen.getByTestId(testHeader); expect(headerElement).not.toBeNull(); expect(headerElement.getAttribute('aria-expanded')).toBe(`${isExpanded}`); fireEvent.click(headerElement); expect(headerElement?.getAttribute('aria-expanded')).toBe(`${!isExpanded}`); }); test('Renders colors', () => { render(); const element = screen.getByTestId(testId); const styles = element && getComputedStyle(element); expect(styles.border).toBe(`1px solid ${color.blue}`.toLowerCase()); }); test('Renders theme colors', () => { render(); const element = screen.getByTestId(testId); const styles = element && getComputedStyle(element); expect(styles.border).toBe(`1px solid ${color.green}`.toLowerCase()); }); test('Renders HasSubtitle', () => { const titleText = HasSubtitle?.args?.title; const subtitleText = FullDemo?.args?.subTitle; render(); const element = screen.getByTestId(testId); expect(element).not.toBeNull(); expect(element.id).toBe('accordion'); const title = screen.getByTestId(testTitle); expect(title).not.toBeNull(); expect(title.textContent).toBe(titleText); const subTitle = screen.getByTestId(testSubtitle); expect(subTitle).not.toBeNull(); expect(subTitle.textContent).toBe(subtitleText); const tag = screen.queryByTestId(tagTestId); expect(tag).toBeNull(); const iconArray = screen.getAllByTestId(iconTestId); expect(iconArray[0]).not.toBeNull(); expect(iconArray[0].textContent).toBe('plus icon'); expect(iconArray[1].textContent).not.toBe('lock closed icon'); }); test('Renders HasTag', () => { const titleText = HasTag?.args?.title; const tagText = FullDemo?.args?.tagText; render(); const element = screen.getByTestId(testId); expect(element).not.toBeNull(); expect(element.id).toBe('accordion'); const title = screen.getByTestId(testTitle); expect(title).not.toBeNull(); expect(title.textContent).toBe(titleText); const subTitle = screen.queryByTestId(testSubtitle); expect(subTitle).toBeNull(); const tag = screen.getByTestId(tagTestId); expect(tag).not.toBeNull(); expect(tag.textContent).toBe(tagText); const iconArray = screen.getAllByTestId(iconTestId); expect(iconArray[0]).not.toBeNull(); expect(iconArray[0].textContent).toBe('plus icon'); expect(iconArray[1].textContent).not.toBe('lock closed icon'); }); test('Renders HasIcon', () => { const titleText = HasIcon?.args?.title; render(); const element = screen.getByTestId(testId); expect(element).not.toBeNull(); expect(element.id).toBe('accordion'); const title = screen.getByTestId(testTitle); expect(title).not.toBeNull(); expect(title.textContent).toBe(titleText); const subTitle = screen.queryByTestId(testSubtitle); expect(subTitle).toBeNull(); const tag = screen.queryByTestId(tagTestId); expect(tag).toBeNull(); const iconArray = screen.getAllByTestId(iconTestId); expect(iconArray[0]).not.toBeNull(); expect(iconArray[0].textContent).toBe('plus icon'); expect(iconArray[1]).not.toBeNull(); expect(iconArray[1].textContent).toBe('lock closed icon'); });