spec/lib/release_tools/slack/chatops_notification_spec.rb (88 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' describe ReleaseTools::Slack::ChatopsNotification do include SlackWebhookHelpers let(:webhook_url) { 'https://slack.example.com/' } describe '.webhook_url' do it 'returns ENV value when set' do ClimateControl.modify(SLACK_CHATOPS_URL: webhook_url) do expect(described_class.webhook_url).to eq(webhook_url) end end end describe '.release_issue' do around do |ex| env = { CI_JOB_URL: 'ci.example.com', SLACK_CHATOPS_URL: webhook_url, TASK: 'release_issue', } ClimateControl.modify(env) { ex.run } end context 'outside of ChatOps' do around do |ex| ClimateControl.modify(TASK: nil) { ex.run } end it 'does nothing' do expect(described_class).not_to receive(:fire_hook) described_class.release_issue(spy) end end context 'with a new issue' do around do |ex| ClimateControl.modify(CHAT_CHANNEL: 'foo') { ex.run } end it 'posts a success message' do issue = double(status: :created, title: 'Title', url: 'example.com') expect_post( json: { text: 'The `release_issue` command at ci.example.com completed!', channel: 'foo', attachments: [{ fallback: '', color: 'good', title: 'Title', title_link: 'example.com' }] } ).and_return(response(200)) described_class.release_issue(issue) end end context 'with a pre-existing issue' do it 'posts a warning message' do issue = double(status: :persisted, title: 'Title', url: 'example.com') expect_post( json: { text: 'The `release_issue` command at ci.example.com completed!', attachments: [{ fallback: '', color: 'warning', title: 'Title', title_link: 'example.com' }] } ).and_return(response(200)) described_class.release_issue(issue) end end end describe '.branch_status' do it 'posts a block-based message' do project = double(to_s: 'foo/bar') result = double(status: 'success', web_url: 'https://example.com', ref: 'abcdefg') expect(described_class) .to receive(:fire_hook).with( a_hash_including( blocks: [{ type: 'section', fields: [{ type: 'mrkdwn', text: "*foo/bar*\n:status_success: <https://example.com|abcdefg>" }] }] ) ) described_class.branch_status(project => [result]) end end end