Skip to content

Commit 2fa4ff8

Browse files
Builder page: added unit test for drag & drop of skill
1 parent 23bf495 commit 2fa4ff8

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

src/components/builder/lists/ListItem.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { MdMoreVert } from 'react-icons/md';
77
import { useDispatch } from '../../../contexts/ResumeContext';
88
import styles from './ListItem.module.css';
99

10+
const dataTestIdPrefix = 'list-item-';
11+
1012
const ListItem = ({
1113
title,
1214
subtitle,
@@ -73,6 +75,7 @@ const ListItem = ({
7375
<div
7476
ref={dragProvided.innerRef}
7577
className={styles.listItem}
78+
data-testid={`${dataTestIdPrefix}${path}`}
7679
{...dragProvided.draggableProps}
7780
{...dragProvided.dragHandleProps}
7881
>
@@ -130,3 +133,5 @@ const ListItem = ({
130133
};
131134

132135
export default memo(ListItem);
136+
137+
export { dataTestIdPrefix };
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { get } from 'lodash';
2+
import { screen } from '@testing-library/react';
3+
4+
import { DatabaseConstants } from 'gatsby-plugin-firebase';
5+
6+
import { dataTestIdPrefix as listItemDataTestIdPrefix } from '../../../components/builder/lists/ListItem';
7+
8+
import {
9+
setupAndWait,
10+
expectDatabaseUpdateToHaveCompleted,
11+
dragAndDropDirectionDown,
12+
dragAndDropListItem,
13+
} from './helpers/builder';
14+
15+
const testTimeoutInMilliseconds = 20000;
16+
jest.setTimeout(testTimeoutInMilliseconds);
17+
18+
test('allows to drag & drop', async () => {
19+
const resumeId = DatabaseConstants.demoStateResume1Id;
20+
const { resume, mockDatabaseUpdateFunction } = await setupAndWait(
21+
resumeId,
22+
true,
23+
true,
24+
);
25+
26+
const now = new Date().getTime();
27+
28+
const dataPath = 'skills.items';
29+
const dataItems = get(resume, dataPath);
30+
expect(dataItems.length).toBeGreaterThan(1);
31+
32+
const listItems = screen.getAllByTestId(
33+
`${listItemDataTestIdPrefix}${dataPath}`,
34+
);
35+
const firstListItem = listItems[0];
36+
expect(firstListItem).toHaveTextContent(dataItems[0].name);
37+
const secondListItem = listItems[1];
38+
expect(secondListItem).toHaveTextContent(dataItems[1].name);
39+
40+
dragAndDropListItem(firstListItem, dragAndDropDirectionDown);
41+
42+
const actualListItems = screen.getAllByTestId(
43+
`${listItemDataTestIdPrefix}${dataPath}`,
44+
);
45+
const actualFirstListItem = actualListItems[0];
46+
expect(actualFirstListItem).toHaveTextContent(dataItems[1].name);
47+
const actualSecondListItem = actualListItems[1];
48+
expect(actualSecondListItem).toHaveTextContent(dataItems[0].name);
49+
50+
await expectDatabaseUpdateToHaveCompleted(mockDatabaseUpdateFunction);
51+
const mockDatabaseUpdateFunctionCallArgument =
52+
mockDatabaseUpdateFunction.mock.calls[0][0];
53+
expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId);
54+
expect(mockDatabaseUpdateFunctionCallArgument.skills.items[0]).toEqual(
55+
dataItems[1],
56+
);
57+
expect(mockDatabaseUpdateFunctionCallArgument.skills.items[1]).toEqual(
58+
dataItems[0],
59+
);
60+
expect(
61+
mockDatabaseUpdateFunctionCallArgument.updatedAt,
62+
).toBeGreaterThanOrEqual(now);
63+
});

src/pages/app/__tests__/helpers/builder.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import {
3+
fireEvent,
34
render,
45
screen,
56
waitFor,
@@ -46,6 +47,36 @@ const expectDatabaseUpdateToHaveCompleted = async (
4647
);
4748
};
4849

50+
const dragAndDropDirectionUp = 'DND_DIRECTION_UP';
51+
const dragAndDropDirectionDown = 'DND_DIRECTION_DOWN';
52+
53+
const dragAndDropListItem = (listItemElement, direction) => {
54+
const spaceKey = { keyCode: 32 };
55+
const arrowUpKey = { keyCode: 38 };
56+
const arrowDownKey = { keyCode: 40 };
57+
const getKeyForDirection = () => {
58+
switch (direction) {
59+
case dragAndDropDirectionUp:
60+
return arrowUpKey;
61+
case dragAndDropDirectionDown:
62+
return arrowDownKey;
63+
default:
64+
throw new Error('Unhandled `direction`!');
65+
}
66+
};
67+
68+
listItemElement.focus();
69+
70+
// enable keyboard dragging
71+
fireEvent.keyDown(listItemElement, spaceKey);
72+
73+
// move element based on direction
74+
fireEvent.keyDown(listItemElement, getKeyForDirection());
75+
76+
// disable keyboard dragging
77+
fireEvent.keyDown(listItemElement, spaceKey);
78+
};
79+
4980
// eslint-disable-next-line no-underscore-dangle
5081
async function _setup(
5182
resumeId,
@@ -124,4 +155,7 @@ export {
124155
setupAndWait,
125156
waitForDatabaseUpdateToHaveCompletedFn as waitForDatabaseUpdateToHaveCompleted,
126157
expectDatabaseUpdateToHaveCompleted,
158+
dragAndDropDirectionUp,
159+
dragAndDropDirectionDown,
160+
dragAndDropListItem,
127161
};

0 commit comments

Comments
 (0)