Skip to content

Commit a4fe7b6

Browse files
committed
test: fixed failing tests
1 parent 70ce9e5 commit a4fe7b6

File tree

3 files changed

+124
-40
lines changed

3 files changed

+124
-40
lines changed

__tests__/utils/fs.test.js

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,63 @@
1-
import { jest } from '@jest/globals';
1+
import { jest, describe, test, beforeEach, afterEach, expect } from '@jest/globals';
22
import { faker } from '@faker-js/faker';
3-
import { writeFileSync } from 'fs';
4-
import {
5-
writeFile,
6-
writeJSONFile,
7-
} from '../../src/utils/fs.js';
8-
import { confirm } from '../../src/ux/confirm.js';
9-
import fs from 'fs';
10-
11-
jest.mock('fs');
12-
jest.mock('../../src/ux/confirm');
3+
import { mockConsole } from '../helpers.js';
134

145
describe('Utils: File system', () => {
6+
7+
beforeEach(() => {
8+
mockConsole();
9+
});
10+
11+
afterEach(() => {
12+
jest.clearAllMocks();
13+
});
14+
1515
test('Will write file', async () => {
16+
jest.unstable_mockModule('node:fs', () => jest.createMockFromModule('node:fs'));
17+
jest.unstable_mockModule('../../src/ux/confirm.js', () => ({ confirm: jest.fn() }));
18+
19+
const { writeFileSync } = await import('node:fs');
20+
const { confirm } = await import('../../src/ux/confirm.js');
21+
1622
const testFile = faker.system.filePath();
23+
const { writeFile } = await import('../../src/utils/fs.js');
24+
1725
await writeFile(testFile, 'new data');
26+
1827
expect(confirm).not.toHaveBeenCalled();
1928
expect(writeFileSync).toHaveBeenCalledWith(testFile, 'new data');
20-
2129
});
2230

2331
test('Will confirm before writing file', async () => {
24-
const testFile = faker.system.filePath();
32+
jest.unstable_mockModule('node:fs', () => jest.createMockFromModule('node:fs'));
33+
jest.unstable_mockModule('../../src/ux/confirm.js', () => ({ confirm: jest.fn() }));
2534

26-
fs.__addFile(testFile, 'test data');
35+
const { writeFileSync, existsSync } = await import('node:fs');
36+
const { confirm } = await import('../../src/ux/confirm.js');
2737

38+
const testFile = faker.system.filePath();
39+
const { writeFile } = await import('../../src/utils/fs.js');
40+
41+
existsSync.mockResolvedValueOnce(true);
2842
confirm.mockResolvedValueOnce(true);
2943

3044
await writeFile(testFile, 'new data');
3145
expect(confirm).toHaveBeenCalledWith(`Overwirte file ${testFile}?`);
46+
expect(existsSync).toHaveBeenCalledWith(testFile);
3247
expect(writeFileSync).toHaveBeenCalledWith(testFile, 'new data');
3348
});
3449

3550
test('Will confirm before writing file but not write when user declines', async () => {
36-
const testFile = faker.system.filePath();
51+
jest.unstable_mockModule('node:fs', () => jest.createMockFromModule('node:fs'));
52+
jest.unstable_mockModule('../../src/ux/confirm.js', () => ({ confirm: jest.fn() }));
3753

38-
fs.__addFile(testFile, 'test data');
54+
const { writeFileSync, existsSync } = await import('node:fs');
55+
const { confirm } = await import('../../src/ux/confirm.js');
3956

57+
const testFile = faker.system.filePath();
58+
const { writeFile } = await import('../../src/utils/fs.js');
59+
60+
existsSync.mockResolvedValueOnce(true);
4061
confirm.mockResolvedValueOnce(false);
4162

4263
await expect(() => writeFile(testFile, 'new data')).rejects.toThrow('User declined to overwrite file');
@@ -45,13 +66,20 @@ describe('Utils: File system', () => {
4566
});
4667

4768
test('Will write JSON file', async () => {
69+
jest.unstable_mockModule('node:fs', () => jest.createMockFromModule('node:fs'));
70+
jest.unstable_mockModule('../../src/ux/confirm.js', () => ({ confirm: jest.fn() }));
71+
72+
const { writeFileSync } = await import('node:fs');
73+
const { confirm } = await import('../../src/ux/confirm.js');
74+
4875
const testFile = faker.system.filePath();
49-
await writeJSONFile(testFile, {foo: 'bar'});
76+
const { writeJSONFile } = await import('../../src/utils/fs.js');
77+
await writeJSONFile(testFile, { foo: 'bar' });
5078
expect(confirm).not.toHaveBeenCalled();
5179
expect(writeFileSync).toHaveBeenCalledWith(
5280
testFile,
5381
JSON.stringify(
54-
{foo: 'bar'},
82+
{ foo: 'bar' },
5583
null,
5684
2,
5785
),

__tests__/ux/confirm.test.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,34 @@
11
import { jest } from '@jest/globals';
2-
import { confirm } from '../../src/ux/confirm.js';
3-
import { inputFromTTY } from '../../src/ux/input.js';
4-
5-
jest.mock('../../src/ux/input');
62

73
describe('UX: confirm', () => {
4+
jest.unstable_mockModule('../../src/ux/input', () => ({ inputFromTTY: jest.fn() }));
5+
86
test('Will confrim the message with y', async () => {
7+
const { inputFromTTY } = await import('../../src/ux/input.js');
8+
99
inputFromTTY.mockResolvedValue('y');
10+
const { confirm } = await import('../../src/ux/confirm.js');
1011

1112
const result = await confirm('Are you sure?');
1213
expect(result).toBe(true);
13-
expect(inputFromTTY).toHaveBeenCalledWith({message: 'Are you sure?', length: 1});
14+
expect(inputFromTTY).toHaveBeenCalledWith({ message: 'Are you sure?', length: 1 });
1415
expect(inputFromTTY).toHaveBeenCalledTimes(1);
1516
});
1617

1718
test('Will confrim the message with n', async () => {
19+
const { inputFromTTY } = await import('../../src/ux/input.js');
1820
inputFromTTY.mockResolvedValue('n');
1921

22+
const { confirm } = await import('../../src/ux/confirm.js');
2023
const result = await confirm('Are you sure?');
2124
expect(result).toBe(false);
2225
});
2326

2427
test('Will keep asking with invalid input message', async () => {
28+
const { inputFromTTY } = await import('../../src/ux/input.js');
2529
inputFromTTY.mockResolvedValue('x').mockResolvedValue('y');
2630

31+
const { confirm } = await import('../../src/ux/confirm.js');
2732
const result = await confirm('Are you sure?');
2833
expect(result).toBe(true);
2934
});

__tests__/ux/input.test.js

Lines changed: 68 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,93 @@
11
import { jest } from '@jest/globals';
2-
import { inputFromTTY } from '../../src/ux/input.js';
3-
import readline from 'readline';
2+
import EventEmitter from 'node:events';
3+
import { mockConsole } from '../helpers.js';
44

5-
jest.mock('readline');
5+
jest.mock('node:readline');
66
jest.useFakeTimers();
77

88
describe('UX: input tests', () => {
9-
setTimeout(() => readline.__inputMock.emit('keypress', 'f', {name: 'f'}), 10);
9+
const questionMock = jest.fn();
10+
const emitKeypressEventsMock = jest.fn();
11+
const rlOn = jest.fn();
12+
const rlOff = jest.fn();
13+
const readline = jest.createMockFromModule('readline');
14+
jest.unstable_mockModule('readline', () => ({ default: readline }));
15+
16+
const inputMock = new EventEmitter();
17+
18+
const closeMock = jest.fn().mockImplementation(() => undefined);
19+
20+
const createInterface = jest.fn().mockReturnValue({
21+
question: questionMock,
22+
close: closeMock,
23+
emitKeypressEvents: emitKeypressEventsMock,
24+
input: inputMock,
25+
on: rlOn,
26+
off: rlOff,
27+
});
28+
29+
readline.createInterface = createInterface;
30+
readline.emitKeypressEvents = emitKeypressEventsMock;
31+
readline.input = inputMock;
32+
33+
beforeEach(() => {
34+
mockConsole();
35+
});
36+
37+
afterEach(() => {
38+
jest.clearAllMocks();
39+
});
40+
1041
test('Will capture printable keys', async () => {
11-
setTimeout(() => readline.__inputMock.emit('keypress', 'o', {name: 'o'}), 11);
12-
setTimeout(() => readline.__inputMock.emit('keypress', 'o', {name: 'o'}), 12);
13-
setTimeout(() => readline.__inputMock.emit('keypress', '\r', {name: 'return'}), 20);
42+
43+
setTimeout(() => inputMock.emit('keypress', 'f', { name: 'f' }), 10);
44+
setTimeout(() => inputMock.emit('keypress', 'o', { name: 'o' }), 11);
45+
setTimeout(() => inputMock.emit('keypress', 'o', { name: 'o' }), 12);
46+
setTimeout(() => inputMock.emit('keypress', '\r', { name: 'return' }), 20);
47+
48+
const { inputFromTTY } = await import('../../src/ux/input.js');
49+
1450
const input = inputFromTTY({});
51+
1552
jest.advanceTimersByTime(100);
53+
54+
1655
const result = await Promise.resolve(input);
56+
1757
expect(result).toBe('foo');
1858
});
1959

2060
test('Will delete characters with delete key', async () => {
21-
setTimeout(() => readline.__inputMock.emit('keypress', 'f', {name: 'f'}), 10);
22-
setTimeout(() => readline.__inputMock.emit('keypress', 'o', {name: 'o'}), 11);
23-
setTimeout(() => readline.__inputMock.emit('keypress', 'o', {name: 'o'}), 12);
24-
setTimeout(() => readline.__inputMock.emit('keypress', '', {name: 'delete'}), 13);
25-
setTimeout(() => readline.__inputMock.emit('keypress', '\r', {name: 'return'}), 20);
61+
62+
setTimeout(() => inputMock.emit('keypress', 'f', { name: 'f' }), 10);
63+
setTimeout(() => inputMock.emit('keypress', 'o', { name: 'o' }), 11);
64+
setTimeout(() => inputMock.emit('keypress', 'o', { name: 'o' }), 12);
65+
setTimeout(() => inputMock.emit('keypress', '', { name: 'delete' }), 13);
66+
67+
setTimeout(() => inputMock.emit('keypress', '\r', { name: 'return' }), 20);
68+
69+
const { inputFromTTY } = await import('../../src/ux/input.js');
2670
const input = inputFromTTY({});
71+
2772
jest.advanceTimersByTime(100);
73+
2874
const result = await Promise.resolve(input);
75+
2976
expect(result).toBe('fo');
3077
});
3178

3279
test('Will delete characters with backspace key', async () => {
33-
setTimeout(() => readline.__inputMock.emit('keypress', 'f', {name: 'f'}), 10);
34-
setTimeout(() => readline.__inputMock.emit('keypress', 'o', {name: 'o'}), 11);
35-
setTimeout(() => readline.__inputMock.emit('keypress', 'o', {name: 'o'}), 12);
36-
setTimeout(() => readline.__inputMock.emit('keypress', '', {name: 'backspace'}), 13);
37-
setTimeout(() => readline.__inputMock.emit('keypress', '\r', {name: 'return'}), 20);
80+
setTimeout(() => inputMock.emit('keypress', 'f', { name: 'f' }), 10);
81+
setTimeout(() => inputMock.emit('keypress', 'o', { name: 'o' }), 11);
82+
setTimeout(() => inputMock.emit('keypress', 'o', { name: 'o' }), 12);
83+
setTimeout(() => inputMock.emit('keypress', '', { name: 'backspace' }), 13);
84+
setTimeout(() => inputMock.emit('keypress', '\r', { name: 'return' }), 20);
85+
86+
const { inputFromTTY } = await import('../../src/ux/input.js');
3887
const input = inputFromTTY({});
88+
3989
jest.advanceTimersByTime(100);
90+
4091
const result = await Promise.resolve(input);
4192
expect(result).toBe('fo');
4293
});

0 commit comments

Comments
 (0)