diff options
author | Kamil Trzciński <ayufan@ayufan.eu> | 2016-12-16 13:23:19 +0000 |
---|---|---|
committer | Kamil Trzciński <ayufan@ayufan.eu> | 2016-12-16 13:23:19 +0000 |
commit | bdb5e6771856c280fa1cf92b19a47fb83a4988ec (patch) | |
tree | e1d191d266b80b224673afe90431018e78443e79 /spec | |
parent | ea59a84f9cdb88fc829a71fbfb7bd7c8809ef6f9 (diff) | |
parent | 18b65cb8e07548c67056fe7994f1cee6da4de08e (diff) | |
download | gitlab-ce-bdb5e6771856c280fa1cf92b19a47fb83a4988ec.tar.gz |
Merge branch 'issue_22269' into 'master'
Mattermost Notifications Service
## What does this MR do?
closes #22269
## Screenshots
![mattermost](/uploads/de71c121f544a91305b6dfa6dc4c5738/mattermost.png)
![slack](/uploads/081d75d49239319d94332abda214fb98/slack.png)
## Does this MR meet the acceptance criteria?
- [x] [Changelog entry](https://docs.gitlab.com/ce/development/changelog.html) added
- [x] [Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md)
- [x] API support added
- Tests
- [x] Added for this feature/bug
- [x] All builds are passing
- [x] Conform by the [merge request performance guides](http://docs.gitlab.com/ce/development/merge_request_performance_guidelines.html)
- [x] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides)
- [x] Branch has no merge conflicts with `master` (if it does - rebase it please)
- [x] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)
See merge request !7764
Diffstat (limited to 'spec')
15 files changed, 87 insertions, 63 deletions
diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz Binary files differindex bfe59bdb90e..d3165d07d7b 100644 --- a/spec/features/projects/import_export/test_project_export.tar.gz +++ b/spec/features/projects/import_export/test_project_export.tar.gz diff --git a/spec/features/projects/services/slack_service_spec.rb b/spec/features/projects/services/slack_service_spec.rb index 16541f51d98..320ed13a01d 100644 --- a/spec/features/projects/services/slack_service_spec.rb +++ b/spec/features/projects/services/slack_service_spec.rb @@ -2,8 +2,8 @@ require 'spec_helper' feature 'Projects > Slack service > Setup events', feature: true do let(:user) { create(:user) } - let(:service) { SlackService.new } - let(:project) { create(:project, slack_service: service) } + let(:service) { SlackNotificationService.new } + let(:project) { create(:project, slack_notification_service: service) } background do service.fields diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index c4ee838b7c9..9b49d6837c3 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -136,7 +136,8 @@ project: - assembla_service - asana_service - gemnasium_service -- slack_service +- slack_notification_service +- mattermost_notification_service - buildkite_service - bamboo_service - teamcity_service diff --git a/spec/models/project_services/slack_service/build_message_spec.rb b/spec/models/project_services/chat_message/build_message_spec.rb index 452f4e2782c..b71d153f814 100644 --- a/spec/models/project_services/slack_service/build_message_spec.rb +++ b/spec/models/project_services/chat_message/build_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe SlackService::BuildMessage do - subject { SlackService::BuildMessage.new(args) } +describe ChatMessage::BuildMessage do + subject { described_class.new(args) } let(:args) do { diff --git a/spec/models/project_services/slack_service/issue_message_spec.rb b/spec/models/project_services/chat_message/issue_message_spec.rb index 98c36ec088d..ebe0ead4408 100644 --- a/spec/models/project_services/slack_service/issue_message_spec.rb +++ b/spec/models/project_services/chat_message/issue_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe SlackService::IssueMessage, models: true do - subject { SlackService::IssueMessage.new(args) } +describe ChatMessage::IssueMessage, models: true do + subject { described_class.new(args) } let(:args) do { diff --git a/spec/models/project_services/slack_service/merge_message_spec.rb b/spec/models/project_services/chat_message/merge_message_spec.rb index c5c052d9af1..07c414c6ca4 100644 --- a/spec/models/project_services/slack_service/merge_message_spec.rb +++ b/spec/models/project_services/chat_message/merge_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe SlackService::MergeMessage, models: true do - subject { SlackService::MergeMessage.new(args) } +describe ChatMessage::MergeMessage, models: true do + subject { described_class.new(args) } let(:args) do { diff --git a/spec/models/project_services/slack_service/note_message_spec.rb b/spec/models/project_services/chat_message/note_message_spec.rb index 97f818125d3..31936da40a2 100644 --- a/spec/models/project_services/slack_service/note_message_spec.rb +++ b/spec/models/project_services/chat_message/note_message_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe SlackService::NoteMessage, models: true do +describe ChatMessage::NoteMessage, models: true do let(:color) { '#345' } before do @@ -36,7 +36,7 @@ describe SlackService::NoteMessage, models: true do end it 'returns a message regarding notes on commits' do - message = SlackService::NoteMessage.new(@args) + message = described_class.new(@args) expect(message.pretext).to eq("test.user <url|commented on " \ "commit 5f163b2b> in <somewhere.com|project_name>: " \ "*Added a commit message*") @@ -62,7 +62,7 @@ describe SlackService::NoteMessage, models: true do end it 'returns a message regarding notes on a merge request' do - message = SlackService::NoteMessage.new(@args) + message = described_class.new(@args) expect(message.pretext).to eq("test.user <url|commented on " \ "merge request !30> in <somewhere.com|project_name>: " \ "*merge request title*") @@ -88,7 +88,7 @@ describe SlackService::NoteMessage, models: true do end it 'returns a message regarding notes on an issue' do - message = SlackService::NoteMessage.new(@args) + message = described_class.new(@args) expect(message.pretext).to eq( "test.user <url|commented on " \ "issue #20> in <somewhere.com|project_name>: " \ @@ -114,7 +114,7 @@ describe SlackService::NoteMessage, models: true do end it 'returns a message regarding notes on a project snippet' do - message = SlackService::NoteMessage.new(@args) + message = described_class.new(@args) expect(message.pretext).to eq("test.user <url|commented on " \ "snippet #5> in <somewhere.com|project_name>: " \ "*snippet title*") diff --git a/spec/models/project_services/slack_service/pipeline_message_spec.rb b/spec/models/project_services/chat_message/pipeline_message_spec.rb index 4098500122f..eca71db07b6 100644 --- a/spec/models/project_services/slack_service/pipeline_message_spec.rb +++ b/spec/models/project_services/chat_message/pipeline_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe SlackService::PipelineMessage do - subject { SlackService::PipelineMessage.new(args) } +describe ChatMessage::PipelineMessage do + subject { described_class.new(args) } let(:user) { { name: 'hacker' } } let(:args) do diff --git a/spec/models/project_services/slack_service/push_message_spec.rb b/spec/models/project_services/chat_message/push_message_spec.rb index 17cd05e24f1..b781c4505db 100644 --- a/spec/models/project_services/slack_service/push_message_spec.rb +++ b/spec/models/project_services/chat_message/push_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe SlackService::PushMessage, models: true do - subject { SlackService::PushMessage.new(args) } +describe ChatMessage::PushMessage, models: true do + subject { described_class.new(args) } let(:args) do { diff --git a/spec/models/project_services/slack_service/wiki_page_message_spec.rb b/spec/models/project_services/chat_message/wiki_page_message_spec.rb index 093911598b0..94c04dc0865 100644 --- a/spec/models/project_services/slack_service/wiki_page_message_spec.rb +++ b/spec/models/project_services/chat_message/wiki_page_message_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe SlackService::WikiPageMessage, models: true do +describe ChatMessage::WikiPageMessage, models: true do subject { described_class.new(args) } let(:args) do diff --git a/spec/models/project_services/chat_notification_service_spec.rb b/spec/models/project_services/chat_notification_service_spec.rb new file mode 100644 index 00000000000..c98e7ee14fd --- /dev/null +++ b/spec/models/project_services/chat_notification_service_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe ChatNotificationService, models: true do + describe "Associations" do + before do + allow(subject).to receive(:activated?).and_return(true) + end + + it { is_expected.to validate_presence_of :webhook } + end +end diff --git a/spec/models/project_services/mattermost_notification_service_spec.rb b/spec/models/project_services/mattermost_notification_service_spec.rb new file mode 100644 index 00000000000..c01e64b4c8e --- /dev/null +++ b/spec/models/project_services/mattermost_notification_service_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe MattermostNotificationService, models: true do + it_behaves_like "slack or mattermost" +end diff --git a/spec/models/project_services/slack_notification_service_spec.rb b/spec/models/project_services/slack_notification_service_spec.rb new file mode 100644 index 00000000000..59ddddf7454 --- /dev/null +++ b/spec/models/project_services/slack_notification_service_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe SlackNotificationService, models: true do + it_behaves_like "slack or mattermost" +end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 21ff238841e..bab3c3dbb02 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -22,7 +22,8 @@ describe Project, models: true do it { is_expected.to have_many(:protected_branches).dependent(:destroy) } it { is_expected.to have_many(:chat_services) } it { is_expected.to have_one(:forked_project_link).dependent(:destroy) } - it { is_expected.to have_one(:slack_service).dependent(:destroy) } + it { is_expected.to have_one(:slack_notification_service).dependent(:destroy) } + it { is_expected.to have_one(:mattermost_notification_service).dependent(:destroy) } it { is_expected.to have_one(:pushover_service).dependent(:destroy) } it { is_expected.to have_one(:asana_service).dependent(:destroy) } it { is_expected.to have_many(:boards).dependent(:destroy) } diff --git a/spec/models/project_services/slack_service_spec.rb b/spec/support/slack_mattermost_shared_examples.rb index c07a70a8069..56d4965f74d 100644 --- a/spec/models/project_services/slack_service_spec.rb +++ b/spec/support/slack_mattermost_shared_examples.rb @@ -1,7 +1,7 @@ -require 'spec_helper' +Dir[Rails.root.join("app/models/project_services/chat_message/*.rb")].each { |f| require f } -describe SlackService, models: true do - let(:slack) { SlackService.new } +RSpec.shared_examples 'slack or mattermost' do + let(:chat_service) { described_class.new } let(:webhook_url) { 'https://example.gitlab.com/' } describe "Associations" do @@ -24,7 +24,7 @@ describe SlackService, models: true do end end - describe "Execute" do + describe "#execute" do let(:user) { create(:user) } let(:project) { create(:project) } let(:username) { 'slack_username' } @@ -35,7 +35,7 @@ describe SlackService, models: true do end before do - allow(slack).to receive_messages( + allow(chat_service).to receive_messages( project: project, project_id: project.id, service_hook: true, @@ -77,54 +77,55 @@ describe SlackService, models: true do @wiki_page_sample_data = wiki_page_service.hook_data(@wiki_page, 'create') end - it "calls Slack API for push events" do - slack.execute(push_sample_data) + it "calls Slack/Mattermost API for push events" do + chat_service.execute(push_sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end - it "calls Slack API for issue events" do - slack.execute(@issues_sample_data) + it "calls Slack/Mattermost API for issue events" do + chat_service.execute(@issues_sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end - it "calls Slack API for merge requests events" do - slack.execute(@merge_sample_data) + it "calls Slack/Mattermost API for merge requests events" do + chat_service.execute(@merge_sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end - it "calls Slack API for wiki page events" do - slack.execute(@wiki_page_sample_data) + it "calls Slack/Mattermost API for wiki page events" do + chat_service.execute(@wiki_page_sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end it 'uses the username as an option for slack when configured' do - allow(slack).to receive(:username).and_return(username) + allow(chat_service).to receive(:username).and_return(username) + expect(Slack::Notifier).to receive(:new). - with(webhook_url, username: username). + with(webhook_url, username: username, channel: chat_service.default_channel). and_return( double(:slack_service).as_null_object ) - slack.execute(push_sample_data) + chat_service.execute(push_sample_data) end it 'uses the channel as an option when it is configured' do - allow(slack).to receive(:channel).and_return(channel) + allow(chat_service).to receive(:channel).and_return(channel) expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: channel). and_return( double(:slack_service).as_null_object ) - slack.execute(push_sample_data) + chat_service.execute(push_sample_data) end context "event channels" do it "uses the right channel for push event" do - slack.update_attributes(push_channel: "random") + chat_service.update_attributes(push_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -132,11 +133,11 @@ describe SlackService, models: true do double(:slack_service).as_null_object ) - slack.execute(push_sample_data) + chat_service.execute(push_sample_data) end it "uses the right channel for merge request event" do - slack.update_attributes(merge_request_channel: "random") + chat_service.update_attributes(merge_request_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -144,11 +145,11 @@ describe SlackService, models: true do double(:slack_service).as_null_object ) - slack.execute(@merge_sample_data) + chat_service.execute(@merge_sample_data) end it "uses the right channel for issue event" do - slack.update_attributes(issue_channel: "random") + chat_service.update_attributes(issue_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -156,11 +157,11 @@ describe SlackService, models: true do double(:slack_service).as_null_object ) - slack.execute(@issues_sample_data) + chat_service.execute(@issues_sample_data) end it "uses the right channel for wiki event" do - slack.update_attributes(wiki_page_channel: "random") + chat_service.update_attributes(wiki_page_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -168,7 +169,7 @@ describe SlackService, models: true do double(:slack_service).as_null_object ) - slack.execute(@wiki_page_sample_data) + chat_service.execute(@wiki_page_sample_data) end context "note event" do @@ -177,7 +178,7 @@ describe SlackService, models: true do end it "uses the right channel" do - slack.update_attributes(note_channel: "random") + chat_service.update_attributes(note_channel: "random") note_data = Gitlab::DataBuilder::Note.build(issue_note, user) @@ -187,7 +188,7 @@ describe SlackService, models: true do double(:slack_service).as_null_object ) - slack.execute(note_data) + chat_service.execute(note_data) end end end @@ -198,7 +199,7 @@ describe SlackService, models: true do let(:project) { create(:project, creator_id: user.id) } before do - allow(slack).to receive_messages( + allow(chat_service).to receive_messages( project: project, project_id: project.id, service_hook: true, @@ -216,9 +217,9 @@ describe SlackService, models: true do note: 'a comment on a commit') end - it "calls Slack API for commit comment events" do + it "calls Slack/Mattermost API for commit comment events" do data = Gitlab::DataBuilder::Note.build(commit_note, user) - slack.execute(data) + chat_service.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -232,7 +233,7 @@ describe SlackService, models: true do it "calls Slack API for merge request comment events" do data = Gitlab::DataBuilder::Note.build(merge_request_note, user) - slack.execute(data) + chat_service.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -245,7 +246,7 @@ describe SlackService, models: true do it "calls Slack API for issue comment events" do data = Gitlab::DataBuilder::Note.build(issue_note, user) - slack.execute(data) + chat_service.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -259,7 +260,7 @@ describe SlackService, models: true do it "calls Slack API for snippet comment events" do data = Gitlab::DataBuilder::Note.build(snippet_note, user) - slack.execute(data) + chat_service.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -277,21 +278,21 @@ describe SlackService, models: true do end before do - allow(slack).to receive_messages( + allow(chat_service).to receive_messages( project: project, service_hook: true, webhook: webhook_url ) end - shared_examples 'call Slack API' do + shared_examples 'call Slack/Mattermost API' do before do WebMock.stub_request(:post, webhook_url) end - it 'calls Slack API for pipeline events' do + it 'calls Slack/Mattermost API for pipeline events' do data = Gitlab::DataBuilder::Pipeline.build(pipeline) - slack.execute(data) + chat_service.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -300,16 +301,16 @@ describe SlackService, models: true do context 'with failed pipeline' do let(:status) { 'failed' } - it_behaves_like 'call Slack API' + it_behaves_like 'call Slack/Mattermost API' end context 'with succeeded pipeline' do let(:status) { 'success' } context 'with default to notify_only_broken_pipelines' do - it 'does not call Slack API for pipeline events' do + it 'does not call Slack/Mattermost API for pipeline events' do data = Gitlab::DataBuilder::Pipeline.build(pipeline) - result = slack.execute(data) + result = chat_service.execute(data) expect(result).to be_falsy end @@ -317,10 +318,10 @@ describe SlackService, models: true do context 'with setting notify_only_broken_pipelines to false' do before do - slack.notify_only_broken_pipelines = false + chat_service.notify_only_broken_pipelines = false end - it_behaves_like 'call Slack API' + it_behaves_like 'call Slack/Mattermost API' end end end |