diff options
Diffstat (limited to 'spec/dispatch/tools/result_spec.rb')
| -rw-r--r-- | spec/dispatch/tools/result_spec.rb | 107 |
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 |
