spec/cc/cli/prepare_spec.rb (68 lines of code) (raw):

require "spec_helper" module CC::CLI describe Prepare do include FileSystemHelpers include ProcHelpers FIXTURE_CONFIG = <<YAML prepare: fetch: - url: "http://example.com/foo.json" path: bar.json YAML around do |test| within_temp_dir { test.call } end describe "#run" do it "fetches and writes files" do File.write(Command::CODECLIMATE_YAML, FIXTURE_CONFIG) resp = double(code: "200", body: "content") stub_resp("http://example.com/foo.json", "255.255.255.255", resp) stdout, stderr = capture_io do Prepare.new.run end expect(stdout).to match("Wrote http://example.com/foo.json to bar.json") expect(File.exist?("bar.json")).to eq(true) expect(File.read("bar.json")).to eq("content") end it "fails if address resolves to internal IP" do File.write(Command::CODECLIMATE_YAML, FIXTURE_CONFIG) resp = double(code: "200", body: "content") stub_resp("http://example.com/foo.json", "127.0.0.1", resp) stdout, stderr, _ = capture_io_and_exit_code do Prepare.new.run end expect(stderr).to match("maps to an internal address") expect(File.exist?("bar.json")).to eq(false) end it "fetches from internal IP if option is given" do File.write(Command::CODECLIMATE_YAML, FIXTURE_CONFIG) resp = double(code: "200", body: "content") stub_resp("http://example.com/foo.json", "127.0.0.1", resp) stdout, stderr = capture_io do Prepare.new(["--allow-internal-ips"]).run end expect(stdout).to match("Wrote http://example.com/foo.json to bar.json") expect(File.exist?("bar.json")).to eq(true) expect(File.read("bar.json")).to eq("content") end it "fails if fetch fails" do File.write(Command::CODECLIMATE_YAML, FIXTURE_CONFIG) resp = double(code: "404", body: "Not Found") stub_resp("http://example.com/foo.json", "255.255.255.255", resp) stdout, stderr, _ = capture_io_and_exit_code do Prepare.new.run end expect(stderr).to match("Failed fetching") expect(File.exist?("bar.json")).to eq(false) end end def stub_resp(url, addr, resp) uri = URI(url) stub_resolv(uri.host, addr) http = instance_double(Net::HTTP) allow(Net::HTTP).to receive(:new).with(uri.host, uri.port).and_return(http) allow(http).to receive(:get).with(uri).and_return(resp) allow(http).to receive(:use_ssl=).with(false) end end end