blob: b88f73b8fb7fd7f7692933f6e3352099b4496679 [file] [log] [blame]
"""This module defines the karma_test rule."""
load("@npm//@bazel/rollup:index.bzl", "rollup_bundle")
load("@npm//karma:index.bzl", _generated_karma_test = "karma_test")
load("//infra-sk:ts_library.bzl", "ts_library")
def karma_test(name, src, deps = []):
"""Runs TypeScript unit tests in a browser with Karma, using Mocha as the test runner.
When invoked via `bazel test`, a headless Chrome browser will be used. This supports testing
multiple karma_test targets in parallel, and works on RBE.
When invoked via `bazel run`, it prints out a URL to stdout that can be opened in the browser,
e.g. to debug the tests using the browser's developer tools. Source maps are generated.
When invoked via `ibazel test`, the test runner never exits, and tests will be rerun every time
a source file is changed.
When invoked via `ibazel run`, it will act the same way as `bazel run`, but the tests will be
rebuilt automatically when a source file changes. Reload the browser page to see the changes.
Args:
name: The name of the target.
src: A single TypeScript source file.
deps: Any ts_library dependencies.
"""
# Enforce test naming conventions. The Gazelle extension for front-end code relies on these.
if not src.endswith("_test.ts"):
fail("Karma tests must end with \"_test.ts\".")
for suffix in ["_puppeteer_test.ts", "_nodejs_test.ts"]:
if src.endswith(suffix):
fail("Karma tests cannot end with \"%s\"." % suffix)
ts_library(
name = name + "_lib",
srcs = [src],
deps = deps,
)
rollup_bundle(
name = name + "_bundle",
entry_point = src,
deps = [
name + "_lib",
"@npm//@rollup/plugin-node-resolve",
"@npm//@rollup/plugin-commonjs",
"@npm//rollup-plugin-sourcemaps",
],
format = "umd",
config_file = "//infra-sk:rollup.config.js",
)
# This rule is automatically generated by rules_nodejs from Karma's package.json file.
_generated_karma_test(
name = name,
size = "large",
data = [
name + "_bundle",
"//infra-sk/karma_test:karma.conf.js",
"@npm//karma-chrome-launcher",
"@npm//karma-sinon",
"@npm//karma-mocha",
"@npm//karma-chai",
"@npm//karma-chai-dom",
"@npm//karma-spec-reporter",
"@npm//mocha",
],
templated_args = [
"start",
"$(execpath //infra-sk/karma_test:karma.conf.js)",
"$$(rlocation $(location %s_bundle))" % name,
],
tags = [
# Necessary for it to work with ibazel.
"ibazel_notify_changes",
],
)