summaryrefslogtreecommitdiffhomepage
path: root/spec/dispatch/tools/result_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/dispatch/tools/result_spec.rb')
-rw-r--r--spec/dispatch/tools/result_spec.rb107
1 files changed, 107 insertions, 0 deletions
diff --git a/spec/dispatch/tools/result_spec.rb b/spec/dispatch/tools/result_spec.rb
new file mode 100644
index 0000000..17c9d7f
--- /dev/null
+++ b/spec/dispatch/tools/result_spec.rb
@@ -0,0 +1,107 @@
+# frozen_string_literal: true
+
+RSpec.describe Dispatch::Tools::Result do
+ describe ".success" do
+ it "creates a successful result with output" do
+ result = described_class.success(output: "file contents here")
+
+ expect(result.success?).to be true
+ expect(result.failure?).to be false
+ expect(result.output).to eq("file contents here")
+ expect(result.error).to be_nil
+ end
+
+ it "defaults metadata to an empty hash" do
+ result = described_class.success(output: "ok")
+
+ expect(result.metadata).to eq({})
+ end
+
+ it "accepts custom metadata" do
+ result = described_class.success(output: "Gate passed.", metadata: { stop_loop: true })
+
+ expect(result.metadata).to eq({ stop_loop: true })
+ end
+ end
+
+ describe ".failure" do
+ it "creates a failed result with error" do
+ result = described_class.failure(error: "File not found: src/missing.rb")
+
+ expect(result.success?).to be false
+ expect(result.failure?).to be true
+ expect(result.error).to eq("File not found: src/missing.rb")
+ expect(result.output).to be_nil
+ end
+
+ it "defaults metadata to an empty hash" do
+ result = described_class.failure(error: "boom")
+
+ expect(result.metadata).to eq({})
+ end
+
+ it "accepts custom metadata on failure" do
+ result = described_class.failure(error: "bad", metadata: { retryable: false })
+
+ expect(result.metadata).to eq({ retryable: false })
+ end
+ end
+
+ describe "#to_s" do
+ it "returns output on success" do
+ result = described_class.success(output: "hello world")
+
+ expect(result.to_s).to eq("hello world")
+ end
+
+ it "returns error on failure" do
+ result = described_class.failure(error: "something went wrong")
+
+ expect(result.to_s).to eq("something went wrong")
+ end
+
+ it "does not include metadata" do
+ result = described_class.success(output: "ok", metadata: { stop_loop: true })
+
+ expect(result.to_s).to eq("ok")
+ end
+ end
+
+ describe "#to_h" do
+ it "returns a hash with all fields for a success result" do
+ result = described_class.success(output: "data", metadata: { flag: true })
+
+ expect(result.to_h).to eq({
+ success: true,
+ output: "data",
+ error: nil,
+ metadata: { flag: true }
+ })
+ end
+
+ it "returns a hash with all fields for a failure result" do
+ result = described_class.failure(error: "oops")
+
+ expect(result.to_h).to eq({
+ success: false,
+ output: nil,
+ error: "oops",
+ metadata: {}
+ })
+ end
+ end
+
+ describe "immutability" do
+ it "is a frozen object" do
+ result = described_class.success(output: "test")
+
+ expect(result).to be_frozen
+ end
+
+ it "raises FrozenError when attempting to modify" do
+ result = described_class.success(output: "original", metadata: { key: "value" })
+
+ expect { result.instance_variable_set(:@output, "modified") }.to raise_error(FrozenError)
+ end
+ end
+end