Michael K Johnson da9106127a
FEATURE: Enable optional support for threading slack posts (#38)
When creating a new Discourse post from slack with the `post` feature, record the
slack `ts` thread ID for the resulting topic post using an HTML comment to pass
the `ts` through.

When notifying slack of new Discourse posts, record the slack `ts` thread ID in
the post's topic if it has not yet been recorded. (Normally, this will be done
for the topic post, except where notifications are being posted for old topics
before this feature was created.)

Add a new rule filter `thread` which posts threaded responses to slack if there
is a `ts` recorded for the post topic.

Modify the `trigger_notifications` interface to enable other integrations to
implement similar functionality.

Present the `thread` rule in the help text and admin UI only for the slack
providers.

https://meta.discourse.org/t/optionally-threading-posts-to-parent-topic-in-slack-integration/150759
2020-06-15 16:45:25 +01:00

50 lines
1.8 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
RSpec.describe DiscourseChat::Provider::MattermostProvider do
let(:post) { Fabricate(:post) }
describe '.trigger_notifications' do
let(:upload) { Fabricate(:upload) }
before do
SiteSetting.chat_integration_mattermost_enabled = true
SiteSetting.chat_integration_mattermost_webhook_url = "https://mattermost.blah/hook/abcd"
SiteSetting.logo_small = upload
end
let(:chan1) { DiscourseChat::Channel.create!(provider: 'mattermost', data: { identifier: "#awesomechannel" }) }
it 'sends a webhook request' do
stub1 = stub_request(:post, 'https://mattermost.blah/hook/abcd').to_return(status: 200)
described_class.trigger_notification(post, chan1, nil)
expect(stub1).to have_been_requested.once
end
describe 'when mattermost icon is not configured' do
it 'defaults to the right icon' do
message = described_class.mattermost_message(post, chan1)
expect(message[:icon_url]).to eq(UrlHelper.absolute(upload.url))
end
end
describe 'when mattermost icon has been configured' do
it 'should use the right icon' do
SiteSetting.chat_integration_mattermost_icon_url = "https://specific_logo"
message = described_class.mattermost_message(post, chan1)
expect(message[:icon_url]).to eq(SiteSetting.chat_integration_mattermost_icon_url)
end
end
it 'handles errors correctly' do
stub1 = stub_request(:post, "https://mattermost.blah/hook/abcd").to_return(status: 500, body: "error")
expect(stub1).to have_been_requested.times(0)
expect { described_class.trigger_notification(post, chan1, nil) }.to raise_exception(::DiscourseChat::ProviderError)
expect(stub1).to have_been_requested.once
end
end
end