feat: add phase 4 bun_test bootstrap

This commit is contained in:
Eric
2026-03-04 03:19:28 +00:00
parent 370fd20d48
commit 864ca303d3
6 changed files with 94 additions and 2 deletions

View File

@@ -22,3 +22,9 @@ Phase 3 bootstrap is in place:
- Executable `bun_binary` rule (`/internal/bun_binary.bzl`) - Executable `bun_binary` rule (`/internal/bun_binary.bzl`)
- Public export via `bun/defs.bzl` - Public export via `bun/defs.bzl`
- Focused JS/TS runnable tests (`//tests/binary_test:all`) - Focused JS/TS runnable tests (`//tests/binary_test:all`)
Phase 4 bootstrap is in place:
- Test rule `bun_test` (`/internal/bun_test.bzl`)
- Public export via `bun/defs.bzl`
- Focused passing/failing test targets (`//tests/bun_test_test:all`)

View File

@@ -1,5 +1,6 @@
load("//internal:bun_binary.bzl", "bun_binary") load("//internal:bun_binary.bzl", "bun_binary")
load("//internal:bun_install.bzl", "bun_install") load("//internal:bun_install.bzl", "bun_install")
load("//internal:bun_test.bzl", "bun_test")
load(":repositories.bzl", "bun_register_toolchains", "bun_repositories") load(":repositories.bzl", "bun_register_toolchains", "bun_repositories")
load(":toolchain.bzl", "BunToolchainInfo", "bun_toolchain") load(":toolchain.bzl", "BunToolchainInfo", "bun_toolchain")
@@ -7,6 +8,7 @@ __all__ = [
"BunToolchainInfo", "BunToolchainInfo",
"bun_binary", "bun_binary",
"bun_install", "bun_install",
"bun_test",
"bun_register_toolchains", "bun_register_toolchains",
"bun_repositories", "bun_repositories",
"bun_toolchain", "bun_toolchain",

View File

@@ -1,2 +1,57 @@
def bun_test(**_kwargs): """Rule for running test suites with Bun."""
fail("bun_test is not implemented yet")
def _bun_test_impl(ctx):
toolchain = ctx.toolchains["//bun:toolchain_type"]
bun_bin = toolchain.bun.bun_bin
src_args = " ".join(["\"{}\"".format(src.path) for src in ctx.files.srcs])
launcher = ctx.actions.declare_file(ctx.label.name)
ctx.actions.write(
output = launcher,
is_executable = True,
content = """#!/usr/bin/env bash
set -euo pipefail
extra_args=()
if [[ -n "${{TESTBRIDGE_TEST_ONLY:-}}" ]]; then
extra_args+=("--test-name-pattern" "${{TESTBRIDGE_TEST_ONLY}}")
fi
if [[ -n "${{COVERAGE_DIR:-}}" ]]; then
extra_args+=("--coverage")
fi
exec "{}" test {} "${{extra_args[@]}}" "$@"
""".format(bun_bin.path, src_args),
)
transitive_files = []
if ctx.attr.node_modules:
transitive_files.append(ctx.attr.node_modules[DefaultInfo].files)
runfiles = ctx.runfiles(
files = [bun_bin] + ctx.files.srcs + ctx.files.data,
transitive_files = depset(transitive = transitive_files),
)
return [
DefaultInfo(
executable = launcher,
runfiles = runfiles,
),
]
bun_test = rule(
implementation = _bun_test_impl,
attrs = {
"srcs": attr.label_list(
mandatory = True,
allow_files = [".js", ".ts", ".jsx", ".tsx", ".mjs", ".cjs"],
),
"node_modules": attr.label(),
"data": attr.label_list(allow_files = True),
},
test = True,
toolchains = ["//bun:toolchain_type"],
)

View File

@@ -0,0 +1,19 @@
load("//bun:defs.bzl", "bun_test")
bun_test(
name = "passing_suite",
srcs = ["passing.test.ts"],
target_compatible_with = [
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
)
bun_test(
name = "failing_suite",
srcs = ["failing.test.ts"],
target_compatible_with = [
"@platforms//cpu:x86_64",
"@platforms//os:linux",
],
)

View File

@@ -0,0 +1,5 @@
import { expect, test } from "bun:test";
test("failing suite", () => {
expect(1 + 1).toBe(3);
});

View File

@@ -0,0 +1,5 @@
import { expect, test } from "bun:test";
test("passing suite", () => {
expect(1 + 1).toBe(2);
});