Skip to content

Commit 6753d31

Browse files
committed
Add error handling for missing and invalid configuration files in ConfigLoader
1 parent 0d1b3a3 commit 6753d31

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

lib/hooks/core/config_loader.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,24 @@ class ConfigLoader
3232
#
3333
# @param config_path [String, Hash] Path to config file or config hash
3434
# @return [Hash] Merged configuration
35+
# @raise [ArgumentError] if config file path is provided but file doesn't exist
36+
# @raise [RuntimeError] if config file exists but fails to load
3537
def self.load(config_path: nil)
3638
config = DEFAULT_CONFIG.dup
3739
overrides = []
3840

3941
# Load from file if path provided
40-
if config_path.is_a?(String) && File.exist?(config_path)
42+
if config_path.is_a?(String)
43+
unless File.exist?(config_path)
44+
raise ArgumentError, "Configuration file not found: #{config_path}"
45+
end
46+
4147
file_config = load_config_file(config_path)
4248
if file_config
4349
overrides << "file config"
4450
config.merge!(file_config)
51+
else
52+
raise RuntimeError, "Failed to load configuration from file: #{config_path}"
4553
end
4654
end
4755

spec/unit/lib/hooks/core/config_loader_spec.rb

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,10 @@
101101
context "when file does not exist" do
102102
let(:config_file) { File.join(temp_dir, "nonexistent.yml") }
103103

104-
it "returns default configuration" do
105-
config = described_class.load(config_path: config_file)
106-
107-
expect(config[:log_level]).to eq("info")
108-
expect(config[:environment]).to eq("production")
109-
expect(config[:production]).to be true
104+
it "raises ArgumentError" do
105+
expect {
106+
described_class.load(config_path: config_file)
107+
}.to raise_error(ArgumentError, "Configuration file not found: #{config_file}")
110108
end
111109
end
112110

@@ -117,11 +115,10 @@
117115
File.write(config_file, "invalid: yaml: content: [")
118116
end
119117

120-
it "returns default configuration" do
121-
config = described_class.load(config_path: config_file)
122-
123-
expect(config[:log_level]).to eq("info")
124-
expect(config[:environment]).to eq("production")
118+
it "raises RuntimeError" do
119+
expect {
120+
described_class.load(config_path: config_file)
121+
}.to raise_error(RuntimeError, "Failed to load configuration from file: #{config_file}")
125122
end
126123
end
127124

@@ -132,11 +129,10 @@
132129
File.write(config_file, "log_level: debug")
133130
end
134131

135-
it "returns default configuration" do
136-
config = described_class.load(config_path: config_file)
137-
138-
expect(config[:log_level]).to eq("info")
139-
expect(config[:environment]).to eq("production")
132+
it "raises RuntimeError" do
133+
expect {
134+
described_class.load(config_path: config_file)
135+
}.to raise_error(RuntimeError, "Failed to load configuration from file: #{config_file}")
140136
end
141137
end
142138
end

0 commit comments

Comments
 (0)