Skip to content
Open
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
30 changes: 27 additions & 3 deletions packages/schematics/angular/vitest-browser/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {
} from '../utility/dependency';
import { JSONFile } from '../utility/json-file';
import { latestVersions } from '../utility/latest-versions';
import { getWorkspace } from '../utility/workspace';
import { getWorkspace, updateWorkspace } from '../utility/workspace';
import { Builders } from '../utility/workspace-models';
import { Schema as VitestBrowserOptions } from './schema';

Expand Down Expand Up @@ -89,8 +89,33 @@ export default function (options: VitestBrowserOptions): Rule {
}
};

// Determine the default browser based on the provider package
let defaultBrowser: string;
if (packageName === '@vitest/browser-webdriverio') {
defaultBrowser = 'chrome';
} else {
// Playwright and preview both use 'chromium' as the default
defaultBrowser = 'chromium';
}

// Update angular.json to add the browsers option to the test target
const updateAngularJsonRule = updateWorkspace((workspace) => {
const project = workspace.projects.get(options.project);
if (project) {
const testTarget = project.targets.get('test');
if (testTarget) {
testTarget.options ??= {};
const existingBrowsers = testTarget.options['browsers'] as string[] | undefined;
if (!existingBrowsers?.length) {
testTarget.options['browsers'] = [defaultBrowser];
}
}
}
});

return chain([
updateTsConfigRule,
updateAngularJsonRule,
...dependencies.map((name) =>
addDependency(name, latestVersions[name], {
type: DependencyType.Dev,
Expand All @@ -101,8 +126,7 @@ export default function (options: VitestBrowserOptions): Rule {
(_, context) => {
context.logger.info(
'Vitest browser testing support has been added. ' +
"To run tests in a browser, add a 'browsers' field to the 'test' target in 'angular.json', " +
"or use the '--browsers' command line option.",
`The test target has been configured with '${defaultBrowser}' as the default browser.`,
);
},
]);
Expand Down
46 changes: 46 additions & 0 deletions packages/schematics/angular/vitest-browser/index_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,52 @@ describe('Vitest Browser Provider Schematic', () => {
expect(tsConfig.compilerOptions.types).not.toContain('jasmine');
});

const browserProviderCases: { provider: string; expectedBrowser: string }[] = [
{ provider: '@vitest/browser-playwright', expectedBrowser: 'chromium' },
{ provider: '@vitest/browser-webdriverio', expectedBrowser: 'chrome' },
{ provider: '@vitest/browser-preview', expectedBrowser: 'chromium' },
];

for (const { provider, expectedBrowser } of browserProviderCases) {
it(`should add browsers option to angular.json for ${provider}`, async () => {
const options = {
project: 'app',
package: provider,
skipInstall: true,
};

const resultTree = await schematicRunner.runSchematic('vitest-browser', options, tree);

const angularJson = parse(resultTree.readContent('/angular.json'));
const project = angularJson.projects.app;
const targets = project.architect || project.targets;
expect(targets.test.options.browsers).toEqual([expectedBrowser]);
});
}

it('should not overwrite existing browsers option in angular.json', async () => {
// Set up existing browsers option
const angularJson = parse(tree.readContent('/angular.json'));
const project = angularJson.projects.app;
const targets = project.architect || project.targets;
targets.test.options ??= {};
targets.test.options.browsers = ['firefox'];
tree.overwrite('/angular.json', JSON.stringify(angularJson));

const options = {
project: 'app',
package: '@vitest/browser-playwright',
skipInstall: true,
};

const resultTree = await schematicRunner.runSchematic('vitest-browser', options, tree);

const updatedAngularJson = parse(resultTree.readContent('/angular.json'));
const updatedProject = updatedAngularJson.projects.app;
const updatedTargets = updatedProject.architect || updatedProject.targets;
expect(updatedTargets.test.options.browsers).toEqual(['firefox']);
});

it('should add webdriverio dependency when @vitest/browser-webdriverio is used', async () => {
const options = {
project: 'app',
Expand Down
Loading