import { jsdomReactUniDriver } from '.'; import { SetupFn, renderTestApp, runTestSuite } from '@unidriver/test-suite'; // import {KeyboardEventsAppSetupFn, TodoAppSetupFn} from '@unidriver/test-suite'; import * as sinon from 'sinon'; import * as React from 'react'; import * as ReactDOM from 'react-dom'; import {assert} from 'chai'; const setup: SetupFn = async (params) => { const cleanJsdom = require('jsdom-global')(); const div = document.createElement('div'); document.body.appendChild(div); const cleanApp = renderTestApp(div, params); const driver = jsdomReactUniDriver(div); const tearDown = () => { cleanApp(); cleanJsdom(); return Promise.resolve(); }; return {driver, tearDown}; }; describe('react base driver - test suite', () => { runTestSuite({ setup }); }); describe('react base driver specific tests', () => { const spy = sinon.spy; describe('click', () => { it('sends event data properly on simulated events when element is not attached to body', async () => { const cleanJsdom = require('jsdom-global')(); const s = spy(); const elem = document.createElement('div'); const btn = ; ReactDOM.render(btn, elem); const driver = jsdomReactUniDriver(elem); await driver.$('button').click(); cleanJsdom(); assert.equal(s.lastCall.args[0].target.tagName, 'BUTTON'); }); it('sends event data properly on simulated events when element is attached to body', async () => { const cleanJsdom = require('jsdom-global')(); const s = spy(); const elem = document.createElement('div'); document.body.appendChild(elem); const btn = ; ReactDOM.render(btn, elem); const driver = jsdomReactUniDriver(elem); await driver.$('button').click(); cleanJsdom(); assert.equal(s.lastCall.args[0].target.tagName, 'BUTTON'); }); it('should trigger [mouseDown, mouseUp, click] in this order and with default main-button(0) when clicked', async () => { const cleanJsdom = require('jsdom-global')(); const mouseDown = spy(); const mouseUp = spy(); const click = spy(); const elem = document.createElement('div'); const btn = ( ); ReactDOM.render(btn, elem); const driver = jsdomReactUniDriver(elem); await driver.$('button').click(); cleanJsdom(); sinon.assert.callOrder(mouseDown,mouseUp,click); const DEFAULT_BUTTON_ID = '0' assert.equal(mouseDown.lastCall.args[0].button, DEFAULT_BUTTON_ID); assert.equal(mouseUp.lastCall.args[0].button, DEFAULT_BUTTON_ID); assert.equal(click.lastCall.args[0].button, DEFAULT_BUTTON_ID); }); it('should trigger [focus] on click', async () => { const cleanJsdom = require('jsdom-global')(); const focus = spy(); const elem = document.createElement('div'); const btn = ( ); ReactDOM.render(btn, elem); const driver = jsdomReactUniDriver(elem); await driver.$('button').click(); cleanJsdom(); assert(focus.calledOnce); }); it('should trigger [mousedown, focus, mouseup, click] events on click', async () => { // https://jsbin.com/larubagiwu/1/edit?html,js,console,output // https://github.com/wix-incubator/unidriver/pull/86#issuecomment-516809527 const cleanJsdom = require('jsdom-global')(); const mousedown = spy(); const focus = spy(); const mouseup = spy(); const click = spy(); const elem = document.createElement('div'); const btn = ( ); ReactDOM.render(btn, elem); const driver = jsdomReactUniDriver(elem); await driver.$('button').click(); cleanJsdom(); sinon.assert.callOrder(mousedown, focus, mouseup, click); assert(mousedown.calledOnce); assert(focus.calledOnce); assert(mouseup.calledOnce); assert(click.calledOnce); }); it('should trigger [mousedown, focus, mouseup, click, input, change] events on click on input[type=checkbox]', async () => { const cleanJsdom = require('jsdom-global')(); const mousedown = spy(); const focus = spy(); const mouseup = spy(); const click = spy(); const input = spy(); const change = spy(); const elem = document.createElement('div'); const checkbox = ( ); ReactDOM.render(checkbox, elem); const driver = jsdomReactUniDriver(elem); await driver.$('input').click(); cleanJsdom(); sinon.assert.callOrder(mousedown, focus, mouseup, click, input, change); assert(mousedown.calledOnce); assert(focus.calledOnce); assert(mouseup.calledOnce); assert(click.calledOnce); assert(input.calledOnce); assert(change.calledOnce); }) it('should trigger [focusA, blurA, focusB] when clicking two buttons', async () => { const cleanJsdom = require('jsdom-global')(); const focusA = spy(function focusA() {}); const focusB = spy(function focusB() {}); const blurA = spy(function blurA() {}); const elem = document.createElement('div'); const btn = (