spec/cc/config_spec.rb (151 lines of code) (raw):
require "spec_helper"
describe CC::Config do
include FileSystemHelpers
context "CLI-required attributes" do
it "has #development and #analysis_paths support" do
config = described_class.new
expect(config).not_to be_development
expect(config.analysis_paths).to be_empty
config.development = true
config.analysis_paths << "a-path"
expect(config).to be_development
expect(config.analysis_paths).to eq(%w[a-path])
end
end
describe ".load" do
around do |test|
within_temp_dir { test.call }
end
it "loads json & applies defaults, ignoring yaml" do
yaml = write_cc_yaml(<<-EOYAML)
prepare:
fetch:
- rubocop.yml
plugins:
rubocop:
enabled: true
exclude_patterns:
- "**/*.rb"
- foo/
EOYAML
json = write_cc_json(<<-EOS)
{
"checks": {
"cyclomatic-complexity": {
"enabled": true
},
"similar-code": {
"enabled": false
}
}
}
EOS
config = CC::Config.load
expect(config.engines.count).to eq(2)
expect(config.engines).to include(CC::Config::Engine.new("structure"))
expect(config.engines).to include(CC::Config::Engine.new("duplication"))
expect(config.exclude_patterns).not_to include("**/*.rb")
expect(config.prepare.fetch.each.to_a).to be_empty
config.engines.find { |e| e.name == "structure" }.tap do |engine|
expect(engine.config["config"]["checks"]).to eq(
"cyclomatic-complexity" => {
"enabled" => true,
},
"similar-code" => {
"enabled" => false,
},
)
end
config.engines.find { |e| e.name == "duplication" }.tap do |engine|
expect(engine.config["config"]["checks"]).to eq(
"cyclomatic-complexity" => {
"enabled" => true,
},
"similar-code" => {
"enabled" => false,
},
)
end
end
it "loads yaml & applies defaults" do
yaml = write_cc_yaml(<<-EOYAML)
prepare:
fetch:
- rubocop.yml
plugins:
rubocop:
enabled: true
exclude_patterns:
- "**/*.rb"
- foo/
EOYAML
config = CC::Config.load
expect(config.engines.count).to eq(3)
expect(config.engines).to include(CC::Config::Engine.new("structure"))
expect(config.engines).to include(CC::Config::Engine.new("duplication"))
expect(config.engines).to include(CC::Config::Engine.new("rubocop"))
expect(config.exclude_patterns).to include("**/*.rb")
expect(config.exclude_patterns).to include("foo/")
expect(config.prepare.fetch.each.to_a).to eq([CC::Config::Prepare::Fetch::Entry.new("rubocop.yml")])
end
it "loads prepare from JSON" do
yaml = write_cc_json(<<-EOJSON)
{
"prepare": {
"fetch": [
"rubocop.yml"
]
},
"plugins": {
"rubocop": {
"enabled": true
}
},
"exclude_patterns": [
"**/*.rb",
"foo/"
]
}
EOJSON
config = CC::Config.load
expect(config.engines.count).to eq(3)
expect(config.engines).to include(CC::Config::Engine.new("structure"))
expect(config.engines).to include(CC::Config::Engine.new("duplication"))
expect(config.engines).to include(CC::Config::Engine.new("rubocop"))
expect(config.exclude_patterns).to include("**/*.rb")
expect(config.exclude_patterns).to include("foo/")
expect(config.prepare.fetch.each.to_a).to eq([CC::Config::Prepare::Fetch::Entry.new("rubocop.yml")])
end
it "only uses default config if .codeclimate.yml doesn't exist" do
stub_const("CC::Config::YAMLAdapter::DEFAULT_PATH", "")
stub_const("CC::Config::JSONAdapter::DEFAULT_PATH", "")
config = CC::Config.load
expect(config.engines.count).to eq(2)
expect(config.engines).to include(CC::Config::Engine.new("structure"))
structure = config.engines.detect { |e| e.name == "structure" }
expect(structure).to be_enabled
duplication = config.engines.detect { |e| e.name == "duplication" }
expect(duplication).to be_enabled
end
def write_cc_yaml(yaml)
make_file(CC::Config::YAMLAdapter::DEFAULT_PATH, yaml)
end
def write_cc_json(json)
make_file(CC::Config::JSONAdapter::DEFAULT_PATH, json)
end
end
describe "#disable_plugins!" do
it "deletes plugins from #engines" do
config = CC::Config.new(engines: Set.new(
[
double(name: "1", plugin?: false),
double(name: "2", plugin?: true),
double(name: "3", plugin?: false),
]
))
config.disable_plugins!
expect(config.engines.count).to eq(2)
expect(config.engines.map(&:name)).to eq(%w[1 3])
end
end
end