spec/lib/retrospective_spec.rb (107 lines of code) (raw):

require 'retrospective' require 'team' RSpec.describe Retrospective do let(:teams) do { 'Plan' => { 'label' => 'plan', 'project' => 'plan', 'owner' => 'smcgivern', 'mention_team' => false, 'mention_team_on_creation' => false, 'create_discussions' => false, 'create_individual_discussions' => false, }, 'Create' => { 'label' => 'group::code%20review', 'project' => 'create-stage%2fcode-review', 'owner' => 'm_gill', 'mention_team' => false, 'mention_team_on_creation' => false, 'create_discussions' => false, 'create_individual_discussions' => false, }, 'Discussion' => { 'label' => 'group::discussion', 'project' => 'create-stage%2fdiscussion', 'owner' => 'n_g_neering', 'mention_team' => false, 'mention_team_on_creation' => false, 'create_discussions' => true, 'create_individual_discussions' => false, } } end let(:read_client) { GitlabApi.new(token: '1234') } let(:write_client) { GitlabApi.new(token: '4567') } let(:subject) { Retrospective.new(read_client: read_client, write_client: write_client) } before do allow(Team).to receive(:hash_from_file).and_return(teams) # Allow puts to prevent test output pollution allow(subject).to receive(:puts) end describe '#create_issue' do let(:issue) do { '_links' => { 'self' => 'issue_link' } } end let(:milestone) do { 'start_date' => (Date.today - 3).to_s, 'title' => '30.5' } end let(:success_response) { double(code: 200) } let(:issue_discussions_path) { issue['_links']['self'] + '/discussions' } before do allow_any_instance_of(DescriptionTemplate).to receive(:result_with_hash).and_return('issue_description') allow(write_client).to receive(:post).with("projects/gl-retrospectives%2F#{team.project}/issues", hash_including(:body)).and_return(issue) end context 'when performing a dry run' do let(:team) { Team.find('Discussion') } it 'passes release as a hash to DescriptionTemplate' do expect(DescriptionTemplate).to receive(:new).with(team, milestone, anything).and_call_original subject.create_issue(team: team, release: milestone, dry_run: true) end end context 'when creating an issue' do let(:team) { Team.find('Plan') } let(:expected_body) do { title: "#{milestone['title']} #{team.name} retrospective", description: anything, confidential: false } end it 'makes a post request with valid fields' do expect(write_client).to receive(:post).with("projects/gl-retrospectives%2F#{team.project}/issues", body: expected_body) subject.create_issue(team: team, release: milestone, dry_run: false) end end context 'when discussions should be created' do let(:team) { Team.find('Discussion') } it 'makes post requests with set discussion topics' do expect(write_client).to receive(:post).with(issue_discussions_path, body: { body: '## 👍 What went well this release?' }).and_return(success_response) expect(write_client).to receive(:post).with(issue_discussions_path, body: { body: '## 👎 What didn\'t go well this release?' }).and_return(success_response) expect(write_client).to receive(:post).with(issue_discussions_path, body: { body: '## 📈 What can we improve going forward?' }).and_return(success_response) expect(write_client).to receive(:post).with(issue_discussions_path, body: { body: '## 🌟 What praise do you have for the group?' }).and_return(success_response) subject.create_issue(team: team, release: milestone, dry_run: false) end end context 'when discussion should not be created' do let(:team) { Team.find('Plan') } it 'makes no post requests' do expect(write_client).not_to receive(:post).with(issue_discussions_path, hash_including(:body)) subject.create_issue(team: team, release: milestone, dry_run: false) end end context 'when parent topic should not be created' do let(:team) { Team.find('Plan') } it 'makes no post request' do expect(write_client).not_to receive(:post).with(issue_discussions_path, hash_including(:body)) subject.create_issue(team: team, release: milestone, dry_run: false) end end end end