Add unit tests for AptProxyConfig

This commit is contained in:
Teemu Matilainen 2013-06-22 19:13:23 -03:00
parent df28094b75
commit e750c07583
6 changed files with 168 additions and 4 deletions

View file

@ -4,7 +4,8 @@ source 'https://rubygems.org'
gemspec gemspec
group :development do group :development do
gem 'rake'
gem 'rspec', '~> 2.11'
gem 'vagrant', github: 'mitchellh/vagrant' gem 'vagrant', github: 'mitchellh/vagrant'
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc' gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
gem 'rake'
end end

View file

@ -27,6 +27,7 @@ GEM
specs: specs:
childprocess (0.3.9) childprocess (0.3.9)
ffi (~> 1.0, >= 1.0.11) ffi (~> 1.0, >= 1.0.11)
diff-lcs (1.2.4)
erubis (2.7.0) erubis (2.7.0)
ffi (1.8.1) ffi (1.8.1)
i18n (0.6.4) i18n (0.6.4)
@ -36,12 +37,21 @@ GEM
net-ssh (>= 2.6.5) net-ssh (>= 2.6.5)
net-ssh (2.6.7) net-ssh (2.6.7)
rake (10.0.4) rake (10.0.4)
rspec (2.13.0)
rspec-core (~> 2.13.0)
rspec-expectations (~> 2.13.0)
rspec-mocks (~> 2.13.0)
rspec-core (2.13.1)
rspec-expectations (2.13.0)
diff-lcs (>= 1.1.3, < 2.0)
rspec-mocks (2.13.1)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
rake rake
rspec (~> 2.11)
vagrant! vagrant!
vagrant-cachier! vagrant-cachier!
vagrant-lxc! vagrant-lxc!

View file

@ -1,5 +1,11 @@
Dir['./tasks/**/*.rake'].each { |f| load f }
require 'bundler/gem_tasks' require 'bundler/gem_tasks'
require 'rspec/core/rake_task'
task :ci => ['spec:unit'] task :default => [:spec]
namespace :spec do
RSpec::Core::RakeTask.new('unit') do |t|
t.pattern = 'spec/unit/**/*_spec.rb'
end
end
task :spec => ['spec:unit']

10
spec/spec_helper.rb Normal file
View file

@ -0,0 +1,10 @@
RSpec.configure do |config|
config.expect_with :rspec do |c|
c.syntax = :expect
end
config.color = true
config.tty = true
end
require 'tempfile'
require 'vagrant-cachier'

View file

@ -0,0 +1,103 @@
def config_with(options)
instance.tap do |c|
options.each_pair { |k, v| c.send("#{k}=".to_sym, v) }
c.finalize!
end
end
def conf_line(proto, name, port = 3142)
if name == :direct
%Q{Acquire::#{proto}::Proxy "DIRECT";\n}
else
%Q{Acquire::#{proto}::Proxy "#{proto}://#{name}:#{port}";\n}
end
end
def conf_line_pattern(proto, name, port = 3142)
"^#{Regexp.escape(conf_line(proto, name, port))}"
end
shared_examples "apt proxy config" do |proto|
context "#{proto} proxy" do
context "with ip" do
subject { config_with(proto => "10.1.2.3") }
its(:enabled?) { should be_true }
its(:to_s) { should eq conf_line(proto, "10.1.2.3") }
end
context "with name" do
subject { config_with(proto => "proxy.example.com") }
its(:enabled?) { should be_true }
its(:to_s) { should eq conf_line(proto, "proxy.example.com") }
end
context "with name and port" do
subject { config_with(proto => "acng:8080") }
its(:enabled?) { should be_true }
its(:to_s) { should eq conf_line(proto, "acng", 8080) }
end
context "with protocol and name" do
subject { config_with(proto => "#{proto}://proxy.foo.tld") }
its(:enabled?) { should be_true }
its(:to_s) { should eq conf_line(proto, "proxy.foo.tld") }
end
context "with protocol and name and port" do
subject { config_with(proto => "#{proto}://prism.nsa.gov:666") }
its(:enabled?) { should be_true }
its(:to_s) { should eq conf_line(proto, "prism.nsa.gov", 666) }
end
["DIRECT", "direct"].each do |direct|
context "with #{direct.inspect}" do
subject { config_with(proto => direct) }
its(:enabled?) { should be_true }
its(:to_s) { should eq conf_line(proto, :direct) }
end
end
[false, ""].each do |unset|
context "with #{unset.inspect}" do
subject { config_with(proto => unset) }
its(:enabled?) { should be_true }
its(:to_s) { should eq "" }
end
end
context "with nil" do
subject { config_with(proto => nil) }
its(:enabled?) { should be_false }
its(:to_s) { should eq "" }
end
end
end
shared_examples "apt proxy env var" do |var, proto|
context var do
let(:conf) { config_with(http: "acng:8080", https: "ssl-proxy:8443") }
it "sets #{proto} proxy" do
ENV[var] = "myproxy"
expect(conf.to_s).to match conf_line_pattern(proto, "myproxy")
end
it "does not set other proxies" do
ENV[var] = "myproxy:2345"
conf = config_with({})
expect(conf.to_s).to eq conf_line(proto, "myproxy", 2345)
end
it "sets empty configuration" do
ENV[var] = ""
expect(conf.to_s).to_not match %r{#{proto}://}
end
it "sets direct configuration" do
ENV[var] = "direct"
expect(conf.to_s).to match conf_line_pattern(proto, :direct)
end
end
end

View file

@ -0,0 +1,34 @@
require 'spec_helper'
require 'unit/support/shared/apt_proxy_config'
require 'vagrant-cachier/apt_proxy_config'
describe VagrantPlugins::Cachier::AptProxyConfig do
let(:instance) { described_class.new }
before :each do
# Ensure tests are not affected by environment variables
%w[APT_PROXY_HTTP APT_PROXY_HTTPS].each { |k| ENV.delete(k) }
end
context "defaults" do
subject { config_with({}) }
its(:enabled?) { should be_false }
its(:to_s) { should eq "" }
end
include_examples "apt proxy config", "http"
include_examples "apt proxy config", "https"
context "with both http and https proxies" do
subject { config_with(http: "10.2.3.4", https: "ssl-proxy:8443") }
its(:enabled?) { should be_true }
its(:to_s) { should match conf_line_pattern("http", "10.2.3.4") }
its(:to_s) { should match conf_line_pattern("https", "ssl-proxy", 8443) }
end
context "with env var" do
include_examples "apt proxy env var", "APT_PROXY_HTTP", "http"
include_examples "apt proxy env var", "APT_PROXY_HTTPS", "https"
end
end