41 lines · 2.1 KB · TypeScript
RawDownload
import { describe, expect, it } from "@effect/vitest";import { Cause } from "effect"; import { sentryPayloadForCause } from "./observability"; // Mirrors Sentry core's `is.isError`: it picks the proper-Error path iff// `Object.prototype.toString.call(x) === "[object Error]"`. Anything that// fails this check goes down the synthetic "<className> captured as exception// with keys: ..." path that produced the original CauseImpl Sentry issue.const looksLikeErrorToSentry = (value: unknown): boolean =>  Object.prototype.toString.call(value) === "[object Error]"; describe("sentryPayloadForCause", () => {  it("hands Sentry a real Error when the defect is itself a Cause", () => {    // Reproduces the production chain: an inner runPromise rejects with a    // CauseImpl (from Effect v4's causeSquash), Effect.promise re-wraps it    // as Die(CauseImpl), and the outer catchCause receives this shape.    // oxlint-disable-next-line executor/no-error-constructor -- boundary: observability test must build a real Error for Sentry-compatible payload assertions    const innerCause = Cause.fail(new Error("inner failure"));    const outerCause = Cause.die(innerCause);     const { primary, pretty } = sentryPayloadForCause(outerCause);     expect(looksLikeErrorToSentry(primary)).toBe(true);    expect(pretty).not.toBeNull();  });   it("hands Sentry a real Error for an ordinary failed Cause", () => {    // oxlint-disable-next-line executor/no-error-constructor -- boundary: observability test must build a real Error for Sentry-compatible payload assertions    const { primary } = sentryPayloadForCause(Cause.fail(new Error("plain failure")));    expect(looksLikeErrorToSentry(primary)).toBe(true);  });   it("forwards non-Cause inputs as-is with no pretty cause attached", () => {    // oxlint-disable-next-line executor/no-error-constructor -- boundary: observability test must build a real Error for Sentry-compatible payload assertions    const err = new Error("raw");    const { primary, pretty } = sentryPayloadForCause(err);    expect(primary).toBe(err);    expect(pretty).toBeNull();  });});