import { assert, describe } from "@effect/vitest"; import { createOxlintRuleHarness } from "../test/utils.ts"; const rule = createOxlintRuleHarness("t3code/no-manual-effect-runtime-in-tests", { filename: "fixture.test.ts", }); describe("t3code/no-manual-effect-runtime-in-tests", () => { rule.valid( "allows @effect/vitest effect tests", ` import { it } from "@effect/vitest"; import * as Effect from "effect/Effect"; it.effect("runs an Effect", () => Effect.succeed("ok")); `, ); const runtimeMethods = [ "runCallback", "runCallbackWith", "runFork", "runForkWith", "runPromise", "runPromiseExit", "runPromiseExitWith", "runPromiseWith", "runSync", "runSyncExit", "runSyncExitWith", "runSyncWith", ] as const; for (const method of runtimeMethods) { rule.invalid( `reports Effect.${method}`, ` import * as Effect from "effect/Effect"; test("runs an Effect", () => { Effect.${method}(Effect.succeed("ok")); }); `, (output) => { assert.match(output, /Use @effect\/vitest with it\.effect/); }, ); } rule.invalid( "reports ManagedRuntime.make", ` import * as Layer from "effect/Layer"; import * as ManagedRuntime from "effect/ManagedRuntime"; test("makes a runtime", () => { ManagedRuntime.make(Layer.empty); }); `, ); }); const productionRule = createOxlintRuleHarness("t3code/no-manual-effect-runtime-in-tests"); productionRule.valid( "allows production runtime boundaries", ` import * as Effect from "effect/Effect"; export const main = () => Effect.runPromise(Effect.void); `, );