Skip to content

Commit

Permalink
feat: 🎸 add userEvent.dblClick()
Browse files Browse the repository at this point in the history
  • Loading branch information
Gpx committed Sep 30, 2018
1 parent e75e8ac commit d7a01a7
Show file tree
Hide file tree
Showing 3 changed files with 180 additions and 0 deletions.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,28 @@ userEvent.click(getByText("Check"));
expect(getByTestId("checkbox")).toHaveAttribute("checked", true);
```

### `dblClick(element)`

Clicks `element` twice, depending on what `element` is it can have different
side effects.

```jsx
import React from "react";
import { render } from "react-testing-library";
import userEvent from "user-event";

test("double click", () => {
const onChange = jest.fn();
const { getByTestId } = render(
<input type="checkbox" id="checkbox" onChange={onChange} />
);
const checkbox = getByTestId("checkbox");
userEvent.dblClick(checkbox);
expect(onChange).toHaveBeenCalledTimes(2);
expect(checkbox).toHaveProperty("checked", false);
});
```

### `type(element, text, [options])`

Writes `text` inside an `<input>` or a `<textarea>`. `options` accepts one
Expand Down
106 changes: 106 additions & 0 deletions __tests__/dblclick.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import React from "react";
import { render, cleanup } from "react-testing-library";
import "jest-dom/extend-expect";
import userEvent from "../src";

afterEach(cleanup);

describe("userEvent.dblClick", () => {
it.each(["input", "textarea"])(
"should fire the correct events for <%s>",
type => {
const events = [];
const eventsHandler = jest.fn(evt => events.push(evt.type));
const { getByTestId } = render(
React.createElement(type, {
"data-testid": "element",
onMouseOver: eventsHandler,
onMouseMove: eventsHandler,
onMouseDown: eventsHandler,
onFocus: eventsHandler,
onMouseUp: eventsHandler,
onClick: eventsHandler,
onDoubleClick: eventsHandler
})
);

userEvent.dblClick(getByTestId("element"));

expect(events).toEqual([
"mouseover",
"mousemove",
"mousedown",
"focus",
"mouseup",
"click",
"mousedown",
"mouseup",
"click",
"dblclick"
]);
}
);

it('should fire the correct events for <input type="checkbox">', () => {
const events = [];
const eventsHandler = jest.fn(evt => events.push(evt.type));
const { getByTestId } = render(
<input
data-testid="element"
type="checkbox"
onMouseOver={eventsHandler}
onMouseMove={eventsHandler}
onMouseDown={eventsHandler}
onFocus={eventsHandler}
onMouseUp={eventsHandler}
onClick={eventsHandler}
onChange={eventsHandler}
/>
);

userEvent.dblClick(getByTestId("element"));

expect(events).toEqual([
"mouseover",
"mousemove",
"mousedown",
"mouseup",
"click",
"change",
"mousedown",
"mouseup",
"click",
"change"
]);

expect(getByTestId("element")).toHaveProperty("checked", false);
});

it("should fire the correct events for <div>", () => {
const events = [];
const eventsHandler = jest.fn(evt => events.push(evt.type));
const { getByTestId } = render(
<div
data-testid="div"
onMouseOver={eventsHandler}
onMouseMove={eventsHandler}
onMouseDown={eventsHandler}
onFocus={eventsHandler}
onMouseUp={eventsHandler}
onClick={eventsHandler}
/>
);

userEvent.dblClick(getByTestId("div"));
expect(events).toEqual([
"mouseover",
"mousemove",
"mousedown",
"mouseup",
"click",
"mousedown",
"mouseup",
"click"
]);
});
});
52 changes: 52 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,35 @@ function clickElement(element) {
labelAncestor && clickLabel(labelAncestor);
}

function dblClickElement(element) {
fireEvent.mouseOver(element);
fireEvent.mouseMove(element);
fireEvent.mouseDown(element);
element.focus();
fireEvent.mouseUp(element);
fireEvent.click(element);
fireEvent.mouseDown(element);
fireEvent.mouseUp(element);
fireEvent.click(element);
fireEvent.dblClick(element);

const labelAncestor = findTagInParents(element, "LABEL");
labelAncestor && clickLabel(labelAncestor);
}

function dblClickCheckbox(checkbox) {
fireEvent.mouseOver(checkbox);
fireEvent.mouseMove(checkbox);
fireEvent.mouseDown(checkbox);
fireEvent.mouseUp(checkbox);
fireEvent.click(checkbox);
fireEvent.change(checkbox);
fireEvent.mouseDown(checkbox);
fireEvent.mouseUp(checkbox);
fireEvent.click(checkbox);
fireEvent.change(checkbox);
}

const userEvent = {
click(element) {
const focusedElement = document.activeElement;
Expand All @@ -70,6 +99,29 @@ const userEvent = {

wasAnotherElementFocused && focusedElement.blur();
},

dblClick(element) {
const focusedElement = document.activeElement;
const wasAnotherElementFocused =
focusedElement !== document.body && focusedElement !== element;
if (wasAnotherElementFocused) {
fireEvent.mouseMove(focusedElement);
fireEvent.mouseLeave(focusedElement);
}

switch (element.tagName) {
case "INPUT":
if (element.type === "checkbox") {
dblClickCheckbox(element);
break;
}
default:
dblClickElement(element);
}

wasAnotherElementFocused && focusedElement.blur();
},

type(element, text, userOpts = {}) {
const defaultOpts = { allAtOnce: false };
const opts = Object.assign(defaultOpts, userOpts);
Expand Down

0 comments on commit d7a01a7

Please sign in to comment.