Skip to content

Commit 8ddd31b

Browse files
committed
feat: add userEvent keyboard events
1 parent 5dd26b1 commit 8ddd31b

File tree

10 files changed

+485
-137
lines changed

10 files changed

+485
-137
lines changed

src/__tests__/events.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
const {resolve} = require('path')
2+
const isRunning = require('is-running')
3+
const {render} = require('../pure')
4+
const {fireEvent} = require('../events')
5+
const {waitFor} = require("../wait-for");
6+
const {getConfig, configure} = require("../config");
7+
8+
let originalConfig
9+
beforeEach(() => {
10+
originalConfig = getConfig()
11+
configure({asyncUtilTimeout: 15000})
12+
})
13+
14+
afterEach(() => {
15+
configure(originalConfig)
16+
})
17+
18+
// TODO: fireEvent should not be bound
19+
20+
// Refactor to use `fireEvent` and not `userEvent` style
21+
test.skip('Is able to use fireEvent as function', async () => {
22+
const props = await render('node', [
23+
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
24+
])
25+
26+
const {clear, findByText} = props;
27+
28+
const instance = await findByText('First option')
29+
30+
expect(instance).toBeTruthy()
31+
32+
// Windows uses ">", Linux/MacOS use "❯"
33+
expect(await findByText(/[>] One/)).toBeTruthy()
34+
35+
clear()
36+
37+
fireEvent(instance, 'down')
38+
39+
expect(await findByText(/[>] Two/)).toBeTruthy()
40+
41+
clear()
42+
43+
fireEvent(instance, 'enter')
44+
45+
expect(await findByText('First option: Two')).toBeTruthy()
46+
})
47+
48+
// Refactor to use `fireEvent` and not `userEvent` style
49+
// TODO: fireEvent should not be bound
50+
test.skip('fireEvent works when bound', async () => {
51+
const {fireEvent: fireEventLocal, findByText, clear} = await render('node', [
52+
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
53+
])
54+
55+
const instance = await findByText('First option')
56+
57+
expect(instance).toBeTruthy()
58+
59+
// Windows uses ">", Linux/MacOS use "❯"
60+
expect(await findByText(/[>] One/)).toBeTruthy()
61+
62+
clear();
63+
64+
fireEventLocal.down()
65+
66+
expect(await findByText(/[>] Two/)).toBeTruthy()
67+
68+
fireEventLocal.enter()
69+
fireEventLocal.enter()
70+
clear();
71+
})
72+
73+
// Refactor to use `fireEvent` and not `userEvent` style
74+
// TODO: fireEvent should not be bound
75+
test.skip('fireEvent works when bound and used as function', async () => {
76+
const {fireEvent: fireEventLocal, findByText, clear} = await render('node', [
77+
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
78+
])
79+
80+
const instance = await findByText('First option')
81+
82+
expect(instance).toBeTruthy()
83+
84+
// Windows uses ">", Linux/MacOS use "❯"
85+
expect(await findByText(/[>] One/)).toBeTruthy()
86+
87+
clear();
88+
89+
fireEventLocal('down')
90+
91+
expect(await findByText(/[>] Two/)).toBeTruthy()
92+
93+
fireEventLocal('enter')
94+
fireEventLocal('enter')
95+
clear();
96+
})
97+
98+
// Refactor to use `fireEvent` and not `userEvent` style
99+
test.skip('SigTerm works', async () => {
100+
const {findByText} = await render('node', [
101+
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
102+
])
103+
104+
const instance = await findByText('First option')
105+
106+
expect(instance).toBeTruthy()
107+
108+
fireEvent.sigterm(instance);
109+
110+
await waitFor(() => expect(isRunning(instance.pid)).toBeFalsy())
111+
})
112+
113+
test.todo('userEvent SigTerm works')
114+
115+
// Refactor to use `fireEvent` and not `userEvent` style
116+
test.skip('input works', async () => {
117+
const {findByText, fireEvent: fireEventLocal, clear} = await render('node', [
118+
resolve(__dirname, './execute-scripts/stdio-inquirer-input.js'),
119+
])
120+
121+
expect(await findByText('What is your name?')).toBeTruthy()
122+
123+
fireEventLocal.keyboard("Corbin");
124+
125+
expect(await findByText('Corbin')).toBeTruthy()
126+
127+
fireEventLocal.enter();
128+
129+
clear()
130+
})
131+
132+
test.todo("UserEvent.keyboard works")

src/__tests__/render-basics.js

Lines changed: 1 addition & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ test('Should handle argument passing', async () => {
3030
expect(await findByText('--version')).toBeTruthy()
3131
})
3232

33+
// TODO: Replace fireEvent with userevent
3334
test('Is able to make terminal input and view in-progress stdout', async () => {
3435
const props = await render('node', [
3536
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
@@ -56,107 +57,3 @@ test('Is able to make terminal input and view in-progress stdout', async () => {
5657

5758
expect(await findByText('First option: Two')).toBeTruthy()
5859
})
59-
60-
test('Is able to use fireEvent as function', async () => {
61-
const props = await render('node', [
62-
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
63-
])
64-
65-
const {clear, findByText} = props;
66-
67-
const instance = await findByText('First option')
68-
69-
expect(instance).toBeTruthy()
70-
71-
// Windows uses ">", Linux/MacOS use "❯"
72-
expect(await findByText(/[>] One/)).toBeTruthy()
73-
74-
clear()
75-
76-
fireEvent(instance, 'down')
77-
78-
expect(await findByText(/[>] Two/)).toBeTruthy()
79-
80-
clear()
81-
82-
fireEvent(instance, 'enter')
83-
84-
expect(await findByText('First option: Two')).toBeTruthy()
85-
})
86-
87-
test('fireEvent works when bound', async () => {
88-
const {fireEvent: fireEventLocal, findByText, clear} = await render('node', [
89-
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
90-
])
91-
92-
const instance = await findByText('First option')
93-
94-
expect(instance).toBeTruthy()
95-
96-
// Windows uses ">", Linux/MacOS use "❯"
97-
expect(await findByText(/[>] One/)).toBeTruthy()
98-
99-
clear();
100-
101-
fireEventLocal.down()
102-
103-
expect(await findByText(/[>] Two/)).toBeTruthy()
104-
105-
fireEventLocal.enter()
106-
fireEventLocal.enter()
107-
clear();
108-
})
109-
110-
test('fireEvent works when bound and used as function', async () => {
111-
const {fireEvent: fireEventLocal, findByText, clear} = await render('node', [
112-
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
113-
])
114-
115-
const instance = await findByText('First option')
116-
117-
expect(instance).toBeTruthy()
118-
119-
// Windows uses ">", Linux/MacOS use "❯"
120-
expect(await findByText(/[>] One/)).toBeTruthy()
121-
122-
clear();
123-
124-
fireEventLocal('down')
125-
126-
expect(await findByText(/[>] Two/)).toBeTruthy()
127-
128-
fireEventLocal('enter')
129-
fireEventLocal('enter')
130-
clear();
131-
})
132-
133-
test('SigTerm works', async () => {
134-
const {findByText} = await render('node', [
135-
resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
136-
])
137-
138-
const instance = await findByText('First option')
139-
140-
expect(instance).toBeTruthy()
141-
142-
fireEvent.sigterm(instance);
143-
144-
await waitFor(() => expect(isRunning(instance.pid)).toBeFalsy())
145-
})
146-
147-
test('input works', async () => {
148-
const {findByText, fireEvent: fireEventLocal, clear} = await render('node', [
149-
resolve(__dirname, './execute-scripts/stdio-inquirer-input.js'),
150-
])
151-
152-
expect(await findByText('What is your name?')).toBeTruthy()
153-
154-
fireEventLocal.type("Corbin");
155-
156-
expect(await findByText('Corbin')).toBeTruthy()
157-
158-
fireEventLocal.enter();
159-
160-
clear()
161-
})
162-

src/event-map.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@ import {TestInstance} from "../types/pure";
44
import isRunning from 'is-running';
55

66
const eventMap = {
7-
down: (instance: TestInstance) => instance.stdin.write('\x1B\x5B\x42'),
8-
up: (instance: TestInstance) => instance.stdin.write('\x1B\x5B\x41'),
9-
enter: (instance: TestInstance) => instance.stdin.write('\x0D'),
107
sigterm: (instance: TestInstance) => instance.pid && isRunning(instance.pid) && kill(instance.pid),
118
sigkill: (instance: TestInstance) => instance.pid && isRunning(instance.pid) && kill(instance.pid, 'SIGKILL'),
12-
type: (instance: TestInstance, text: string) => instance.stdin.write(text)
9+
write: (instance: TestInstance, props: {value: string}) => instance.stdin.write(props.value)
1310
}
1411

1512
export {eventMap}

src/events.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import {eventMap} from './event-map'
44
* Silence TypeScript errors
55
* @type {*}
66
*/
7-
const fireEvent = (instance, event) => {
8-
fireEvent[event](instance);
7+
const fireEvent = (instance, event, props = undefined) => {
8+
fireEvent[event](instance, props);
99
}
1010

1111
Object.entries(eventMap).forEach(

0 commit comments

Comments
 (0)