summaryrefslogtreecommitdiff
path: root/spec/lib
diff options
context:
space:
mode:
authorMatija Čupić <matteeyah@gmail.com>2018-09-07 19:57:57 +0200
committerMatija Čupić <matteeyah@gmail.com>2018-09-07 19:57:57 +0200
commitc3e33f06c2920a9f032ee8166cccf8423bd24b78 (patch)
treec04eda599e6ef1fb2206bf586e05b8b798ed4ffa /spec/lib
parent9083fc04f1add6f7e4628cdb10fef69c6b815ef5 (diff)
downloadgitlab-ce-c3e33f06c2920a9f032ee8166cccf8423bd24b78.tar.gz
Build barebones for ExternalFiles libraries
CE mirror of 30ca00f17034f654403ec7cb5dc370d1e5db8152
Diffstat (limited to 'spec/lib')
-rw-r--r--spec/lib/gitlab/ci/config/entry/global_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/config/entry/includes_spec.rb97
-rw-r--r--spec/lib/gitlab/ci/external_files/external_file_spec.rb78
-rw-r--r--spec/lib/gitlab/ci/external_files/mapper_spec.rb39
-rw-r--r--spec/lib/gitlab/ci/external_files/processor_spec.rb141
5 files changed, 358 insertions, 3 deletions
diff --git a/spec/lib/gitlab/ci/config/entry/global_spec.rb b/spec/lib/gitlab/ci/config/entry/global_spec.rb
index 1860ed79bfd..ff623b95be8 100644
--- a/spec/lib/gitlab/ci/config/entry/global_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/global_spec.rb
@@ -13,7 +13,7 @@ describe Gitlab::Ci::Config::Entry::Global do
expect(described_class.nodes.keys)
.to match_array(%i[before_script image services
after_script variables stages
- types cache])
+ types cache includes])
end
end
end
@@ -42,7 +42,7 @@ describe Gitlab::Ci::Config::Entry::Global do
end
it 'creates node object for each entry' do
- expect(global.descendants.count).to eq 8
+ expect(global.descendants.count).to eq 9
end
it 'creates node object using valid class' do
@@ -189,7 +189,7 @@ describe Gitlab::Ci::Config::Entry::Global do
describe '#nodes' do
it 'instantizes all nodes' do
- expect(global.descendants.count).to eq 8
+ expect(global.descendants.count).to eq 9
end
it 'contains unspecified nodes' do
diff --git a/spec/lib/gitlab/ci/config/entry/includes_spec.rb b/spec/lib/gitlab/ci/config/entry/includes_spec.rb
new file mode 100644
index 00000000000..d72503535ed
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/entry/includes_spec.rb
@@ -0,0 +1,97 @@
+require 'rails_helper'
+
+describe Gitlab::Ci::Config::Entry::Includes do
+ let(:entry) { described_class.new(config) }
+
+ shared_examples 'valid external file' do
+ it 'should be valid' do
+ expect(entry).to be_valid
+ end
+
+ it 'should not return any error' do
+ expect(entry.errors).to be_empty
+ end
+ end
+
+ shared_examples 'invalid external file' do
+ it 'should not be valid' do
+ expect(entry).not_to be_valid
+ end
+
+ it 'should return an error' do
+ expect(entry.errors.first).to match(/should be a valid local or remote file/)
+ end
+ end
+
+ describe "#valid?" do
+ context 'with no external file given' do
+ let(:config) { nil }
+
+ it_behaves_like 'valid external file'
+ end
+
+ context 'with multiple external files' do
+ let(:config) { %w(https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-2.yml) }
+
+ it_behaves_like 'valid external file'
+ end
+
+ context 'with just one external file' do
+ let(:config) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it_behaves_like 'valid external file'
+ end
+
+ context 'when they contain valid URLs' do
+ let(:config) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it_behaves_like 'valid external file'
+ end
+
+ context 'when they contain valid relative URLs' do
+ let(:config) { '/vendor/gitlab-ci-yml/Auto-DevOps.gitlab-ci.yml' }
+
+ it_behaves_like 'valid external file'
+ end
+
+ context 'when they not contain valid URLs' do
+ let(:config) { 'not-valid://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it_behaves_like 'invalid external file'
+ end
+
+ context 'when they not contain valid relative URLs' do
+ let(:config) { '/vendor/gitlab-ci-yml/non-existent-file.yml' }
+
+ it_behaves_like 'invalid external file'
+ end
+ end
+
+ describe "#value" do
+ context 'with multiple external files' do
+ let(:config) { %w(https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-2.yml) }
+ it 'should return an array' do
+ expect(entry.value).to be_an(Array)
+ expect(entry.value.count).to eq(2)
+ end
+ end
+
+ context 'with just one external file' do
+ let(:config) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it 'should return an array' do
+ expect(entry.value).to be_an(Array)
+ expect(entry.value.count).to eq(1)
+ end
+ end
+
+ context 'with no external file given' do
+ let(:config) { nil }
+
+ it 'should return an empty array' do
+ expect(entry.value).to be_an(Array)
+ expect(entry.value).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/external_files/external_file_spec.rb b/spec/lib/gitlab/ci/external_files/external_file_spec.rb
new file mode 100644
index 00000000000..80468f63435
--- /dev/null
+++ b/spec/lib/gitlab/ci/external_files/external_file_spec.rb
@@ -0,0 +1,78 @@
+require 'rails_helper'
+
+describe Gitlab::Ci::ExternalFiles::ExternalFile do
+ let(:external_file) { described_class.new(value) }
+
+ describe "#valid?" do
+ context 'when is a valid remote url' do
+ let(:value) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it 'should return true' do
+ expect(external_file.valid?).to be_truthy
+ end
+ end
+
+ context 'when is not a valid remote url' do
+ let(:value) { 'not-valid://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ it 'should return false' do
+ expect(external_file.valid?).to be_falsy
+ end
+ end
+
+ context 'when is a valid local path' do
+ let(:value) { '/vendor/gitlab-ci-yml/existent-file.yml' }
+
+ it 'should return true' do
+ allow(File).to receive(:exists?).and_return(true)
+ expect(external_file.valid?).to be_truthy
+ end
+ end
+
+ context 'when is not a valid local path' do
+ let(:value) { '/vendor/gitlab-ci-yml/non-existent-file.yml' }
+
+ it 'should return false' do
+ expect(external_file.valid?).to be_falsy
+ end
+ end
+ end
+
+ describe "#content" do
+ let(:external_file_content) {
+ <<-HEREDOC
+ before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+ HEREDOC
+ }
+
+ context 'with a local file' do
+ let(:value) { '/vendor/gitlab-ci-yml/non-existent-file.yml' }
+
+ before do
+ allow(File).to receive(:exists?).and_return(true)
+ allow(File).to receive(:read).and_return(external_file_content)
+ end
+
+ it 'should return the content of the file' do
+ expect(external_file.content).to eq(external_file_content)
+ end
+ end
+
+ context 'with a valid remote file' do
+ let(:value) { 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml' }
+
+ before do
+ allow_any_instance_of(Kernel).to receive_message_chain(:open, :read).and_return(external_file_content)
+ end
+
+ it 'should return the content of the file' do
+ expect(external_file.content).to eq(external_file_content)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/external_files/mapper_spec.rb b/spec/lib/gitlab/ci/external_files/mapper_spec.rb
new file mode 100644
index 00000000000..dfbf8bfa098
--- /dev/null
+++ b/spec/lib/gitlab/ci/external_files/mapper_spec.rb
@@ -0,0 +1,39 @@
+require 'rails_helper'
+
+describe Gitlab::Ci::ExternalFiles::Mapper do
+ describe '.fetch_paths' do
+ context 'when includes is defined as string' do
+ let(:values) { { includes: '/vendor/gitlab-ci-yml/non-existent-file.yml', image: 'ruby:2.2'} }
+
+ it 'returns an array' do
+ expect(described_class.fetch_paths(values)).to be_an(Array)
+ end
+
+ it 'returns ExternalFile instances' do
+ expect(described_class.fetch_paths(values).first).to be_an_instance_of(::Gitlab::Ci::ExternalFiles::ExternalFile)
+ end
+ end
+
+ context 'when includes is defined as an array' do
+ let(:values) { { includes: ['https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml', '/vendor/gitlab-ci-yml/template.yml'], image: 'ruby:2.2'} }
+ it 'returns an array' do
+ expect(described_class.fetch_paths(values)).to be_an(Array)
+ end
+
+ it 'returns ExternalFile instances' do
+ paths = described_class.fetch_paths(values)
+ paths.each do |path|
+ expect(path).to be_an_instance_of(::Gitlab::Ci::ExternalFiles::ExternalFile)
+ end
+ end
+ end
+
+ context 'when includes is not defined' do
+ let(:values) { { image: 'ruby:2.2'} }
+
+ it 'returns an empty array' do
+ expect(described_class.fetch_paths(values)).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/external_files/processor_spec.rb b/spec/lib/gitlab/ci/external_files/processor_spec.rb
new file mode 100644
index 00000000000..51ed14de4cf
--- /dev/null
+++ b/spec/lib/gitlab/ci/external_files/processor_spec.rb
@@ -0,0 +1,141 @@
+require 'rails_helper'
+
+describe Gitlab::Ci::ExternalFiles::Processor do
+ let(:processor) { described_class.new(values) }
+
+ describe "#perform" do
+ context 'when no external files defined' do
+ let(:values) { { image: 'ruby:2.2' } }
+
+ it 'should return the same values' do
+ expect(processor.perform).to eq(values)
+ end
+ end
+
+ context 'when an invalid local file is defined' do
+ let(:values) { { includes: '/vendor/gitlab-ci-yml/non-existent-file.yml', image: 'ruby:2.2'} }
+
+ it 'should raise an error' do
+ expect { processor.perform }.to raise_error(described_class::ExternalFileError)
+ end
+ end
+
+ context 'when an invalid remote file is defined' do
+ let(:values) { { includes: 'not-valid://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml', image: 'ruby:2.2'} }
+
+ it 'should raise an error' do
+ expect { processor.perform }.to raise_error(described_class::ExternalFileError)
+ end
+ end
+
+ context 'with a valid remote external file is defined' do
+ let(:values) { { includes: 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml', image: 'ruby:2.2' } }
+ let(:external_file_content) {
+ <<-HEREDOC
+ before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+
+ rspec:
+ script:
+ - bundle exec rspec
+
+ rubocop:
+ script:
+ - bundle exec rubocop
+ HEREDOC
+ }
+
+ before do
+ allow_any_instance_of(Kernel).to receive_message_chain(:open, :read).and_return(external_file_content)
+ end
+
+ it 'should append the file to the values' do
+ output = processor.perform
+ expect(output.keys).to match_array([:image, :before_script, :rspec, :rubocop])
+ end
+
+ it "should remove the 'includes' keyword" do
+ expect(processor.perform[:includes]).to be_nil
+ end
+ end
+
+ context 'with a valid local external file is defined' do
+ let(:values) { { includes: '/vendor/gitlab-ci-yml/template.yml' , image: 'ruby:2.2'} }
+ let(:external_file_content) {
+ <<-HEREDOC
+ before_script:
+ - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
+ - ruby -v
+ - which ruby
+ - gem install bundler --no-ri --no-rdoc
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
+ HEREDOC
+ }
+
+ before do
+ allow(File).to receive(:exists?).and_return(true)
+ allow(File).to receive(:read).and_return(external_file_content)
+ end
+
+ it 'should append the file to the values' do
+ output = processor.perform
+ expect(output.keys).to match_array([:image, :before_script])
+ end
+
+ it "should remove the 'includes' keyword" do
+ expect(processor.perform[:includes]).to be_nil
+ end
+ end
+
+ context 'with multiple external files are defined' do
+ let(:external_files) {
+ [
+ "/spec/ee/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml",
+ "/spec/ee/fixtures/gitlab/ci/external_files/.gitlab-ci-template-2.yml",
+ 'https://gitlab.com/gitlab-org/gitlab-ce/blob/1234/.gitlab-ci-1.yml'
+ ]
+ }
+ let(:values) { { includes: external_files, image: 'ruby:2.2'} }
+
+ let(:remote_file_content) {
+ <<-HEREDOC
+ stages:
+ - build
+ - review
+ - cleanup
+ HEREDOC
+ }
+
+ before do
+ allow_any_instance_of(Kernel).to receive_message_chain(:open, :read).and_return(remote_file_content)
+ end
+
+ it 'should append the files to the values' do
+ expect(processor.perform.keys).to match_array([:image, :variables, :stages, :before_script, :rspec])
+ end
+
+ it "should remove the 'includes' keyword" do
+ expect(processor.perform[:includes]).to be_nil
+ end
+ end
+
+ context 'when external files are defined but not valid' do
+ let(:values) { { includes: '/vendor/gitlab-ci-yml/template.yml', image: 'ruby:2.2'} }
+
+ let(:external_file_content) { 'invalid content file ////' }
+
+ before do
+ allow(File).to receive(:exists?).and_return(true)
+ allow(File).to receive(:read).and_return(external_file_content)
+ end
+
+ it 'should raise an error' do
+ expect { processor.perform }.to raise_error(Gitlab::Ci::Config::Loader::FormatError)
+ end
+ end
+ end
+end