spec/cc/analyzer/engine_spec.rb (93 lines of code) (raw):

require "spec_helper" module CC::Analyzer describe Engine do let(:metadata) { { "image" => "codeclimate/foo", "command" => "bar", "memory" => 1024000000 } } describe "#run" do it "passes the correct options to Container" do container = double allow(container).to receive(:on_output).and_yield("") allow(container).to receive(:run).and_return(Container::Result.new) expect(Container).to receive(:new) do |args| expect(args[:image]).to eq "codeclimate/foo" expect(args[:command]).to eq "bar" expect(args[:name]).to match(/^cc-engines-foo/) end.and_return(container) engine = Engine.new("foo", metadata, {}, "") engine.run(StringIO.new) end it "runs a Container in a constrained environment" do container = double allow(container).to receive(:on_output).and_yield("") expect(container).to receive(:run).with(including( "--cap-drop", "all", "--label", "com.codeclimate.label=a-label", "--memory", "1024000000", "--memory-swap", "-1", "--net", "none", "--rm", "--user", "9000:9000", )).and_return(Container::Result.new) expect(Container).to receive(:new).and_return(container) engine = Engine.new("", metadata, {}, "a-label") engine.run(StringIO.new) end it "runs a Container with engine memory overrides" do container = double allow(container).to receive(:on_output).and_yield("") expect(container).to receive(:run).with(including( "--memory", "2048000000", )).and_return(Container::Result.new) expect(Container).to receive(:new).and_return(container) engine = Engine.new("", { "image" => "", "memory" => 2048000000 }, {}, "a-label") engine.run(StringIO.new) end it "parses stdout for null-delimited issues" do within_temp_dir do make_file("foo.rb") container = TestContainer.new([ %{{"type":"issue","check_name":"foo","location":{"path":"foo.rb","lines":{"begin":1,"end":1}},"description":"foo","categories":["Style"]}}, %{{"type":"issue","check_name":"bar","location":{"path":"foo.rb","lines":{"begin":1,"end":1}},"description":"foo","categories":["Style"]}}, %{{"type":"issue","check_name":"baz","location":{"path":"foo.rb","lines":{"begin":1,"end":1}},"description":"foo","categories":["Style"]}}, ]) expect(Container).to receive(:new).and_return(container) stdout = TestFormatter.new engine = Engine.new("bar", metadata, {}, "") engine.run(stdout) expected = "{\"type\":\"issue\",\"check_name\":\"foo\",\"location\":{\"path\":\"foo.rb\",\"lines\":{\"begin\":1,\"end\":1}},\"description\":\"foo\",\"categories\":[\"Style\"],\"engine_name\":\"bar\",\"fingerprint\":\"bdc0c2bb1201c4739118a51481a86fa1\",\"severity\":\"minor\"}{\"type\":\"issue\",\"check_name\":\"bar\",\"location\":{\"path\":\"foo.rb\",\"lines\":{\"begin\":1,\"end\":1}},\"description\":\"foo\",\"categories\":[\"Style\"],\"engine_name\":\"bar\",\"fingerprint\":\"cbd5b8962eb9e2950fbb02f0ddf6c404\",\"severity\":\"minor\"}{\"type\":\"issue\",\"check_name\":\"baz\",\"location\":{\"path\":\"foo.rb\",\"lines\":{\"begin\":1,\"end\":1}},\"description\":\"foo\",\"categories\":[\"Style\"],\"engine_name\":\"bar\",\"fingerprint\":\"a08df13d51af2259c425551cb84c135f\",\"severity\":\"minor\"}" expect(stdout.string).to eq expected end end it "supports issue filtering by check name" do within_temp_dir do make_file("foo.rb") container = TestContainer.new([ %{{"type":"issue","check_name":"foo","location":{"path":"foo.rb","lines":{"begin":1,"end":1}},"description":"foo","categories":["Style"]}}, %{{"type":"issue","check_name":"bar","location":{"path":"foo.rb","lines":{"begin":1,"end":1}},"description":"foo","categories":["Style"]}}, %{{"type":"issue","check_name":"baz","location":{"path":"foo.rb","lines":{"begin":1,"end":1}},"description":"foo","categories":["Style"]}}, ]) expect(Container).to receive(:new).and_return(container) stdout = StringIO.new config = { "checks" => { "bar" => { "enabled" => false } } } engine = Engine.new("", metadata, config, "") engine.run(stdout) expect(stdout.string).not_to include %{"check":"bar"} end end it "applies overrides" do within_temp_dir do make_file("foo.rb") container = TestContainer.new([ %{{"type":"issue","check_name":"foo","location":{"path":"foo.rb","lines":{"begin":1,"end":1}},"description":"foo","categories":["Style"],"severity":"minor"}}, ]) expect(Container).to receive(:new).and_return(container) stdout = StringIO.new config = { "issue_override" => { "severity" => "info" } } engine = Engine.new("", metadata, config, "") engine.run(stdout) expect(stdout.string).not_to include %{"severity":"minor"} expect(stdout.string).to include %{"severity":"info"} end end end end end