spec/cc/cli/version_checker_spec.rb (93 lines of code) (raw):
require "spec_helper"
describe CC::CLI::VersionChecker do
around(:each) do |example|
Dir.mktmpdir do |dir|
original_config = CC::CLI::GlobalConfig.send :remove_const, :FILE_NAME
CC::CLI::GlobalConfig.const_set :FILE_NAME, File.join(dir, "config.yml")
File.write CC::CLI::GlobalConfig::FILE_NAME, "---"
original_cache = CC::CLI::GlobalCache.send :remove_const, :FILE_NAME
CC::CLI::GlobalCache.const_set :FILE_NAME, File.join(dir, "cache.yml")
File.write CC::CLI::GlobalCache::FILE_NAME, "---"
example.run
CC::CLI::GlobalConfig.send :remove_const, :FILE_NAME
CC::CLI::GlobalConfig.const_set :FILE_NAME, original_config
CC::CLI::GlobalCache.send :remove_const, :FILE_NAME
CC::CLI::GlobalCache.const_set :FILE_NAME, original_cache
end
end
before do
allow(UUID).to receive(:new).
and_return(instance_double("UUID", generate: uuid))
allow_any_instance_of(CC::CLI::Version).to receive(:version).and_return(current_version)
end
let(:uuid) { "definitely-a-uuid" }
let(:current_version) { "1.2.3" }
let(:checker) { described_class.new }
it "doesn't do anything when disabled in global config" do
config = CC::CLI::GlobalConfig.new
config.check_version = false
config.save
allow(checker).to receive(:outdated?)
checker.check
expect(checker).to_not have_received(:outdated?)
end
it "checks version against the API" do
stub_version_request(latest: "0.1.2", outdated: true)
_, stderr = capture_io do
checker.check
end
expect(stderr).to include "A new version (v0.1.2) is available"
end
it "persists config" do
stub_version_request(latest: "0.1.2", outdated: true)
config = File.read CC::CLI::GlobalCache::FILE_NAME
expect(config).to eq "---"
capture_io do
checker.check
end
config = File.read CC::CLI::GlobalConfig::FILE_NAME
expect(config).to include "uuid: definitely-a-uuid"
end
it "prints nothing when up to date" do
stub_version_request(latest: "0.1.2", outdated: false)
_, stderr = capture_io do
checker.check
end
expect(stderr).to eq ""
end
it "does nothing when API is unavailable" do
stub_resolv("versions.codeclimate.com", "255.255.255.255")
allow(Net::HTTP).to receive(:start).and_return(Net::HTTPServerError.new(500, "Nope", "Nope Nope"))
cache = CC::CLI::GlobalCache.new
cache.latest_version = "0.1.1"
cache.outdated = true
_, stderr = capture_io do
checker.check
end
expect(stderr).to eq ""
end
it "does nothing if checked recently" do
cache = CC::CLI::GlobalCache.new
cache.last_version_check = Time.now
cache.latest_version = "0.1.1"
cache.outdated = true
_, stderr = capture_io do
checker.check
end
expect(stderr).to eq ""
end
def stub_version_request(versions_resp)
uri = URI("https://versions.codeclimate.com")
uri.query = { version: current_version, uid: uuid }.to_query
stub_resolv(uri.host, "255.255.255.255")
resp = Net::HTTPOK.new("1.1", 200, "OK")
allow(resp).to receive(:body).and_return(versions_resp.to_json)
http = instance_double(Net::HTTP)
allow(http).to receive(:open_timeout=).with(5)
allow(http).to receive(:read_timeout=).with(5)
allow(http).to receive(:ssl_timeout=).with(5)
allow(http).to receive(:use_ssl=).with(true)
allow(http).to receive(:get).with(uri, "User-Agent" => /Code Climate CLI/).and_return(resp)
allow(Net::HTTP).to receive(:new).with(uri.host, uri.port).and_return(http)
end
end