import { describe, expect, it } from "@effect/vitest";import { ToolResult, isToolFile, isToolResult } from "./tool-result"; describe("ToolResult", () => { it("ok wraps a value", () => { const r = ToolResult.ok({ count: 3 }); expect(r).toEqual({ ok: true, data: { count: 3 } }); expect(isToolResult(r)).toBe(true); }); it("fail wraps a ToolError", () => { const r = ToolResult.fail({ code: "upstream_http_error", status: 404, message: "Not found", details: { id: "x" }, }); expect(r).toEqual({ ok: false, error: { code: "upstream_http_error", status: 404, message: "Not found", details: { id: "x" }, }, }); expect(isToolResult(r)).toBe(true); }); it("isToolResult rejects unrelated shapes", () => { expect(isToolResult(null)).toBe(false); expect(isToolResult({})).toBe(false); expect(isToolResult({ ok: true })).toBe(false); expect(isToolResult({ ok: false })).toBe(false); expect(isToolResult({ ok: false, error: {} })).toBe(false); expect(isToolResult({ ok: false, error: { code: 1, message: "x" } })).toBe(false); expect(isToolResult({ ok: "yes", data: 1 })).toBe(false); }); it("isToolResult accepts both branches of the union", () => { expect(isToolResult({ ok: true, data: 1 })).toBe(true); expect(isToolResult({ ok: true, data: null })).toBe(true); expect( isToolResult({ ok: false, error: { code: "x", message: "y" }, }), ).toBe(true); });}); describe("ToolFile", () => { it("accepts a base64 file value", () => { const file = { _tag: "ToolFile", name: "photo.png", mimeType: "image/png", encoding: "base64", data: "iVBORw0KGgo=", byteLength: 8, }; expect(file).toEqual({ _tag: "ToolFile", name: "photo.png", mimeType: "image/png", encoding: "base64", data: "iVBORw0KGgo=", byteLength: 8, }); expect(isToolFile(file)).toBe(true); }); it("rejects unrelated shapes", () => { expect(isToolFile(null)).toBe(false); expect(isToolFile({ data: "abc" })).toBe(false); expect( isToolFile({ _tag: "ToolFile", mimeType: "image/png", encoding: "utf8", data: "abc", byteLength: 3, }), ).toBe(false); });});
import { describe, expect, it } from "@effect/vitest";
import { ToolResult, isToolFile, isToolResult } from "./tool-result";
describe("ToolResult", () => {
it("ok wraps a value", () => {
const r = ToolResult.ok({ count: 3 });
expect(r).toEqual({ ok: true, data: { count: 3 } });
expect(isToolResult(r)).toBe(true);
});
it("fail wraps a ToolError", () => {
const r = ToolResult.fail({
code: "upstream_http_error",
status: 404,
message: "Not found",
details: { id: "x" },
});
expect(r).toEqual({
ok: false,
error: {
code: "upstream_http_error",
status: 404,
message: "Not found",
details: { id: "x" },
},
});
expect(isToolResult(r)).toBe(true);
});
it("isToolResult rejects unrelated shapes", () => {
expect(isToolResult(null)).toBe(false);
expect(isToolResult({})).toBe(false);
expect(isToolResult({ ok: true })).toBe(false);
expect(isToolResult({ ok: false })).toBe(false);
expect(isToolResult({ ok: false, error: {} })).toBe(false);
expect(isToolResult({ ok: false, error: { code: 1, message: "x" } })).toBe(false);
expect(isToolResult({ ok: "yes", data: 1 })).toBe(false);
});
it("isToolResult accepts both branches of the union", () => {
expect(isToolResult({ ok: true, data: 1 })).toBe(true);
expect(isToolResult({ ok: true, data: null })).toBe(true);
expect(
isToolResult({
ok: false,
error: { code: "x", message: "y" },
}),
).toBe(true);
});
});
describe("ToolFile", () => {
it("accepts a base64 file value", () => {
const file = {
_tag: "ToolFile",
name: "photo.png",
mimeType: "image/png",
encoding: "base64",
data: "iVBORw0KGgo=",
byteLength: 8,
};
expect(file).toEqual({
_tag: "ToolFile",
name: "photo.png",
mimeType: "image/png",
encoding: "base64",
data: "iVBORw0KGgo=",
byteLength: 8,
});
expect(isToolFile(file)).toBe(true);
});
it("rejects unrelated shapes", () => {
expect(isToolFile(null)).toBe(false);
expect(isToolFile({ data: "abc" })).toBe(false);
expect(
isToolFile({
_tag: "ToolFile",
mimeType: "image/png",
encoding: "utf8",
data: "abc",
byteLength: 3,
}),
).toBe(false);
});
});