Files
ubicloud/spec/lib/validation/postgres_config_validator_spec.rb
2025-07-30 14:01:26 +05:30

128 lines
4.6 KiB
Ruby

# frozen_string_literal: true
RSpec.describe Validation::PostgresConfigValidator do
let(:validator) { described_class.new("17") }
describe "#initialize" do
context "with invalid version" do
it "raises an error" do
expect { described_class.new("invalid") }.to raise_error(RuntimeError)
end
end
context "with valid version" do
it "returns a validator instance" do
expect { described_class.new("16") }.not_to raise_error
expect { described_class.new("pgbouncer") }.not_to raise_error
end
end
end
describe "#validate" do
context "with valid configurations" do
it "returns no errors for valid max_connections" do
config = {"max_connections" => "100"}
expect { validator.validate(config) }.not_to raise_error
end
it "returns no errors for valid log_statement" do
config = {"log_statement" => "ddl"}
expect { validator.validate(config) }.not_to raise_error
end
it "returns no errors for valid shared_buffers" do
config = {"shared_buffers" => "128MB"}
expect { validator.validate(config) }.not_to raise_error
end
it "returns no errors for valid autovacuum_analyze_scale_factor" do
config = {"autovacuum_analyze_scale_factor" => "0.1"}
expect { validator.validate(config) }.not_to raise_error
end
it "returns no errors for setting a string with no validation" do
config = {"archive_command" => "foo bar"}
expect { validator.validate(config) }.not_to raise_error
end
it "returns no errors for setting a bool with no validation" do
config = {"allow_system_table_mods" => "on"}
expect { validator.validate(config) }.not_to raise_error
end
it "returns no errors for unknown customized option" do
config = {"citus.shard_count" => "32"}
expect { validator.validate(config) }.not_to raise_error
end
it "returns no errors for non-string value" do
config = {"max_connections" => 100}
expect { validator.validate(config) }.not_to raise_error
end
end
context "with invalid configurations" do
it "returns error for invalid max_connections" do
config = {"max_connections" => "abc"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for out of range max_connections" do
config = {"max_connections" => "10001"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for invalid log_statement value" do
config = {"log_statement" => "invalid"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for invalid shared_buffers format" do
config = {"shared_buffers" => "invalid"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for invalid float value" do
config = {"autovacuum_analyze_scale_factor" => "invalid"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for out of range float value" do
config = {"autovacuum_analyze_scale_factor" => "-1.0"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for invalid bool value" do
config = {"allow_system_table_mods" => "invalid"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for empty value" do
config = {"max_connections" => ""}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
end
context "with unknown configurations" do
it "returns error for unknown config" do
config = {"unknown_config" => "value"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
it "returns error for invalid customized option" do
config = {"invalid.customized.option" => "32"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
end
context "with invalid type configuration" do
it "returns error for invalid type value" do
sample_config_schema = {"max_connections" => {type: :none}}
validator.instance_variable_set(:@config_schema, sample_config_schema)
config = {"max_connections" => "100"}
expect { validator.validate(config) }.to raise_error(Validation::ValidationFailed)
end
end
end
end