11# frozen_string_literal: true
22
3+ require_relative "../../../../spec_helper"
4+
35describe Hooks ::Plugins ::Auth ::Base do
46 describe ".valid?" do
57 let ( :payload ) { '{"test": "data"}' }
@@ -206,7 +208,7 @@ def self.valid?(payload:, headers:, config:)
206208
207209 describe "documentation compliance" do
208210 it "has the expected public interface" do
209- expect ( described_class . methods ) . to include ( :valid? , :log , :stats , :failbot , :fetch_secret )
211+ expect ( described_class . methods ) . to include ( :valid? , :log , :stats , :failbot , :fetch_secret , :find_header_value )
210212 end
211213
212214 it "valid? method accepts the documented parameters" do
@@ -217,6 +219,45 @@ def self.valid?(payload:, headers:, config:)
217219 end
218220 end
219221
222+ describe ".find_header_value" do
223+ it "finds header value with case-insensitive matching" do
224+ headers = { "Content-Type" => "application/json" , "X-Test" => "value" }
225+
226+ expect ( described_class . find_header_value ( headers , "content-type" ) ) . to eq ( "application/json" )
227+ expect ( described_class . find_header_value ( headers , "CONTENT-TYPE" ) ) . to eq ( "application/json" )
228+ expect ( described_class . find_header_value ( headers , "x-test" ) ) . to eq ( "value" )
229+ expect ( described_class . find_header_value ( headers , "X-TEST" ) ) . to eq ( "value" )
230+ end
231+
232+ it "returns nil for missing headers" do
233+ headers = { "Content-Type" => "application/json" }
234+
235+ expect ( described_class . find_header_value ( headers , "Missing-Header" ) ) . to be_nil
236+ expect ( described_class . find_header_value ( headers , "" ) ) . to be_nil
237+ expect ( described_class . find_header_value ( headers , nil ) ) . to be_nil
238+ end
239+
240+ it "handles invalid headers object" do
241+ expect ( described_class . find_header_value ( nil , "Content-Type" ) ) . to be_nil
242+ expect ( described_class . find_header_value ( "not a hash" , "Content-Type" ) ) . to be_nil
243+ expect ( described_class . find_header_value ( 123 , "Content-Type" ) ) . to be_nil
244+ end
245+
246+ it "converts non-string values to strings" do
247+ headers = { "X-Count" => 42 , "X-Boolean" => true }
248+
249+ expect ( described_class . find_header_value ( headers , "X-Count" ) ) . to eq ( "42" )
250+ expect ( described_class . find_header_value ( headers , "x-boolean" ) ) . to eq ( "true" )
251+ end
252+
253+ it "handles headers with symbol keys" do
254+ headers = { :content_type => "application/json" , "X-Test" => "value" }
255+
256+ expect ( described_class . find_header_value ( headers , "content_type" ) ) . to eq ( "application/json" )
257+ expect ( described_class . find_header_value ( headers , "x-test" ) ) . to eq ( "value" )
258+ end
259+ end
260+
220261 describe "global component access" do
221262 describe ".log" do
222263 it "provides access to global log" do
0 commit comments