diff options
Diffstat (limited to 'spec/finders/template_finder_spec.rb')
-rw-r--r-- | spec/finders/template_finder_spec.rb | 192 |
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 |