spec/cc/analyzer/bridge_spec.rb (224 lines of code) (raw):

require "spec_helper" describe CC::Analyzer::Bridge do include FileSystemHelpers around do |test| within_temp_dir { test.call } end describe "#run" do it "runs an engine" do make_tree <<-EOFILES foo/thing.rb foo/bar.rb bar/baz.rb EOFILES write_cc_yaml(YAML.dump( "plugins" => { "foo" => true }, "exclude_patterns" => ["bar/"], )) expect_engine_run( "structure", { "image" => "structure-stable", "command" => nil }, { "enabled" => true, "channel" => "stable", "include_paths" => match_array(["foo/", ".codeclimate.yml", "engines.yml"]), }, ) expect_engine_run( "duplication", { "image" => "duplication-stable", "command" => nil }, { "enabled" => true, "channel" => "stable", "include_paths" => match_array(["foo/", ".codeclimate.yml", "engines.yml"]), }, ) expect_engine_run( "foo", { "image" => "foo-stable", "command" => nil }, { "enabled" => true, "channel" => "stable", "include_paths" => match_array(["foo/", ".codeclimate.yml", "engines.yml"]), }, ) described_class.new( config: CC::Config.load, formatter: stub_formatter, listener: stub_listener, registry: engine_registry, ).run end it "runs engines, respecting engine exclude_patterns" do make_tree <<-EOFILES foo/thing.rb foo/bar.rb bar/baz.rb EOFILES write_cc_yaml(YAML.dump( "plugins" => { "foo" => { "exclude_patterns" => ["**/*r.rb"] }, "bar" => { "enabled" => true, "channel" => "beta" }, }, "exclude_patterns" => ["bar/"] )) expect_engine_run( "structure", { "image" => "structure-stable", "command" => nil }, { "enabled" => true, "channel" => "stable", "include_paths" => match_array(["foo/", ".codeclimate.yml", "engines.yml"]), }, ) expect_engine_run( "duplication", { "image" => "duplication-stable", "command" => nil }, { "enabled" => true, "channel" => "stable", "include_paths" => match_array(["foo/", ".codeclimate.yml", "engines.yml"]), }, ) expect_engine_run( "foo", { "image" => "foo-stable", "command" => nil }, { "exclude_patterns" => ["**/*r.rb"], "channel" => "stable", "include_paths" => match_array(["foo/thing.rb", ".codeclimate.yml", "engines.yml"]), }, ) expect_engine_run( "bar", { "image" => "bar:beta", "command" => nil }, { "enabled" => true, "channel" => "beta", "include_paths" => match_array(["foo/", ".codeclimate.yml", "engines.yml"]), }, ) described_class.new( config: CC::Config.load, formatter: stub_formatter, listener: stub_listener, registry: engine_registry, ).run end it "skips invalid engines" do write_cc_yaml(YAML.dump( "plugins" => { "structure" => false, "duplication" => false, "notreal" => true, }, "exclude_patterns" => ["bar/"] )) listener = double(:listener) expect(listener).not_to receive(:started) expect(listener).to receive(:finished) do |engine, _details, result| expect(engine).to eq(CC::Config::Engine.new("notreal")) expect(result.exit_status).to be_zero expect(result).to be_skipped end described_class.new( config: CC::Config.load, formatter: stub_formatter, listener: listener, registry: engine_registry, ).run end it "defines engine minimum required memory" do write_cc_yaml(YAML.dump( "plugins" => { "structure" => false, "duplication" => false, "bar" => true, "memoryhungry" => true, }, "exclude_patterns" => ["bar/"] )) expect_engine_run( "bar", { "image" => "bar-stable", "command" => nil, "memory" => 1_024_000_000, }, { "enabled" => true, "channel" => "stable", "include_paths" => match_array([".codeclimate.yml", "engines.yml"]) }, ) expect_engine_run( "memoryhungry", { "image" => "memoryhungry-stable", "command" => nil, "memory" => 2_048_000_000, }, { "enabled" => true, "channel" => "stable", "include_paths" => match_array([".codeclimate.yml", "engines.yml"]) }, ) described_class.new( config: CC::Config.load, formatter: stub_formatter, listener: stub_listener, registry: engine_registry, ).run end end def write_cc_yaml(yaml) File.write(CC::Config::YAMLAdapter::DEFAULT_PATH, yaml) end def engine_registry File.write("engines.yml", <<-EOYAML) structure: channels: stable: structure-stable duplication: channels: stable: duplication-stable foo: channels: stable: foo-stable bar: channels: stable: bar-stable beta: "bar:beta" memoryhungry: channels: stable: memoryhungry-stable minimum_memory_limit: 2_048_000_000 EOYAML CC::EngineRegistry.new("engines.yml") end def expect_engine_run(name, metadata, config) engine_double = double("engine_#{name}") expect(CC::Analyzer::Engine).to receive(:new).with( name, { "memory" => 1024000000 }.merge(metadata), config, instance_of(String), ).and_return(engine_double) expect(engine_double).to receive(:run).once end def stub_formatter double(:formatter).tap do |stub| expect(stub).to receive(:started).once expect(stub).to receive(:engine_running).at_least(:once).and_yield expect(stub).to receive(:finished).once expect(stub).to receive(:close).once end end def stub_listener double(:listener).tap do |stub| expect(stub).to receive(:started).at_least(:once) expect(stub).to receive(:finished).at_least(:once) end end end