import { expect, Locator } from '@playwright/test'; import { test, EventSpy } from '@stencil/playwright'; test.describe('ontario-textarea', () => { let host: Locator; let textarea: Locator; let inputSpy: EventSpy; let changeSpy: EventSpy; let inputOnInputSpy: EventSpy; let inputOnChangeSpy: EventSpy; test.beforeEach(async ({ page }) => { await page.setContent(` `); await page.waitForChanges(); host = page.locator('ontario-textarea').first(); textarea = host.locator('textarea').first(); inputSpy = await page.spyOnEvent('input'); changeSpy = await page.spyOnEvent('change'); inputOnInputSpy = await page.spyOnEvent('inputOnInput'); inputOnChangeSpy = await page.spyOnEvent('inputOnChange'); }); test('keeps the host value in sync and emits input detail while typing', async ({ page }) => { await textarea.click(); await textarea.pressSequentially('Typed into the textarea'); await page.waitForChanges(); await expect(inputSpy).toHaveReceivedEvent(); await expect(inputOnInputSpy).toHaveReceivedEvent(); expect(inputOnInputSpy.events.length).toBeGreaterThan(0); expect(inputOnInputSpy.events[inputOnInputSpy.events.length - 1].detail).toEqual( expect.objectContaining({ inputType: 'insertText', }), ); expect(await host.evaluate((element: HTMLOntarioTextareaElement) => element.value)).toBe('Typed into the textarea'); }); test('emits a host change event with the committed value', async ({ page }) => { await textarea.click(); await textarea.pressSequentially('Committed textarea value'); await page.keyboard.press('Tab'); await page.waitForChanges(); await expect(changeSpy).toHaveReceivedEvent(); await expect(inputOnChangeSpy).toHaveReceivedEvent(); expect(inputOnChangeSpy.events[inputOnChangeSpy.events.length - 1].detail).toEqual({ id: 'ontario-textarea', value: 'Committed textarea value', }); expect(await host.evaluate((element: HTMLOntarioTextareaElement) => element.value)).toBe( 'Committed textarea value', ); }); test('applies external value updates to the rendered textarea', async ({ page }) => { await host.evaluate((element: HTMLOntarioTextareaElement) => { element.value = 'Updated externally'; }); await page.waitForChanges(); await expect(textarea).toHaveValue('Updated externally'); expect(await host.evaluate((element: HTMLOntarioTextareaElement) => element.value)).toBe('Updated externally'); }); }); // import { newE2EPage } from '@stencil/core/testing'; // describe('ontario-textarea', () => { // describe('render', () => { // it('renders', async () => { // const page = await newE2EPage(); // await page.setContent(""); // const component = await page.find('ontario-textarea'); // const element = await page.find('ontario-textarea >>> textarea'); // expect(component).toHaveClass('hydrated'); // expect(element).toHaveClass('ontario-textarea'); // expect(element).toEqualAttributes({ // name: 'ontario-textarea', // }); // }); // }); // describe('render changes', () => { // let page: any; // let component: any; // let element: any; // beforeEach(async () => { // page = await newE2EPage(); // await page.setContent(""); // component = await page.find('ontario-textarea'); // element = await page.find('ontario-textarea >>> textarea'); // }); // it('renders changes to the id property', async () => { // component.setProperty('elementId', 'ontario-textarea-id'); // await page.waitForChanges(); // expect(element).toEqualAttributes({ // name: 'ontario-textarea', // id: 'ontario-textarea-id', // }); // }); // it('renders changes to the value attribute', async () => { // component.setAttribute('value', 'This is a test'); // await page.waitForChanges(); // const value = component.getAttribute('value'); // expect(value).toEqual('This is a test'); // }); // }); // }); // describe('events/methods', () => { // it('fires the inputOnBlur event', async () => { // const page = await newE2EPage(); // await page.setContent(""); // const blurEvent = await page.spyOnEvent('inputOnBlur'); // const component = await page.find('ontario-textarea'); // component.triggerEvent('inputOnBlur'); // await page.waitForChanges(); // expect(blurEvent).toHaveReceivedEventTimes(1); // }); // it('fires the inputOnFocus event', async () => { // const page = await newE2EPage(); // await page.setContent(""); // const focusEvent = await page.spyOnEvent('inputOnFocus'); // const component = await page.find('ontario-textarea'); // component.triggerEvent('inputOnFocus'); // await page.waitForChanges(); // expect(focusEvent).toHaveReceivedEventTimes(1); // }); // it('fires the inputOnChange event', async () => { // const page = await newE2EPage(); // await page.setContent(""); // const changeEvent = await page.spyOnEvent('inputOnChange'); // const component = await page.find('ontario-textarea'); // component.triggerEvent('inputOnChange'); // await page.waitForChanges(); // expect(changeEvent).toHaveReceivedEventTimes(1); // }); // it('fires the onChange event', async () => { // const page = await newE2EPage(); // await page.setContent(""); // const changeEvent = await page.spyOnEvent('change'); // const component = await page.find('ontario-textarea'); // component.triggerEvent('change'); // await page.waitForChanges(); // expect(changeEvent).toHaveReceivedEventTimes(1); // }); // });