logstash/spec/unit/plugin_manager/gemfile_spec.rb

212 lines
5.9 KiB
Ruby

# encoding: utf-8
require "spec_helper"
require "pluginmanager/gemfile"
describe "logstash Gemfile Manager" do
context LogStash::Gemfile do
context "load" do
it "should load and return self" do
file = <<-END
source "https://rubygems.org"
gemspec :a => "a"
gem "test", "> 1.0", "< 2.0", :b => "b"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile).to be_an(LogStash::Gemfile)
end
it "should add sources" do
file = <<-END
source "a"
source "b"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile.gemset.sources.size).to eq(2)
expect(gemfile.gemset.sources).to eq(["a", "b"])
end
it "should add gemspec" do
file = <<-END
gemspec "foo"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile.gemset.gemspec).to eq("foo")
end
it "should raise on multiple gemspec" do
file = <<-END
gemspec "foo"
gemspec "boom"
END
expect{LogStash::Gemfile.new(StringIO.new(file)).load}.to raise_error(LogStash::GemfileError)
end
it "should add gems" do
file = <<-END
gem "foo"
gem "bar"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile.gemset.gems.size).to eq(2)
expect(gemfile.gemset.gems[0].name).to eq("foo")
expect(gemfile.gemset.gems[1].name).to eq("bar")
end
it "should raise on duplicate gem name" do
file = <<-END
gem "foo"
gem "foo"
END
expect{LogStash::Gemfile.new(StringIO.new(file)).load}.to raise_error(LogStash::GemfileError)
end
it "should add gems with only name" do
file = <<-END
gem "foo"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile.gemset.gems[0].name).to eq("foo")
expect(gemfile.gemset.gems[0].requirements.empty?).to eq(true)
expect(gemfile.gemset.gems[0].options.empty?).to eq(true)
end
it "should add gems with name and requirements" do
file = <<-END
gem "foo", "a"
gem "bar", "a", "b"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile.gemset.gems[0].name).to eq("foo")
expect(gemfile.gemset.gems[0].requirements).to eq(["a"])
expect(gemfile.gemset.gems[0].options.empty?).to eq(true)
expect(gemfile.gemset.gems[1].name).to eq("bar")
expect(gemfile.gemset.gems[1].requirements).to eq(["a", "b"])
expect(gemfile.gemset.gems[1].options.empty?).to eq(true)
end
it "should add gems with name and options" do
file = <<-END
gem "foo", :a => "a"
gem "bar", :a => "a", :b => "b"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile.gemset.gems[0].name).to eq("foo")
expect(gemfile.gemset.gems[0].requirements.empty?).to eq(true)
expect(gemfile.gemset.gems[0].options).to eq({:a => "a"})
expect(gemfile.gemset.gems[1].name).to eq("bar")
expect(gemfile.gemset.gems[1].requirements.empty?).to eq(true)
expect(gemfile.gemset.gems[1].options).to eq({:a => "a", :b => "b"})
end
it "should add gems with name, requirements and options" do
file = <<-END
gem "foo", "> 1.0", :b => "b"
gem "bar", "> 2.0", "< 3.0", :c => "c", :d => "d"
END
gemfile = LogStash::Gemfile.new(StringIO.new(file)).load
expect(gemfile.gemset.gems.size).to eq(2)
expect(gemfile.gemset.gems[0].name).to eq("foo")
expect(gemfile.gemset.gems[0].requirements).to eq(["> 1.0"])
expect(gemfile.gemset.gems[0].options).to eq({:b => "b"})
expect(gemfile.gemset.gems[1].name).to eq("bar")
expect(gemfile.gemset.gems[1].requirements).to eq(["> 2.0", "< 3.0"])
expect(gemfile.gemset.gems[1].options).to eq({:c => "c", :d => "d"})
end
end
describe "Locally installed gems" do
subject { LogStash::Gemfile.new(StringIO.new(file)).load.locally_installed_gems }
context "has gems defined with a path" do
let(:file) {
%Q[
source "https://rubygems.org"
gemspec :a => "a", "b" => 1
gem "foo", "> 1.0", :path => "/tmp/foo"
gem "bar", :path => "/tmp/bar"
gem "no-fun"
]
}
it "returns the list of gems" do
expect(subject.collect(&:name)).to eq(["foo", "bar"])
end
end
context "no gems defined with a path" do
let(:file) {
%Q[
source "https://rubygems.org"
gemspec :a => "a", "b" => 1
gem "no-fun"
]
}
it "return an empty list" do
expect(subject.size).to eq(0)
end
end
context "keep a backup of the original file" do
end
end
context "save" do
it "should save" do
file = <<-END
source "https://rubygems.org"
gemspec :a => "a", "b" => 1
gem "foo", "> 1.0", "< 2.0", :b => "b"
gem "bar"
END
io = StringIO.new(file)
gemfile = LogStash::Gemfile.new(io).load
gemfile.save
expect(file).to eq(
LogStash::Gemfile::HEADER + \
"source \"https://rubygems.org\"\n" + \
"gemspec :a => \"a\", \"b\" => 1\n" + \
"gem \"foo\", \"> 1.0\", \"< 2.0\", :b => \"b\"\n" + \
"gem \"bar\"\n"
)
end
end
end
context LogStash::DSL do
context "parse" do
it "should parse Gemfile content string" do
gemfile = <<-END
source "https://rubygems.org"
gemspec
gem "foo"
END
gemset = LogStash::DSL.parse(gemfile)
expect(gemset).to be_an(LogStash::Gemset)
end
end
end
end