bun:test/prefer-strict-boolean-matchers
Require toBe(true) and toBe(false) instead of toBeTruthy() and toBeFalsy()
toBeTruthy() passes for 1, "no" and {}. toBeFalsy() passes for 0, "", null and undefined. If a function should return a boolean and starts returning undefined, a test with toBeFalsy() still passes. toBe(false) fails.
--fix-suggestions rewrites the matcher. --fix doesn't, because a test that passed with a non-boolean value fails afterwards.
Configure#
Off by default. To turn it on:
[lint.rules]
"bun:test/prefer-strict-boolean-matchers" = "error" # or "warn"Examples#
import { expect, test } from "bun:test";
test("checks the password", () => {
expect(isValid("correct horse")).toBeTruthy()Use toBe(true) instead of toBeTruthy.;
expect(isValid("")).toBeFalsy()Use toBe(false) instead of toBeFalsy.;
});import { expect, test } from "bun:test";
test("checks the password", () => {
expect(isValid("correct horse")).toBe(true);
expect(isValid("")).toBe(false);
});not.toBeTruthy() is reported too. The rewrite is toBe(false), not not.toBe(true), which would pass for everything except true.
import { expect, test } from "bun:test";
test("rejects an empty password", () => {
expect(isValid("")).not.toBeTruthy()Use toBe(false) instead of not.toBeTruthy.;
});When not to use it#
Some tests only care that there's a value, like a match from String.prototype.match() or a non-empty string. In those tests, toBeTruthy() says what you mean.
bun:test/prefer-to-be-truthy and bun:test/prefer-to-be-falsy ask for the opposite. Don't turn them on together with this rule.