summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/chat/responder/mattermost_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/chat/responder/mattermost_spec.rb')
-rw-r--r--spec/lib/gitlab/chat/responder/mattermost_spec.rb117
1 files changed, 117 insertions, 0 deletions
diff --git a/spec/lib/gitlab/chat/responder/mattermost_spec.rb b/spec/lib/gitlab/chat/responder/mattermost_spec.rb
new file mode 100644
index 00000000000..f3480dfef06
--- /dev/null
+++ b/spec/lib/gitlab/chat/responder/mattermost_spec.rb
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Chat::Responder::Mattermost do
+ let(:chat_name) { create(:chat_name, chat_id: 'U123') }
+
+ let(:pipeline) do
+ pipeline = create(:ci_pipeline)
+
+ pipeline.create_chat_data!(
+ response_url: 'http://example.com',
+ chat_name_id: chat_name.id
+ )
+
+ pipeline
+ end
+
+ let(:build) { create(:ci_build, pipeline: pipeline) }
+ let(:responder) { described_class.new(build) }
+
+ describe '#send_response' do
+ it 'sends a response back to Slack' do
+ expect(Gitlab::HTTP).to receive(:post).with(
+ 'http://example.com',
+ { headers: { 'Content-Type': 'application/json' }, body: 'hello'.to_json }
+ )
+
+ responder.send_response('hello')
+ end
+ end
+
+ describe '#success' do
+ it 'returns the output for a successful build' do
+ expect(responder)
+ .to receive(:send_response)
+ .with(
+ hash_including(
+ response_type: :in_channel,
+ attachments: array_including(
+ a_hash_including(
+ text: /#{pipeline.chat_data.chat_name.user.name}.*completed successfully/,
+ fields: array_including(
+ a_hash_including(value: /##{build.id}/),
+ a_hash_including(value: build.name),
+ a_hash_including(value: "```shell\nscript output\n```")
+ )
+ )
+ )
+ )
+ )
+
+ responder.success('script output')
+ end
+
+ it 'limits the output to a fixed size' do
+ expect(responder)
+ .to receive(:send_response)
+ .with(
+ hash_including(
+ response_type: :in_channel,
+ attachments: array_including(
+ a_hash_including(
+ fields: array_including(
+ a_hash_including(value: /The output is too large/)
+ )
+ )
+ )
+ )
+ )
+
+ responder.success('a' * 4000)
+ end
+
+ it 'does not send a response if the output is empty' do
+ expect(responder).not_to receive(:send_response)
+
+ responder.success('')
+ end
+ end
+
+ describe '#failure' do
+ it 'returns the output for a failed build' do
+ expect(responder)
+ .to receive(:send_response)
+ .with(
+ hash_including(
+ response_type: :in_channel,
+ attachments: array_including(
+ a_hash_including(
+ text: /#{pipeline.chat_data.chat_name.user.name}.*failed/,
+ fields: array_including(
+ a_hash_including(value: /##{build.id}/),
+ a_hash_including(value: build.name)
+ )
+ )
+ )
+ )
+ )
+
+ responder.failure
+ end
+ end
+
+ describe '#scheduled_output' do
+ it 'returns the output for a scheduled build' do
+ output = responder.scheduled_output
+
+ expect(output).to match(
+ hash_including(
+ response_type: :ephemeral,
+ text: /##{build.id}/
+ )
+ )
+ end
+ end
+end