Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(testing): allows getJestProjects to fetch config information from inferred plugins #21806

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 134 additions & 116 deletions packages/jest/src/utils/config/get-jest-projects.spec.ts
Original file line number Diff line number Diff line change
@@ -1,182 +1,200 @@
import * as RetrieveWorkspaceFiles from 'nx/src/project-graph/utils/retrieve-workspace-files';
import { getJestProjects } from './get-jest-projects';
import * as Workspace from 'nx/src/project-graph/file-utils';
import type { WorkspaceJsonConfiguration } from '@nx/devkit';

describe('getJestProjects', () => {
test('single project', () => {
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
projects: {
'test-1': {
root: 'blah',
targets: {
test: {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
test('single project', async () => {
const mockedWorkspaceConfig: Partial<RetrieveWorkspaceFiles.RetrievedGraphNodes> =
{
projects: {
'test-1': {
root: 'blah',
targets: {
test: {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
},
},
},
},
},
},
version: 1,
};
};
jest
.spyOn(Workspace, 'readWorkspaceConfig')
.mockImplementation(() => mockedWorkspaceConfig);
.spyOn(RetrieveWorkspaceFiles, 'retrieveProjectConfigurations')
.mockResolvedValue(
mockedWorkspaceConfig as RetrieveWorkspaceFiles.RetrievedGraphNodes
);
const expectedResults = [
'<rootDir>/test/jest/config/location/jest.config.js',
];
expect(getJestProjects()).toEqual(expectedResults);
const projects = await getJestProjects();
expect(projects).toEqual(expectedResults);
});

test('custom target name', () => {
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
projects: {
'test-1': {
root: 'blah',
targets: {
'test-with-jest': {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
test('custom target name', async () => {
const mockedWorkspaceConfig: Partial<RetrieveWorkspaceFiles.RetrievedGraphNodes> =
{
projects: {
'test-1': {
root: 'blah',
targets: {
'test-with-jest': {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
},
},
},
},
},
},
version: 1,
};
};
jest
.spyOn(Workspace, 'readWorkspaceConfig')
.mockImplementation(() => mockedWorkspaceConfig);
.spyOn(RetrieveWorkspaceFiles, 'retrieveProjectConfigurations')
.mockResolvedValue(
mockedWorkspaceConfig as RetrieveWorkspaceFiles.RetrievedGraphNodes
);
const expectedResults = [
'<rootDir>/test/jest/config/location/jest.config.js',
];
expect(getJestProjects()).toEqual(expectedResults);
const projects = await getJestProjects();
expect(projects).toEqual(expectedResults);
});

test('root project', () => {
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
projects: {
'test-1': {
root: '.',
targets: {
test: {
executor: '@nx/jest:jest',
options: {
jestConfig: 'jest.config.app.js',
test('root project', async () => {
const mockedWorkspaceConfig: Partial<RetrieveWorkspaceFiles.RetrievedGraphNodes> =
{
projects: {
'test-1': {
root: '.',
targets: {
test: {
executor: '@nx/jest:jest',
options: {
jestConfig: 'jest.config.app.js',
},
},
},
},
},
},
version: 1,
};
};

jest
.spyOn(Workspace, 'readWorkspaceConfig')
.mockImplementation(() => mockedWorkspaceConfig);
.spyOn(RetrieveWorkspaceFiles, 'retrieveProjectConfigurations')
.mockResolvedValue(
mockedWorkspaceConfig as RetrieveWorkspaceFiles.RetrievedGraphNodes
);
const expectedResults = ['<rootDir>/jest.config.app.js'];
expect(getJestProjects()).toEqual(expectedResults);
const projects = await getJestProjects();
expect(projects).toEqual(expectedResults);
});

test('configuration set with unique jestConfig', () => {
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
projects: {
test: {
root: 'blah',
targets: {
'test-with-jest': {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
},
configurations: {
prod: {
jestConfig: 'configuration-specific/jest.config.js',
test('configuration set with unique jestConfig', async () => {
const mockedWorkspaceConfig: Partial<RetrieveWorkspaceFiles.RetrievedGraphNodes> =
{
projects: {
test: {
root: 'blah',
targets: {
'test-with-jest': {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
},
configurations: {
prod: {
jestConfig: 'configuration-specific/jest.config.js',
},
},
},
},
},
},
},
version: 1,
};
};
jest
.spyOn(Workspace, 'readWorkspaceConfig')
.mockImplementation(() => mockedWorkspaceConfig);
.spyOn(RetrieveWorkspaceFiles, 'retrieveProjectConfigurations')
.mockResolvedValue(
mockedWorkspaceConfig as RetrieveWorkspaceFiles.RetrievedGraphNodes
);
const expectedResults = [
'<rootDir>/test/jest/config/location/jest.config.js',
'<rootDir>/configuration-specific/jest.config.js',
];
expect(getJestProjects()).toEqual(expectedResults);
const projects = await getJestProjects();
expect(projects).toEqual(expectedResults);
});

test('configuration, set with same jestConfig on configuration', () => {
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
projects: {
test: {
root: 'blah',
targets: {
'test-with-jest': {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
},
configurations: {
prod: {
test('configuration, set with same jestConfig on configuration', async () => {
const mockedWorkspaceConfig: Partial<RetrieveWorkspaceFiles.RetrievedGraphNodes> =
{
projects: {
test: {
root: 'blah',
targets: {
'test-with-jest': {
executor: '@nx/jest:jest',
options: {
jestConfig: 'test/jest/config/location/jest.config.js',
},
configurations: {
prod: {
jestConfig: 'test/jest/config/location/jest.config.js',
},
},
},
},
},
},
},
version: 1,
};
};
jest
.spyOn(Workspace, 'readWorkspaceConfig')
.mockImplementation(() => mockedWorkspaceConfig);
.spyOn(RetrieveWorkspaceFiles, 'retrieveProjectConfigurations')
.mockResolvedValue(
mockedWorkspaceConfig as RetrieveWorkspaceFiles.RetrievedGraphNodes
);
const expectedResults = [
'<rootDir>/test/jest/config/location/jest.config.js',
];
expect(getJestProjects()).toEqual(expectedResults);
const projects = await getJestProjects();
expect(projects).toEqual(expectedResults);
});

test('other projects and targets that do not use the nrwl jest test runner', () => {
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
projects: {
otherTarget: {
root: 'test',
targets: {
test: {
executor: 'something else',
options: {},
test('other projects and targets that do not use the nrwl jest test runner', async () => {
const mockedWorkspaceConfig: Partial<RetrieveWorkspaceFiles.RetrievedGraphNodes> =
{
projects: {
otherTarget: {
root: 'test',
targets: {
test: {
executor: 'something else',
options: {},
},
},
},
},
test: {
root: 'blah',
targets: {
'test-with-jest': {
executor: 'something else',
options: {
jestConfig: 'something random',
},
configurations: {
prod: {
jestConfig: 'configuration-specific/jest.config.js',
test: {
root: 'blah',
targets: {
'test-with-jest': {
executor: 'something else',
options: {
jestConfig: 'something random',
},
configurations: {
prod: {
jestConfig: 'configuration-specific/jest.config.js',
},
},
},
},
},
},
},
version: 1,
};
};
jest
.spyOn(Workspace, 'readWorkspaceConfig')
.mockImplementation(() => mockedWorkspaceConfig);
.spyOn(RetrieveWorkspaceFiles, 'retrieveProjectConfigurations')
.mockResolvedValue(
mockedWorkspaceConfig as RetrieveWorkspaceFiles.RetrievedGraphNodes
);
const expectedResults = [];
expect(getJestProjects()).toEqual(expectedResults);
const projects = await getJestProjects();
expect(projects).toEqual(expectedResults);
});
});
27 changes: 13 additions & 14 deletions packages/jest/src/utils/config/get-jest-projects.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { readNxJson, workspaceRoot } from '@nx/devkit';
import { retrieveProjectConfigurations } from 'nx/src/project-graph/utils/retrieve-workspace-files';
import { join } from 'path';
import type { ProjectsConfigurations } from '@nx/devkit';
import { readWorkspaceConfig } from 'nx/src/project-graph/file-utils';

function getJestConfigProjectPath(projectJestConfigPath: string): string {
return join('<rootDir>', projectJestConfigPath);
Expand All @@ -18,30 +18,29 @@ function getJestConfigProjectPath(projectJestConfigPath: string): string {
* }
*
**/
export function getJestProjects() {
const ws = readWorkspaceConfig({
format: 'nx',
}) as ProjectsConfigurations;
export async function getJestProjects() {
const nxJson = readNxJson();
const nxGraph = await retrieveProjectConfigurations(workspaceRoot, nxJson);
const jestConfigurationSet = new Set<string>();
for (const projectConfig of Object.values(ws.projects)) {
for (const projectConfig of Object.values(nxGraph.projects)) {
if (!projectConfig.targets) {
continue;
}
for (const targetConfiguration of Object.values(projectConfig.targets)) {
for (const targetConfig of Object.values(projectConfig.targets)) {
if (
targetConfiguration.executor !== '@nx/jest:jest' &&
targetConfiguration.executor !== '@nrwl/jest:jest'
targetConfig.executor !== '@nx/jest:jest' &&
targetConfig.executor !== '@nrwl/jest:jest'
) {
continue;
}
if (targetConfiguration.options?.jestConfig) {
if (targetConfig.options?.jestConfig) {
jestConfigurationSet.add(
getJestConfigProjectPath(targetConfiguration.options.jestConfig)
getJestConfigProjectPath(targetConfig.options.jestConfig)
);
}
if (targetConfiguration.configurations) {
if (targetConfig.configurations) {
for (const configurationObject of Object.values(
targetConfiguration.configurations
targetConfig.configurations
)) {
if (configurationObject.jestConfig) {
jestConfigurationSet.add(
Expand Down