// importing boilerplate stuff
import React from 'react';
import { composeStories } from '@storybook/testing-react';
import {
render,
screen,
fireEvent,
} from '@testing-library/react';
import * as stories from './NewComp.stories';
// // importing fire event from RTL to mock a click event
// import { fireEvent } from '@testing-library/react';
// importing color and a testing tool to convert RGB to HEX
import color from '../../styles/colors';
import rgbToHex from '../../utils/rgbToHex';
// importing testID from button and icon
import { buttonTestId } from '../Button/Button.test';
import { iconTestId } from '../Icon/Icon.test';
// importing my stories to test
const { Default, InitializeRed, UnderLinedText } = composeStories(stories);
// setting my test IDs to match my tsx
export const testCompId = 'test-new-comp';
const testTitle = 'test-title';
const testHeading = 'test-heading';
const testText = 'test-text';
// NOTE: the main test ID is exported incase
// it is needed for another components test
// /////////////////////////////////////////////////////
// examples of basic tests of props, values and styles
// /////////////////////////////////////////////////////
// Test Story 1: Default
test('Renders Default component', () => {
const testTextOn = Default?.args?.textOn;
render();
const component = screen.getByTestId(testCompId);
expect(component).not.toBeNull();
const icon = screen.getByTestId(iconTestId);
expect(icon).not.toBeNull();
const title = screen.getByTestId(testTitle);
expect(title).not.toBeNull();
expect(title.textContent).toBe('The Demo Component');
const heading = screen.getByTestId(testHeading);
expect(heading).not.toBeNull();
expect(heading.textContent).toBe(testTextOn);
const styles = heading && getComputedStyle(heading);
const colorHex = styles && rgbToHex(styles.color).toUpperCase();
expect(colorHex).toBe(color.green);
const text = screen.getByTestId(testText);
expect(text).not.toBeNull();
expect(text.textContent).toBe('Clicked: 0 times');
const textWithoutUnderline = screen.getByTestId(testText);
expect(textWithoutUnderline).not.toBeNull();
const twlStyles = textWithoutUnderline && getComputedStyle(textWithoutUnderline);
expect(twlStyles?.textDecoration).toBe('none');
});
// Test Story 2: Button Click
test('changes UI onClick of the button', () => {
const testTextOff = Default?.args?.textOff;
render();
const buttonElement = screen.getByTestId(buttonTestId);
buttonElement && fireEvent.click(buttonElement);
const textElelement = screen.getByTestId(testText);
expect(textElelement).not.toBeNull();
expect(textElelement.textContent).toBe('Clicked: 1 times');
const headingElement = screen.getByTestId(testHeading);
expect(headingElement).not.toBeNull();
expect(headingElement.textContent).toBe(testTextOff);
const styles = headingElement && getComputedStyle(headingElement);
const colorHex = styles && rgbToHex(styles.color).toUpperCase();
expect(colorHex).toBe(color.red);
});
// Test Story 3: InitializeRed
test('Renders InitializeRed', () => {
const testTextOff = InitializeRed?.args?.textOff;
render();
const component = screen.getByTestId(testCompId);
expect(component).not.toBeNull();
const icon = screen.getByTestId(iconTestId);
expect(icon).not.toBeNull();
const title = screen.getByTestId(testTitle);
expect(title).not.toBeNull();
expect(title.textContent).toBe('The Demo Component');
const heading = screen.getByTestId(testHeading);
expect(heading).not.toBeNull();
expect(heading.textContent).toBe(testTextOff);
const styles = heading && getComputedStyle(heading);
const colorHex = styles && rgbToHex(styles.color).toUpperCase();
expect(colorHex).toBe(color.red);
const text = screen.getByTestId(testText);
expect(text).not.toBeNull();
expect(text.textContent).toBe('Clicked: 0 times');
const textWithoutUnderline = screen.getByTestId(testText);
expect(textWithoutUnderline).not.toBeNull();
const twlStyles = textWithoutUnderline && getComputedStyle(textWithoutUnderline);
expect(twlStyles?.textDecoration).toBe('none');
});
// Test Story 3: Button click
test('changes UI onClick of the button', () => {
const testTextOn = InitializeRed?.args?.textOn;
render();
const buttonElement = screen.getByTestId(buttonTestId);
buttonElement && fireEvent.click(buttonElement);
const textElelement = screen.getByTestId(testText);
expect(textElelement).not.toBeNull();
expect(textElelement.textContent).toBe('Clicked: 1 times');
const headingElement = screen.getByTestId(testHeading);
expect(headingElement).not.toBeNull();
expect(headingElement.textContent).toBe(testTextOn);
const styles = headingElement && getComputedStyle(headingElement);
const colorHex = styles && rgbToHex(styles.color).toUpperCase();
expect(colorHex).toBe(color.green);
});
// Test Story 4: UnderLinedText
test('Renders UnderLinedText', () => {
const testTextOn = UnderLinedText?.args?.textOn;
render();
const component = screen.getByTestId(testCompId);
expect(component).not.toBeNull();
const icon = screen.getByTestId(iconTestId);
expect(icon).not.toBeNull();
const title = screen.getByTestId(testTitle);
expect(title).not.toBeNull();
expect(title.textContent).toBe('The Demo Component');
const heading = screen.getByTestId(testHeading);
expect(heading).not.toBeNull();
expect(heading.textContent).toBe(testTextOn);
const styles = heading && getComputedStyle(heading);
const colorHex = styles && rgbToHex(styles.color).toUpperCase();
expect(colorHex).toBe(color.green);
const text = screen.getByTestId(testText);
expect(text).not.toBeNull();
expect(text.textContent).toBe('Clicked: 0 times');
const textWithoutUnderline = screen.queryByTestId(testText);
expect(textWithoutUnderline).not.toBeNull();
const twlStyles = textWithoutUnderline && getComputedStyle(textWithoutUnderline);
expect(twlStyles?.textDecoration).toBe('underline');
});
test('changes UI onClick of the button', () => {
const testTextOff = UnderLinedText?.args?.textOff;
render();
const buttonElement = screen.getByTestId(buttonTestId);
buttonElement && fireEvent.click(buttonElement);
const textElelement = screen.getByTestId(testText);
expect(textElelement).not.toBeNull();
expect(textElelement.textContent).toBe('Clicked: 1 times');
const headingElement = screen.getByTestId(testHeading);
expect(headingElement).not.toBeNull();
expect(headingElement.textContent).toBe(testTextOff);
const styles = headingElement && getComputedStyle(headingElement);
const colorHex = styles && rgbToHex(styles.color).toUpperCase();
expect(colorHex).toBe(color.red);
});