import React from 'react'; import { JSX } from '@ionic/core'; import { createReactComponent } from '../createComponent'; import { render, fireEvent, cleanup, RenderResult } from '@testing-library/react'; import { IonButton } from '../index'; afterEach(cleanup); describe('createComponent - events', () => { test('should set events on handler', () => { const FakeOnClick = jest.fn((e) => e); const IonButton = createReactComponent('ion-button'); const { getByText } = render(ButtonNameA); fireEvent.click(getByText('ButtonNameA')); expect(FakeOnClick).toBeCalledTimes(1); }); test('should add custom events', () => { const FakeIonFocus = jest.fn((e) => e); const IonInput = createReactComponent('ion-input'); const { getByText } = render(ButtonNameA); const ionInputItem = getByText('ButtonNameA'); expect(Object.keys((ionInputItem as any).__events)).toEqual(['ionFocus']); }); }); describe('createComponent - ref', () => { test('should pass ref on to web component instance (RefObject)', () => { const ionButtonRef: React.RefObject = React.createRef(); const IonButton = createReactComponent('ion-button'); const { getByText } = render(ButtonNameA); const ionButtonItem = getByText('ButtonNameA'); expect(ionButtonRef.current).toEqual(ionButtonItem); }); test('should pass ref on to web component instance (RefCallback)', () => { let current const ionButtonRef: React.RefCallback = value => current = value; const IonButton = createReactComponent('ion-button'); const { getByText } = render(ButtonNameA); const ionButtonItem = getByText('ButtonNameA'); expect(current).toEqual(ionButtonItem); }); }); describe('createComponent - strict mode', () => { beforeEach(() => (console.error = (...data: any[]) => { throw new Error(...data); })); test('should work without errors in strict mode', () => { const renderResult = render( Strict Mode Rocks ); expect(renderResult.getByText(/Rocks/)).toBeTruthy(); }); }); describe('when working with css classes', () => { const myClass = 'my-class'; const myClass2 = 'my-class2'; const customClass = 'custom-class'; describe('when a class is added to className', () => { let renderResult: RenderResult; let button: HTMLElement; beforeEach(() => { renderResult = render(Hello!); button = renderResult.getByText(/Hello/); }); it('then it should be in the class list', () => { expect(button.classList.contains(myClass)).toBeTruthy(); }); it('when a class is added to class list outside of React, then that class should still be in class list when rendered again', () => { button.classList.add(customClass); expect(button.classList.contains(customClass)).toBeTruthy(); renderResult.rerender(Hello!); expect(button.classList.contains(customClass)).toBeTruthy(); }); }); describe('when multiple classes are added to className', () => { let renderResult: RenderResult; let button: HTMLElement; beforeEach(() => { renderResult = render(Hello!); button = renderResult.getByText(/Hello/); }); it('then both classes should be in class list', () => { expect(button.classList.contains(myClass)).toBeTruthy(); expect(button.classList.contains(myClass2)).toBeTruthy(); }); it('when one of the classes is removed, then only the remaining class should be in class list', () => { expect(button.classList.contains(myClass)).toBeTruthy(); expect(button.classList.contains(myClass2)).toBeTruthy(); renderResult.rerender(Hello!); expect(button.classList.contains(myClass)).toBeTruthy(); expect(button.classList.contains(myClass2)).toBeFalsy(); }); it('when a custom class is added outside of React and one of the classes is removed, then only the remaining class and the custom class should be in class list', () => { button.classList.add(customClass); expect(button.classList.contains(myClass)).toBeTruthy(); expect(button.classList.contains(myClass2)).toBeTruthy(); expect(button.classList.contains(customClass)).toBeTruthy(); renderResult.rerender(Hello!); expect(button.classList.contains(myClass)).toBeTruthy(); expect(button.classList.contains(myClass)).toBeTruthy(); expect(button.classList.contains(myClass2)).toBeFalsy(); }); }); });