From f8d96cda232d631f3803af53f9c179b633a3b4e0 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Tue, 22 Nov 2022 19:58:52 +0000 Subject: [PATCH 1/7] =?UTF-8?q?test:=20=F0=9F=94=84=20separate=20moduleRes?= =?UTF-8?q?olver=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/lib/parse.moduleResolver.test.ts | 143 ++++++++++++++++++ .../typescript-estree/tests/lib/parse.test.ts | 90 ----------- 2 files changed, 143 insertions(+), 90 deletions(-) create mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.test.ts diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.test.ts new file mode 100644 index 000000000000..4aa9796bdf84 --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.test.ts @@ -0,0 +1,143 @@ +import { join, resolve } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('parseAndGenerateServices', () => { + describe('moduleResolver', () => { + beforeEach(() => { + parser.clearCaches(); + }); + + const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); + const code = ` + import { something } from '__PLACEHOLDER__'; + + something(); + `; + const config: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + project: './tsconfig.json', + tsconfigRootDir: PROJECT_DIR, + filePath: resolve(PROJECT_DIR, 'file.ts'), + }; + const withDefaultProgramConfig: TSESTreeOptions = { + ...config, + project: './tsconfig.defaultProgram.json', + createDefaultProgram: true, + }; + + describe('when file is in the project', () => { + it('returns error if __PLACEHOLDER__ can not be resolved', () => { + expect( + parser + .parseAndGenerateServices(code, config) + .services.program.getSemanticDiagnostics(), + ).toHaveProperty( + [0, 'messageText'], + "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", + ); + }); + + it('throws error if moduleResolver can not be found', () => { + expect(() => + parser.parseAndGenerateServices(code, { + ...config, + moduleResolver: resolve( + PROJECT_DIR, + './this_moduleResolver_does_not_exist.js', + ), + }), + ).toThrowErrorMatchingInlineSnapshot(` + "Could not find the provided parserOptions.moduleResolver. + Hint: use an absolute path if you are not in control over where the ESLint instance runs." + `); + }); + + it('resolves __PLACEHOLDER__ correctly', () => { + expect( + parser + .parseAndGenerateServices(code, { + ...config, + moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + }) + .services.program.getSemanticDiagnostics(), + ).toHaveLength(0); + }); + }); + + describe('when file is not in the project and createDefaultProgram=true', () => { + it('returns error because __PLACEHOLDER__ can not be resolved', () => { + expect( + parser + .parseAndGenerateServices(code, withDefaultProgramConfig) + .services.program.getSemanticDiagnostics(), + ).toHaveProperty( + [0, 'messageText'], + "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", + ); + }); + + it('resolves __PLACEHOLDER__ correctly', () => { + expect( + parser + .parseAndGenerateServices(code, { + ...withDefaultProgramConfig, + moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + }) + .services.program.getSemanticDiagnostics(), + ).toHaveLength(0); + }); + }); + }); +}); diff --git a/packages/typescript-estree/tests/lib/parse.test.ts b/packages/typescript-estree/tests/lib/parse.test.ts index dab87e38ab6c..049aca049470 100644 --- a/packages/typescript-estree/tests/lib/parse.test.ts +++ b/packages/typescript-estree/tests/lib/parse.test.ts @@ -752,94 +752,4 @@ describe('parseAndGenerateServices', () => { expect(testParse('includeme', ignore)).not.toThrow(); }); }); - - describe('moduleResolver', () => { - beforeEach(() => { - parser.clearCaches(); - }); - - const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); - const code = ` - import { something } from '__PLACEHOLDER__'; - - something(); - `; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - project: './tsconfig.json', - tsconfigRootDir: PROJECT_DIR, - filePath: resolve(PROJECT_DIR, 'file.ts'), - }; - const withDefaultProgramConfig: TSESTreeOptions = { - ...config, - project: './tsconfig.defaultProgram.json', - createDefaultProgram: true, - }; - - describe('when file is in the project', () => { - it('returns error if __PLACEHOLDER__ can not be resolved', () => { - expect( - parser - .parseAndGenerateServices(code, config) - .services.program.getSemanticDiagnostics(), - ).toHaveProperty( - [0, 'messageText'], - "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", - ); - }); - - it('throws error if moduleResolver can not be found', () => { - expect(() => - parser.parseAndGenerateServices(code, { - ...config, - moduleResolver: resolve( - PROJECT_DIR, - './this_moduleResolver_does_not_exist.js', - ), - }), - ).toThrowErrorMatchingInlineSnapshot(` - "Could not find the provided parserOptions.moduleResolver. - Hint: use an absolute path if you are not in control over where the ESLint instance runs." - `); - }); - - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...config, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), - }) - .services.program.getSemanticDiagnostics(), - ).toHaveLength(0); - }); - }); - - describe('when file is not in the project and createDefaultProgram=true', () => { - it('returns error because __PLACEHOLDER__ can not be resolved', () => { - expect( - parser - .parseAndGenerateServices(code, withDefaultProgramConfig) - .services.program.getSemanticDiagnostics(), - ).toHaveProperty( - [0, 'messageText'], - "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", - ); - }); - - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...withDefaultProgramConfig, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), - }) - .services.program.getSemanticDiagnostics(), - ).toHaveLength(0); - }); - }); - }); }); From fe90484ee946b771931776c9daba9b8295a368e3 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Tue, 22 Nov 2022 20:41:44 +0000 Subject: [PATCH 2/7] =?UTF-8?q?test:=20=F0=9F=94=84=20split=20moduleResolv?= =?UTF-8?q?er=20by=204=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...duleResolver.default-program-error.test.ts | 93 +++++++++++++++++++ ...leResolver.default-program-success.test.ts | 93 +++++++++++++++++++ ....moduleResolver.placeholder-error.test.ts} | 40 -------- ...moduleResolver.placeholder-success.test.ts | 88 ++++++++++++++++++ 4 files changed, 274 insertions(+), 40 deletions(-) create mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts create mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts rename packages/typescript-estree/tests/lib/{parse.moduleResolver.test.ts => parse.moduleResolver.placeholder-error.test.ts} (68%) create mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts new file mode 100644 index 000000000000..7108c994d6df --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts @@ -0,0 +1,93 @@ +import { join, resolve } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('parseAndGenerateServices', () => { + describe('moduleResolver', () => { + beforeEach(() => { + parser.clearCaches(); + }); + + const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); + const code = ` + import { something } from '__PLACEHOLDER__'; + + something(); + `; + const config: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + project: './tsconfig.json', + tsconfigRootDir: PROJECT_DIR, + filePath: resolve(PROJECT_DIR, 'file.ts'), + }; + const withDefaultProgramConfig: TSESTreeOptions = { + ...config, + project: './tsconfig.defaultProgram.json', + createDefaultProgram: true, + }; + + describe('when file is not in the project and createDefaultProgram=true', () => { + it('returns error because __PLACEHOLDER__ can not be resolved', () => { + expect( + parser + .parseAndGenerateServices(code, withDefaultProgramConfig) + .services.program.getSemanticDiagnostics(), + ).toHaveProperty( + [0, 'messageText'], + "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", + ); + }); + }); + }); +}); diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts new file mode 100644 index 000000000000..f45dcb0d9c02 --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts @@ -0,0 +1,93 @@ +import { join, resolve } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('parseAndGenerateServices', () => { + describe('moduleResolver', () => { + beforeEach(() => { + parser.clearCaches(); + }); + + const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); + const code = ` + import { something } from '__PLACEHOLDER__'; + + something(); + `; + const config: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + project: './tsconfig.json', + tsconfigRootDir: PROJECT_DIR, + filePath: resolve(PROJECT_DIR, 'file.ts'), + }; + const withDefaultProgramConfig: TSESTreeOptions = { + ...config, + project: './tsconfig.defaultProgram.json', + createDefaultProgram: true, + }; + + describe('when file is not in the project and createDefaultProgram=true', () => { + it('resolves __PLACEHOLDER__ correctly', () => { + expect( + parser + .parseAndGenerateServices(code, { + ...withDefaultProgramConfig, + moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + }) + .services.program.getSemanticDiagnostics(), + ).toHaveLength(0); + }); + }); + }); +}); diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts similarity index 68% rename from packages/typescript-estree/tests/lib/parse.moduleResolver.test.ts rename to packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts index 4aa9796bdf84..797a93c8d8d5 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts @@ -71,11 +71,6 @@ describe('parseAndGenerateServices', () => { tsconfigRootDir: PROJECT_DIR, filePath: resolve(PROJECT_DIR, 'file.ts'), }; - const withDefaultProgramConfig: TSESTreeOptions = { - ...config, - project: './tsconfig.defaultProgram.json', - createDefaultProgram: true, - }; describe('when file is in the project', () => { it('returns error if __PLACEHOLDER__ can not be resolved', () => { @@ -103,41 +98,6 @@ describe('parseAndGenerateServices', () => { Hint: use an absolute path if you are not in control over where the ESLint instance runs." `); }); - - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...config, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), - }) - .services.program.getSemanticDiagnostics(), - ).toHaveLength(0); - }); - }); - - describe('when file is not in the project and createDefaultProgram=true', () => { - it('returns error because __PLACEHOLDER__ can not be resolved', () => { - expect( - parser - .parseAndGenerateServices(code, withDefaultProgramConfig) - .services.program.getSemanticDiagnostics(), - ).toHaveProperty( - [0, 'messageText'], - "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", - ); - }); - - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...withDefaultProgramConfig, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), - }) - .services.program.getSemanticDiagnostics(), - ).toHaveLength(0); - }); }); }); }); diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts new file mode 100644 index 000000000000..f46ed62f9180 --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts @@ -0,0 +1,88 @@ +import { join, resolve } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('parseAndGenerateServices', () => { + describe('moduleResolver', () => { + beforeEach(() => { + parser.clearCaches(); + }); + + const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); + const code = ` + import { something } from '__PLACEHOLDER__'; + + something(); + `; + const config: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + project: './tsconfig.json', + tsconfigRootDir: PROJECT_DIR, + filePath: resolve(PROJECT_DIR, 'file.ts'), + }; + + describe('when file is in the project', () => { + it('resolves __PLACEHOLDER__ correctly', () => { + expect( + parser + .parseAndGenerateServices(code, { + ...config, + moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + }) + .services.program.getSemanticDiagnostics(), + ).toHaveLength(0); + }); + }); + }); +}); From f4abd7e17222ac0832b744598e2c1f21e8a93d8f Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 4 Dec 2022 21:27:16 +0000 Subject: [PATCH 3/7] =?UTF-8?q?test:=20=F0=9F=94=84=20clean=20parse.mr.def?= =?UTF-8?q?ault-program-error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit clean packages/typescript-estree/tests/lib/parse.moduleResolver.default- program-error.test.ts --- ...duleResolver.default-program-error.test.ts | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts index 7108c994d6df..31ad7e2fb794 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts @@ -1,51 +1,10 @@ import { join, resolve } from 'path'; import * as parser from '../../src'; -import type * as astConverterModule from '../../src/ast-converter'; -import type * as sharedParserUtilsModule from '../../src/create-program/shared'; import type { TSESTreeOptions } from '../../src/parser-options'; const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); -// we can't spy on the exports of an ES module - so we instead have to mock the entire module -jest.mock('../../src/ast-converter', () => { - const astConverterActual = jest.requireActual( - '../../src/ast-converter', - ); - - return { - ...astConverterActual, - __esModule: true, - astConverter: jest.fn(astConverterActual.astConverter), - }; -}); -jest.mock('../../src/create-program/shared', () => { - const sharedActual = jest.requireActual( - '../../src/create-program/shared', - ); - - return { - ...sharedActual, - __esModule: true, - createDefaultCompilerOptionsFromExtra: jest.fn( - sharedActual.createDefaultCompilerOptionsFromExtra, - ), - }; -}); - -// Tests in CI by default run with lowercase program file names, -// resulting in path.relative results starting with many "../"s -jest.mock('typescript', () => { - const ts = jest.requireActual('typescript'); - return { - ...ts, - sys: { - ...ts.sys, - useCaseSensitiveFileNames: true, - }, - }; -}); - beforeEach(() => { jest.clearAllMocks(); }); From a09427ff1f798267992cc8ec47ae61b07fd9858c Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 4 Dec 2022 21:28:53 +0000 Subject: [PATCH 4/7] =?UTF-8?q?test:=20=F0=9F=94=84=20clean=20parse.mr.def?= =?UTF-8?q?ault-program-success.test.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit clean parse.moduleResolver.default-program-success.test.ts --- ...leResolver.default-program-success.test.ts | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts index f45dcb0d9c02..2984ff318a3e 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts @@ -1,51 +1,10 @@ import { join, resolve } from 'path'; import * as parser from '../../src'; -import type * as astConverterModule from '../../src/ast-converter'; -import type * as sharedParserUtilsModule from '../../src/create-program/shared'; import type { TSESTreeOptions } from '../../src/parser-options'; const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); -// we can't spy on the exports of an ES module - so we instead have to mock the entire module -jest.mock('../../src/ast-converter', () => { - const astConverterActual = jest.requireActual( - '../../src/ast-converter', - ); - - return { - ...astConverterActual, - __esModule: true, - astConverter: jest.fn(astConverterActual.astConverter), - }; -}); -jest.mock('../../src/create-program/shared', () => { - const sharedActual = jest.requireActual( - '../../src/create-program/shared', - ); - - return { - ...sharedActual, - __esModule: true, - createDefaultCompilerOptionsFromExtra: jest.fn( - sharedActual.createDefaultCompilerOptionsFromExtra, - ), - }; -}); - -// Tests in CI by default run with lowercase program file names, -// resulting in path.relative results starting with many "../"s -jest.mock('typescript', () => { - const ts = jest.requireActual('typescript'); - return { - ...ts, - sys: { - ...ts.sys, - useCaseSensitiveFileNames: true, - }, - }; -}); - beforeEach(() => { jest.clearAllMocks(); }); From f0981ccaff766e039461735a2b35314ca27d994c Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 4 Dec 2022 21:30:09 +0000 Subject: [PATCH 5/7] =?UTF-8?q?test:=20=F0=9F=94=84=20clear=20parse.module?= =?UTF-8?q?Resolver.placeholder-error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit clear parse.moduleResolver.placeholder-error.test.ts --- ...e.moduleResolver.placeholder-error.test.ts | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts index 797a93c8d8d5..39efde2c19e5 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts @@ -1,51 +1,10 @@ import { join, resolve } from 'path'; import * as parser from '../../src'; -import type * as astConverterModule from '../../src/ast-converter'; -import type * as sharedParserUtilsModule from '../../src/create-program/shared'; import type { TSESTreeOptions } from '../../src/parser-options'; const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); -// we can't spy on the exports of an ES module - so we instead have to mock the entire module -jest.mock('../../src/ast-converter', () => { - const astConverterActual = jest.requireActual( - '../../src/ast-converter', - ); - - return { - ...astConverterActual, - __esModule: true, - astConverter: jest.fn(astConverterActual.astConverter), - }; -}); -jest.mock('../../src/create-program/shared', () => { - const sharedActual = jest.requireActual( - '../../src/create-program/shared', - ); - - return { - ...sharedActual, - __esModule: true, - createDefaultCompilerOptionsFromExtra: jest.fn( - sharedActual.createDefaultCompilerOptionsFromExtra, - ), - }; -}); - -// Tests in CI by default run with lowercase program file names, -// resulting in path.relative results starting with many "../"s -jest.mock('typescript', () => { - const ts = jest.requireActual('typescript'); - return { - ...ts, - sys: { - ...ts.sys, - useCaseSensitiveFileNames: true, - }, - }; -}); - beforeEach(() => { jest.clearAllMocks(); }); From 19ee315dd06ae5fbc47c083c0ca2800b24685b0b Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 4 Dec 2022 21:31:06 +0000 Subject: [PATCH 6/7] =?UTF-8?q?test:=20=F0=9F=94=84=20clear=20parse.module?= =?UTF-8?q?Resolver.placeholder-success?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit clear parse.moduleResolver.placeholder-success.test.ts --- ...moduleResolver.placeholder-success.test.ts | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts index f46ed62f9180..4bc5c5ea631c 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts @@ -1,51 +1,10 @@ import { join, resolve } from 'path'; import * as parser from '../../src'; -import type * as astConverterModule from '../../src/ast-converter'; -import type * as sharedParserUtilsModule from '../../src/create-program/shared'; import type { TSESTreeOptions } from '../../src/parser-options'; const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); -// we can't spy on the exports of an ES module - so we instead have to mock the entire module -jest.mock('../../src/ast-converter', () => { - const astConverterActual = jest.requireActual( - '../../src/ast-converter', - ); - - return { - ...astConverterActual, - __esModule: true, - astConverter: jest.fn(astConverterActual.astConverter), - }; -}); -jest.mock('../../src/create-program/shared', () => { - const sharedActual = jest.requireActual( - '../../src/create-program/shared', - ); - - return { - ...sharedActual, - __esModule: true, - createDefaultCompilerOptionsFromExtra: jest.fn( - sharedActual.createDefaultCompilerOptionsFromExtra, - ), - }; -}); - -// Tests in CI by default run with lowercase program file names, -// resulting in path.relative results starting with many "../"s -jest.mock('typescript', () => { - const ts = jest.requireActual('typescript'); - return { - ...ts, - sys: { - ...ts.sys, - useCaseSensitiveFileNames: true, - }, - }; -}); - beforeEach(() => { jest.clearAllMocks(); }); From 77b38fc20c2e8ff23dfc8b69aafda5b72ea75b0e Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 15 Jan 2023 16:42:45 +0000 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20=F0=9F=94=84=20create=20createA?= =?UTF-8?q?ndPrepareParseConfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moved common logic between tests to createAndPrepareParseConfig --- ...duleResolver.default-program-error.test.ts | 24 +--------- ...leResolver.default-program-success.test.ts | 26 ++--------- ...e.moduleResolver.placeholder-error.test.ts | 28 ++--------- ...moduleResolver.placeholder-success.test.ts | 28 ++--------- .../typescript-estree/tools/test-utils.ts | 46 ++++++++++++++++++- 5 files changed, 59 insertions(+), 93 deletions(-) diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts index 31ad7e2fb794..25557a24ef51 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts @@ -1,9 +1,6 @@ -import { join, resolve } from 'path'; - import * as parser from '../../src'; import type { TSESTreeOptions } from '../../src/parser-options'; - -const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); +import { createAndPrepareParseConfig } from '../../tools/test-utils'; beforeEach(() => { jest.clearAllMocks(); @@ -11,25 +8,8 @@ beforeEach(() => { describe('parseAndGenerateServices', () => { describe('moduleResolver', () => { - beforeEach(() => { - parser.clearCaches(); - }); + const { code, config } = createAndPrepareParseConfig(); - const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); - const code = ` - import { something } from '__PLACEHOLDER__'; - - something(); - `; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - project: './tsconfig.json', - tsconfigRootDir: PROJECT_DIR, - filePath: resolve(PROJECT_DIR, 'file.ts'), - }; const withDefaultProgramConfig: TSESTreeOptions = { ...config, project: './tsconfig.defaultProgram.json', diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts index 2984ff318a3e..9bebf21de1ae 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts @@ -1,9 +1,8 @@ -import { join, resolve } from 'path'; +import { resolve } from 'path'; import * as parser from '../../src'; import type { TSESTreeOptions } from '../../src/parser-options'; - -const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); +import { createAndPrepareParseConfig } from '../../tools/test-utils'; beforeEach(() => { jest.clearAllMocks(); @@ -11,25 +10,8 @@ beforeEach(() => { describe('parseAndGenerateServices', () => { describe('moduleResolver', () => { - beforeEach(() => { - parser.clearCaches(); - }); + const { code, config, projectDirectory } = createAndPrepareParseConfig(); - const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); - const code = ` - import { something } from '__PLACEHOLDER__'; - - something(); - `; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - project: './tsconfig.json', - tsconfigRootDir: PROJECT_DIR, - filePath: resolve(PROJECT_DIR, 'file.ts'), - }; const withDefaultProgramConfig: TSESTreeOptions = { ...config, project: './tsconfig.defaultProgram.json', @@ -42,7 +24,7 @@ describe('parseAndGenerateServices', () => { parser .parseAndGenerateServices(code, { ...withDefaultProgramConfig, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + moduleResolver: resolve(projectDirectory, './moduleResolver.js'), }) .services.program.getSemanticDiagnostics(), ).toHaveLength(0); diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts index 39efde2c19e5..699c88f0f235 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts @@ -1,9 +1,7 @@ -import { join, resolve } from 'path'; +import { resolve } from 'path'; import * as parser from '../../src'; -import type { TSESTreeOptions } from '../../src/parser-options'; - -const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); +import { createAndPrepareParseConfig } from '../../tools/test-utils'; beforeEach(() => { jest.clearAllMocks(); @@ -11,25 +9,7 @@ beforeEach(() => { describe('parseAndGenerateServices', () => { describe('moduleResolver', () => { - beforeEach(() => { - parser.clearCaches(); - }); - - const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); - const code = ` - import { something } from '__PLACEHOLDER__'; - - something(); - `; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - project: './tsconfig.json', - tsconfigRootDir: PROJECT_DIR, - filePath: resolve(PROJECT_DIR, 'file.ts'), - }; + const { code, config, projectDirectory } = createAndPrepareParseConfig(); describe('when file is in the project', () => { it('returns error if __PLACEHOLDER__ can not be resolved', () => { @@ -48,7 +28,7 @@ describe('parseAndGenerateServices', () => { parser.parseAndGenerateServices(code, { ...config, moduleResolver: resolve( - PROJECT_DIR, + projectDirectory, './this_moduleResolver_does_not_exist.js', ), }), diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts index 4bc5c5ea631c..eebc01b9369a 100644 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts +++ b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts @@ -1,9 +1,7 @@ -import { join, resolve } from 'path'; +import { resolve } from 'path'; import * as parser from '../../src'; -import type { TSESTreeOptions } from '../../src/parser-options'; - -const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); +import { createAndPrepareParseConfig } from '../../tools/test-utils'; beforeEach(() => { jest.clearAllMocks(); @@ -11,25 +9,7 @@ beforeEach(() => { describe('parseAndGenerateServices', () => { describe('moduleResolver', () => { - beforeEach(() => { - parser.clearCaches(); - }); - - const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); - const code = ` - import { something } from '__PLACEHOLDER__'; - - something(); - `; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - project: './tsconfig.json', - tsconfigRootDir: PROJECT_DIR, - filePath: resolve(PROJECT_DIR, 'file.ts'), - }; + const { code, config, projectDirectory } = createAndPrepareParseConfig(); describe('when file is in the project', () => { it('resolves __PLACEHOLDER__ correctly', () => { @@ -37,7 +17,7 @@ describe('parseAndGenerateServices', () => { parser .parseAndGenerateServices(code, { ...config, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + moduleResolver: resolve(projectDirectory, './moduleResolver.js'), }) .services.program.getSemanticDiagnostics(), ).toHaveLength(0); diff --git a/packages/typescript-estree/tools/test-utils.ts b/packages/typescript-estree/tools/test-utils.ts index b3b873acc6a4..6f40b597ca73 100644 --- a/packages/typescript-estree/tools/test-utils.ts +++ b/packages/typescript-estree/tools/test-utils.ts @@ -1,9 +1,15 @@ +import { join, resolve } from 'path'; + import type { ParseAndGenerateServicesResult, TSESTree, TSESTreeOptions, } from '../src'; -import { parse as parserParse, parseAndGenerateServices } from '../src'; +import { + clearCaches, + parse as parserParse, + parseAndGenerateServices, +} from '../src'; export function parseCodeAndGenerateServices( code: string, @@ -153,3 +159,41 @@ export function omitDeep( return visit(root as UnknownObject, null); } + +interface CreateAndPrepareParseConfig { + code: string; + config: TSESTreeOptions; + projectDirectory: string; +} + +const FIXTURES_DIR = join(__dirname, '../tests/fixtures/simpleProject'); + +export function createAndPrepareParseConfig(): CreateAndPrepareParseConfig { + beforeEach(() => { + clearCaches(); + }); + + const projectDirectory = resolve(FIXTURES_DIR, '../moduleResolver'); + + const code = ` + import { something } from '__PLACEHOLDER__'; + + something(); + `; + + const config: TSESTreeOptions = { + comment: true, + filePath: resolve(projectDirectory, 'file.ts'), + loc: true, + project: './tsconfig.json', + range: true, + tokens: true, + tsconfigRootDir: projectDirectory, + }; + + return { + code, + config, + projectDirectory, + }; +}