M src/__tests__/events.js => src/__tests__/events.js +35 -28
@@ 1,4 1,3 @@
-import React from 'react'
import {render, fireEvent} from '../'
const eventTypes = [
@@ 43,7 42,7 @@ const eventTypes = [
events: [
'click',
'contextMenu',
- 'doubleClick',
+ 'dblClick',
'drag',
'dragEnd',
'dragEnter',
@@ 131,48 130,56 @@ const eventTypes = [
eventTypes.forEach(({type, events, elementType, init}) => {
describe(`${type} Events`, () => {
events.forEach(eventName => {
- const propName = `on${eventName.charAt(0).toUpperCase()}${eventName.slice(
- 1,
- )}`
+ const propName = eventName.toLowerCase()
- it(`triggers ${propName}`, () => {
- const ref = React.createRef()
+ it(`triggers ${eventName}`, () => {
const spy = jest.fn()
- render(
- React.createElement(elementType, {
- [propName]: spy,
- ref,
- }),
+ const {getByTestId} = render(
+ `
+ <${elementType}
+ data-testid="target"
+ ng-on-${propName}="spy()"
+ ></${elementType}>`,
+ {
+ scope: {
+ spy,
+ },
+ },
)
- fireEvent[eventName](ref.current, init)
+ const target = getByTestId('target')
+ fireEvent[eventName](target, init)
expect(spy).toHaveBeenCalledTimes(1)
})
})
})
})
-test('onChange works', () => {
- const handleChange = jest.fn()
- const {
- container: {firstChild: input},
- } = render(<input onChange={handleChange} />)
- fireEvent.change(input, {target: {value: 'a'}})
- expect(handleChange).toHaveBeenCalledTimes(1)
-})
-
test('calling `fireEvent` directly works too', () => {
- const handleEvent = jest.fn()
- const {
- container: {firstChild: button},
- } = render(<button onClick={handleEvent} />)
+ const spy = jest.fn()
+
+ const {getByTestId} = render(
+ `
+ <button
+ data-testid="target"
+ ng-click="spy()"
+ ></button>`,
+ {
+ scope: {
+ spy,
+ },
+ },
+ )
+
+ const target = getByTestId('target')
fireEvent(
- button,
- new Event('MouseEvent', {
+ target,
+ new Event('click', {
bubbles: true,
cancelable: true,
button: 0,
}),
)
+ expect(spy).toHaveBeenCalledTimes(1)
})
M src/__tests__/render.js => src/__tests__/render.js +12 -0
@@ 29,3 29,15 @@ test('supports fragments', () => {
const {asFragment} = render(`<atl-fragment></atl-fragment>`)
expect(asFragment()).toMatchSnapshot()
})
+
+test('assigns to scope', () => {
+ const {getByText} = render(`<div>Hello {{name}}</div>`, {
+ scope: {
+ name: 'World',
+ },
+ })
+
+ expect(() => getByText('Hello World')).not.toThrow(
+ 'Unable to find an element with the text: Hello World.',
+ )
+})
M src/pure.js => src/pure.js +10 -1
@@ 9,7 9,7 @@ import {
const mountedContainers = new Set()
const mountedScopes = new Set()
-function render(ui, {container, baseElement = container, queries} = {}) {
+function render(ui, {container, baseElement = container, queries, scope} = {}) {
if (!baseElement) {
// default to document.body instead of documentElement to avoid output of potentially-large
// head elements (such as JSS style blocks) in debug output
@@ 31,6 31,7 @@ function render(ui, {container, baseElement = container, queries} = {}) {
($compile, $rootScope) => {
$scope = $rootScope.$new()
mountedScopes.add($scope)
+ Object.assign($scope, scope)
const element = $compile(ui)($scope)[0]
container.appendChild(element)
@@ 93,5 94,13 @@ Object.keys(dtlFireEvent).forEach(key => {
}
})
+fireEvent.mouseEnter = (...args) => {
+ return dtlFireEvent.mouseOver(...args)
+}
+
+fireEvent.mouseLeave = (...args) => {
+ return dtlFireEvent.mouseOut(...args)
+}
+
export * from '@testing-library/dom'
export {render, cleanup, fireEvent}