spec/lib/release_tools/slack/bookmark_spec.rb (164 lines of code) (raw):
# frozen_string_literal: true
require 'spec_helper'
describe ReleaseTools::Slack::Bookmark do
let(:slack_channel) { 'foo' }
shared_examples 'without credentials' do
it 'raises NoCredentialsError' do
ClimateControl.modify(SLACK_APP_BOT_TOKEN: nil) do
expect do
subject
end.to raise_error(described_class::NoCredentialsError)
end
end
end
describe '.list' do
subject(:list) { described_class.list(channel: slack_channel) }
it_behaves_like 'without credentials'
context 'with credentials' do
let(:fake_client) { double(:client) }
let(:request_params) { { channel_id: slack_channel } }
let(:json_response) do
{
ok: true,
channel: slack_channel,
ts: '123456'
}.to_json
end
let(:response) do
instance_spy(
HTTP::Response,
status: double(:status, success?: true),
code: 200,
reason: 'OK',
body: json_response
)
end
before do
allow(described_class)
.to receive(:client).and_return(fake_client)
allow(fake_client)
.to receive(:post).and_return(response)
end
it 'fetches the list of bookmarks for a slack channel' do
expect(fake_client)
.to receive(:post)
.with(
described_class::LIST_URL,
json: request_params
)
ClimateControl.modify(SLACK_APP_BOT_TOKEN: '123456') do
without_dry_run do
list
end
end
end
end
end
describe '.edit' do
let(:message) { 'baz' }
let(:bookmark_id) { 'asdf1234' }
let(:link) { 'https://example.com' }
subject(:edit) { described_class.edit(channel: slack_channel, bookmark: bookmark_id, link: link) }
it_behaves_like 'without credentials'
context 'with credentials' do
let(:fake_client) { double(:client) }
let(:request_params) do
{
channel_id: slack_channel,
bookmark_id: bookmark_id,
link: link
}
end
let(:json_response) do
{
ok: true,
channel: slack_channel,
ts: '123456'
}.to_json
end
let(:response) do
instance_spy(
HTTP::Response,
status: double(:status, success?: true),
code: 200,
reason: 'OK',
body: json_response
)
end
before do
allow(described_class)
.to receive(:client).and_return(fake_client)
allow(fake_client)
.to receive(:post).and_return(response)
end
it 'edits a bookmark' do
expect(fake_client)
.to receive(:post)
.with(
described_class::EDIT_URL,
json: request_params
)
ClimateControl.modify(SLACK_APP_BOT_TOKEN: '123456') do
without_dry_run do
edit
end
end
end
context 'when slack_down FF is on' do
before do
enable_feature(:slack_down)
end
it 'does not call API' do
expect(fake_client).not_to receive(:post)
ClimateControl.modify(SLACK_APP_BOT_TOKEN: '123456') do
without_dry_run do
expect(edit).to eq({})
end
end
end
end
context 'when response is not ok' do
let(:json_response) { { ok: false, error: 'invalid_auth' }.to_json }
around do |ex|
ClimateControl.modify(SLACK_APP_BOT_TOKEN: '123456') do
without_dry_run do
ex.run
end
end
end
it 'raises SlackBookmarkError' do
expect { edit }
.to raise_error(described_class::SlackBookmarkError)
end
end
context 'when response is not successful' do
let(:response) do
instance_spy(
HTTP::Response,
status: double(:status, success?: false),
code: 400,
reason: 'Bad Request',
body: nil
)
end
around do |ex|
ClimateControl.modify(SLACK_APP_BOT_TOKEN: '123456') do
without_dry_run do
ex.run
end
end
end
it 'raises SlackBookmarkError' do
expect { edit }.to raise_error(described_class::SlackBookmarkError)
end
end
context 'with dry run' do
it 'does nothing' do
expect(described_class).not_to receive(:client)
ClimateControl.modify(SLACK_APP_BOT_TOKEN: '123456') do
expect(edit).to eq({})
end
end
end
end
end
end