require "./spec_helper" describe JosieHealth::Utils::Result do describe ".success" do it "creates a successful result with data" do result = JosieHealth::Utils::Result(String).success("hello") result.success?.should be_true result.failure?.should be_false result.data.should eq("hello") result.error.should be_nil result.status_code.should eq(200) end it "accepts custom status code" do result = JosieHealth::Utils::Result(String).success("created", 201) result.status_code.should eq(201) end end describe ".error" do it "creates a failed result with error message" do result = JosieHealth::Utils::Result(String).error("something went wrong") result.success?.should be_false result.failure?.should be_true result.data.should be_nil result.error.should eq("something went wrong") result.status_code.should eq(500) end it "accepts custom status code" do result = JosieHealth::Utils::Result(String).error("bad request", 400) result.status_code.should eq(400) end end describe ".not_found" do it "creates a 404 result" do result = JosieHealth::Utils::Result(String).not_found result.failure?.should be_true result.error.should eq("Not found") result.status_code.should eq(404) end it "accepts custom message" do result = JosieHealth::Utils::Result(String).not_found("User not found") result.error.should eq("User not found") end end describe "#unwrap!" do it "returns data when successful" do result = JosieHealth::Utils::Result(Int32).success(42) result.unwrap!.should eq(42) end it "raises when data is nil" do result = JosieHealth::Utils::Result(Int32).error("failed") expect_raises(NilAssertionError) do result.unwrap! end end end describe "#unwrap_or" do it "returns data when successful" do result = JosieHealth::Utils::Result(Int32).success(42) result.unwrap_or(0).should eq(42) end it "returns default when failed" do result = JosieHealth::Utils::Result(Int32).error("failed") result.unwrap_or(0).should eq(0) end end describe "#map" do it "transforms successful data" do result = JosieHealth::Utils::Result(Int32).success(5) mapped = result.map { |n| n * 2 } mapped.success?.should be_true mapped.unwrap!.should eq(10) end it "preserves error on failure" do result = JosieHealth::Utils::Result(Int32).error("failed", 400) mapped = result.map { |n| n * 2 } mapped.failure?.should be_true mapped.error.should eq("failed") mapped.status_code.should eq(400) end it "can change result type" do result = JosieHealth::Utils::Result(Int32).success(42) mapped = result.map { |n| n.to_s } mapped.unwrap!.should eq("42") end end describe "with complex types" do it "works with arrays" do result = JosieHealth::Utils::Result(Array(Int32)).success([1, 2, 3]) result.unwrap!.should eq([1, 2, 3]) end it "works with hashes" do result = JosieHealth::Utils::Result(Hash(String, Int32)).success({"a" => 1}) result.unwrap!["a"].should eq(1) end end end