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,46 @@ 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 , " " ) ) . to be_nil
238+ expect ( described_class . find_header_value ( headers , nil ) ) . to be_nil
239+ end
240+
241+ it "handles invalid headers object" do
242+ expect ( described_class . find_header_value ( nil , "Content-Type" ) ) . to be_nil
243+ expect ( described_class . find_header_value ( "not a hash" , "Content-Type" ) ) . to be_nil
244+ expect ( described_class . find_header_value ( 123 , "Content-Type" ) ) . to be_nil
245+ end
246+
247+ it "converts non-string values to strings" do
248+ headers = { "X-Count" => 42 , "X-Boolean" => true }
249+
250+ expect ( described_class . find_header_value ( headers , "X-Count" ) ) . to eq ( "42" )
251+ expect ( described_class . find_header_value ( headers , "x-boolean" ) ) . to eq ( "true" )
252+ end
253+
254+ it "handles headers with symbol keys" do
255+ headers = { :content_type => "application/json" , "X-Test" => "value" }
256+
257+ expect ( described_class . find_header_value ( headers , "content_type" ) ) . to eq ( "application/json" )
258+ expect ( described_class . find_header_value ( headers , "x-test" ) ) . to eq ( "value" )
259+ end
260+ end
261+
220262 describe "global component access" do
221263 describe ".log" do
222264 it "provides access to global log" do
0 commit comments