diff --git a/jest.config.ts b/jest.config.ts index d3a2a766..227f26b2 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -7,6 +7,7 @@ const config: JestConfigWithTsJest = { // TODO: put this back when all unit tests are converted // '**/__tests__/**/*.test.ts', '**/__tests__/lib/*.test.ts', + '**/__tests__/lib/item-input/*.test.ts', ], setupFilesAfterEnv: ['jest-extended/all'], collectCoverageFrom: ['src/**/*.ts'], diff --git a/src/__tests__/lib/item-input/array.test.ts b/src/__tests__/lib/item-input/array.test.ts index 0b3b54b9..57b130ec 100644 --- a/src/__tests__/lib/item-input/array.test.ts +++ b/src/__tests__/lib/item-input/array.test.ts @@ -1,3 +1,5 @@ +import { jest } from '@jest/globals' + import inquirer from 'inquirer' import { @@ -13,20 +15,31 @@ import { maxItemValueLength, uneditable, } from '../../../lib/item-input/defs.js' -import { arrayDef, checkboxDef } from '../../../lib/item-input/array.js' import { clipToMaximum, stringFromUnknown } from '../../../lib/util.js' -jest.mock('inquirer') -jest.mock('../../../lib/util.js') - -const promptMock = jest.mocked(inquirer.prompt) +const promptMock: jest.Mock = jest.fn() +jest.unstable_mockModule('inquirer', () => ({ + default: { + prompt: promptMock, + Separator: inquirer.Separator, + }, +})) +const clipToMaximumMock: jest.Mock = jest.fn() +clipToMaximumMock.mockReturnValue('clipped') +const stringFromUnknownMock: jest.Mock = jest.fn() +jest.unstable_mockModule('../../../lib/util.js', () => ({ + clipToMaximum: clipToMaximumMock, + stringFromUnknown: stringFromUnknownMock, +})) // ignore console output jest.spyOn(process.stdout, 'write').mockImplementation(() => true) const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => true) -const clipToMaximumMock = jest.mocked(clipToMaximum).mockReturnValue('clipped') + +const { arrayDef, checkboxDef } = await import('../../../lib/item-input/array.js') + describe('arrayDef', () => { const itemBuildFromUserInputMock = jest.fn() @@ -616,8 +629,6 @@ describe('checkboxDef', () => { }) describe('summarizeForEdit', () => { - const stringFromUnknownMock = jest.mocked(stringFromUnknown) - it('returns empty clipped string with no items', async () => { expect(simpleDef.summarizeForEdit([])).toBe('clipped') diff --git a/src/__tests__/lib/item-input/misc.test.ts b/src/__tests__/lib/item-input/misc.test.ts index 8979d2a5..706b03e6 100644 --- a/src/__tests__/lib/item-input/misc.test.ts +++ b/src/__tests__/lib/item-input/misc.test.ts @@ -1,7 +1,35 @@ +import { jest } from '@jest/globals' + import inquirer from 'inquirer' import { InputDefinition, cancelOption, uneditable } from '../../../lib/item-input/defs.js' import { + askForBoolean, + askForString, + askForOptionalString, + ValidateFunction, +} from '../../../lib/user-query.js' +import { stringFromUnknown } from '../../../lib/util.js' + + +const promptMock: jest.Mock = jest.fn() +jest.unstable_mockModule('inquirer', () => ({ + default: { + prompt: promptMock, + Separator: inquirer.Separator, + }, +})) +const askForBooleanMock: jest.Mock = jest.fn() +const askForStringMock: jest.Mock = jest.fn() +const askForOptionalStringMock: jest.Mock = jest.fn() +jest.unstable_mockModule('../../../lib/user-query.js', () => ({ + askForBoolean: askForBooleanMock, + askForString: askForStringMock, + askForOptionalString: askForOptionalStringMock, +})) + + +const { booleanDef, computedDef, defaultWithContextFn, @@ -11,20 +39,8 @@ import { staticDef, stringDef, validateWithContextFn, -} from '../../../lib/item-input/misc.js' -import { - askForBoolean, - askForString, - askForOptionalString, - ValidateFunction, -} from '../../../lib/user-query.js' -import { stringFromUnknown } from '../../../lib/util.js' - - -jest.mock('inquirer') -jest.mock('../../../lib/user-query.js') +} = await import('../../../lib/item-input/misc.js') -const promptMock = jest.mocked(inquirer.prompt) describe('validateWithContext', () => { it('returns undefined when not given a validation function to convert', () => { @@ -72,8 +88,6 @@ describe('defaultWithContextFn', () => { }) describe('optionalStringDef', () => { - const askForOptionalStringMock = jest.mocked(askForOptionalString) - describe('without validation', () => { const def = optionalStringDef('String Def') @@ -147,8 +161,6 @@ describe('optionalStringDef', () => { }) describe('stringDef', () => { - const askForStringMock = jest.mocked(askForString) - describe('without validation', () => { const def = stringDef('String Def') @@ -220,7 +232,6 @@ describe('stringDef', () => { }) describe('booleanDef', () => { - const askForBooleanMock = jest.mocked(askForBoolean) const def = booleanDef('Boolean Def') test('name', async () => { diff --git a/src/__tests__/lib/item-input/object.test.ts b/src/__tests__/lib/item-input/object.test.ts index 420062fe..3f63350d 100644 --- a/src/__tests__/lib/item-input/object.test.ts +++ b/src/__tests__/lib/item-input/object.test.ts @@ -1,10 +1,22 @@ +import { jest } from '@jest/globals' + import inquirer from 'inquirer' import { cancelAction, finishAction, helpAction, InputDefinition, inquirerPageSize } from '../../../lib/item-input/defs' -import { objectDef, ObjectItemTypeData } from '../../../lib/item-input/object.js' +import { ObjectItemTypeData } from '../../../lib/item-input/object.js' + + +const promptMock: jest.Mock = jest.fn() +jest.unstable_mockModule('inquirer', () => ({ + default: { + prompt: promptMock, + Separator: inquirer.Separator, + }, +})) + +const { objectDef } = await import('../../../lib/item-input/object.js') -jest.mock('inquirer') type InputtedThing = { prop1: string @@ -14,7 +26,6 @@ type InputtedThing = { } describe('objectDef', () => { const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => true) - const promptMock = jest.mocked(inquirer.prompt) const input1BuildFromUserInputMock = jest.fn() const input1SummarizeForEditMock = jest.fn()