spec/lib/description_template_spec.rb (90 lines of code) (raw):

require 'description_template' require 'team' RSpec.describe DescriptionTemplate do let(:api_client) { GitlabApi.new(token: 'token') } describe '#result_with_hash' do ISSUE_FIELDS = ['deliverables', 'features', 'bugs', 'issues', 'slipped', 'current_retrospective', 'issue_count', 'total_weight', 'merge_request_count'] EXPECTED_KEYS = ISSUE_FIELDS + ['issue_url_prefix', 'vsa_url_prefix', 'release_start_date', 'release_due_date'] let(:team) { Team::TeamInfo.new('backend') } let(:erb_template) { ERB.new('', trim_mode: '<>') } let(:release) { { 'title' => '1.0' } } let(:description_template) { described_class.new(team, release, api_client: api_client) } before do allow(description_template).to receive(:load_template).and_return(erb_template) ISSUE_FIELDS.each do |field| allow(description_template).to receive(field).and_return(field) end end context 'when the hash contains updating_description' do EXPECTED_KEYS.each do |field| it "includes #{field}" do expect(erb_template) .to receive(:result_with_hash).with(a_hash_including(field.to_sym)) description_template.result_with_hash(updating_description: true) end end end context 'when the hash does not contain updating_description' do EXPECTED_KEYS.each do |field| it "does not includes #{field}" do expect(erb_template).to receive(:result_with_hash) do |hash| expect(hash).not_to include(field.to_sym) end description_template.result_with_hash(updating_description: false) end end end context 'for a team with the default template' do before do allow(description_template).to receive(:load_template).and_call_original end let(:team) { Team.find('Create:Source Code') } it 'includes a quick action to apply the team label' do result = description_template.result_with_hash(updating_description: false) expect(result).to include("~\"#{team.label}\"") end end context 'for a team with the multiple owners' do before do allow(description_template).to receive(:load_template).and_call_original end let(:team) { Team.find('UX') } it 'includes a quick action to assign to all owners' do result = description_template.result_with_hash(updating_description: false) expect(result).to include("/assign @vkarnes @susantacker @ampesta") end end it 'supports nested templates' do default_template = ERB.new('<%= include_template.call("foo") %>') foo_template = ERB.new('<%= include_template.call("bar") %>') bar_template = ERB.new('This is bar: <%= release %>') allow(description_template) .to receive(:load_template).with('default').and_return(default_template) allow(description_template) .to receive(:load_template).with('foo').and_return(foo_template) allow(description_template) .to receive(:load_template).with('bar').and_return(bar_template) expect(description_template.result_with_hash({})) .to include('This is bar') .and include(release['title']) end end describe 'using the teams in teams.yml' do before do stub_request(:get, /\A#{Regexp.quote(GitlabApi::ENDPOINT)}/) .to_return( body: [ { title: 'title', web_url: 'url', labels: ['group::certify'] } ].to_json, headers: { 'Content-Type' => 'application/json' }, ) end Team.all.each do |team| it "renders the #{team.name} team template without errors" do release = { title: '12.0' } expect do described_class.new(team, release, api_client: api_client).result_with_hash(updating_description: false) described_class.new(team, release, api_client: api_client).result_with_hash(updating_description: true) end.not_to raise_error end end end end