Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/finders/template_finder_spec.rb')
-rw-r--r--spec/finders/template_finder_spec.rb192
1 files changed, 183 insertions, 9 deletions
diff --git a/spec/finders/template_finder_spec.rb b/spec/finders/template_finder_spec.rb
index 2da864b9a46..164975fdfb6 100644
--- a/spec/finders/template_finder_spec.rb
+++ b/spec/finders/template_finder_spec.rb
@@ -5,6 +5,102 @@ require 'spec_helper'
RSpec.describe TemplateFinder do
using RSpec::Parameterized::TableSyntax
+ let_it_be(:template_files) do
+ {
+ "Dockerfile/project_dockerfiles_template.dockerfile" => "project_dockerfiles_template content",
+ "gitignore/project_gitignores_template.gitignore" => "project_gitignores_template content",
+ "gitlab-ci/project_gitlab_ci_ymls_template.yml" => "project_gitlab_ci_ymls_template content",
+ ".gitlab/issue_templates/project_issues_template.md" => "project_issues_template content",
+ ".gitlab/merge_request_templates/project_merge_requests_template.md" => "project_merge_requests_template content"
+ }
+ end
+
+ RSpec.shared_examples 'fetches predefined vendor templates' do
+ where(:type, :vendored_name) do
+ :dockerfiles | 'Binary'
+ :gitignores | 'Actionscript'
+ :gitlab_ci_ymls | 'Android'
+ :metrics_dashboard_ymls | 'Default'
+ :gitlab_ci_syntax_ymls | 'Artifacts example'
+ end
+
+ with_them do
+ it 'returns all vendored templates when no name is specified' do
+ expect(result).to include(have_attributes(name: vendored_name))
+ end
+
+ context 'with name param' do
+ let(:params) { { name: vendored_name } }
+
+ it 'returns only the specified vendored template when a name is specified' do
+ expect(result).to have_attributes(name: vendored_name)
+ end
+
+ context 'with mistaken name param' do
+ let(:params) { { name: 'unknown' } }
+
+ it 'returns nil when an unknown name is specified' do
+ expect(result).to be_nil
+ end
+ end
+ end
+ end
+ end
+
+ RSpec.shared_examples 'no issues and merge requests templates available' do
+ context 'with issue and merge request templates' do
+ where(:type, :vendored_name) do
+ :issues | nil
+ :merge_requests | nil
+ end
+
+ with_them do
+ context 'when fetching all templates' do
+ it 'returns empty array' do
+ expect(result).to eq([])
+ end
+ end
+
+ context 'when looking for specific template by name' do
+ let(:params) { { name: 'anything' } }
+
+ it 'raises an error' do
+ expect { result }.to raise_exception(Gitlab::Template::Finders::RepoTemplateFinder::FileNotFoundError)
+ end
+ end
+ end
+ end
+ end
+
+ RSpec.shared_examples 'fetches issues and merge requests templates' do
+ where(:type, :template_name) do
+ :issues | 'project_issues_template'
+ :merge_requests | 'project_merge_requests_template'
+ end
+
+ with_them do
+ it 'returns all repository template files for issues and merge requests' do
+ expect(result).to include(have_attributes(name: template_name))
+ end
+
+ context 'with name param' do
+ let(:params) { { name: template_name } }
+
+ it 'returns only the specified vendored template when a name is specified' do
+ expect(result).to have_attributes(name: template_name)
+ end
+
+ context 'with mistaken name param' do
+ let(:params) { { name: 'unknown' } }
+
+ it 'raises an error when an unknown name is specified' do
+ expect { result }.to raise_exception(Gitlab::Template::Finders::RepoTemplateFinder::FileNotFoundError)
+ end
+ end
+ end
+ end
+ end
+
describe '#build' do
let(:project) { build_stubbed(:project) }
@@ -15,6 +111,8 @@ RSpec.describe TemplateFinder do
:licenses | ::LicenseTemplateFinder
:metrics_dashboard_ymls | described_class
:gitlab_ci_syntax_ymls | described_class
+ :issues | described_class
+ :merge_requests | described_class
end
with_them do
@@ -26,6 +124,37 @@ RSpec.describe TemplateFinder do
end
describe '#execute' do
+ let_it_be(:project) { nil }
+ let(:params) { {} }
+
+ subject(:result) { described_class.new(type, project, params).execute }
+
+ context 'when no project is passed in' do
+ it_behaves_like 'fetches predefined vendor templates'
+ it_behaves_like 'no issues and merge requests templates available'
+ end
+
+ context 'when project has no repository' do
+ let_it_be(:project) { create(:project) }
+
+ it_behaves_like 'fetches predefined vendor templates'
+ it_behaves_like 'no issues and merge requests templates available'
+ end
+
+ context 'when project has a repository' do
+ let_it_be(:project) { create(:project, :custom_repo, files: template_files) }
+
+ it_behaves_like 'fetches predefined vendor templates'
+ it_behaves_like 'fetches issues and merge requests templates'
+ end
+ end
+
+ describe '#template_names' do
+ let_it_be(:project) { nil }
+ let(:params) { {} }
+
+ subject(:result) { described_class.new(type, project, params).template_names.values.flatten.map { |el| OpenStruct.new(el) } }
+
where(:type, :vendored_name) do
:dockerfiles | 'Binary'
:gitignores | 'Actionscript'
@@ -35,22 +164,67 @@ RSpec.describe TemplateFinder do
end
with_them do
- it 'returns all vendored templates when no name is specified' do
- result = described_class.new(type, nil).execute
+ context 'when no project is passed in' do
+ it 'returns all vendored templates when no name is specified' do
+ expect(result).to include(have_attributes(name: vendored_name))
+ end
+ end
- expect(result).to include(have_attributes(name: vendored_name))
+ context 'when project has no repository' do
+ let_it_be(:project) { create(:project) }
+
+ it 'returns all vendored templates when no name is specified' do
+ expect(result).to include(have_attributes(name: vendored_name))
+ end
end
- it 'returns only the specified vendored template when a name is specified' do
- result = described_class.new(type, nil, name: vendored_name).execute
+ context 'when project has a repository' do
+ let_it_be(:project) { create(:project, :custom_repo, files: template_files) }
- expect(result).to have_attributes(name: vendored_name)
+ it 'returns all vendored templates when no name is specified' do
+ expect(result).to include(have_attributes(name: vendored_name))
+ end
end
- it 'returns nil when an unknown name is specified' do
- result = described_class.new(type, nil, name: 'unknown').execute
+ context 'template names hash keys' do
+ it 'has all the expected keys' do
+ expect(result.first.to_h.keys).to match_array(%i(id key name project_id))
+ end
+ end
+ end
+
+ where(:type, :template_name) do
+ :issues | 'project_issues_template'
+ :merge_requests | 'project_merge_requests_template'
+ end
+
+ with_them do
+ context 'when no project is passed in' do
+ it 'returns all vendored templates when no name is specified' do
+ expect(result).to eq([])
+ end
+ end
+
+ context 'when project has no repository' do
+ let_it_be(:project) { create(:project) }
+
+ it 'returns all vendored templates when no name is specified' do
+ expect(result).to eq([])
+ end
+ end
+
+ context 'when project has a repository' do
+ let_it_be(:project) { create(:project, :custom_repo, files: template_files) }
+
+ it 'returns all vendored templates when no name is specified' do
+ expect(result).to include(have_attributes(name: template_name))
+ end
- expect(result).to be_nil
+ context 'template names hash keys' do
+ it 'has all the expected keys' do
+ expect(result.first.to_h.keys).to match_array(%i(id key name project_id))
+ end
+ end
end
end
end