From 07d9b036a9b7b3502238cac0fdb4980bfe02e128 Mon Sep 17 00:00:00 2001 From: Kukovskii Vladimir Date: Sun, 24 Jun 2018 19:12:07 +0900 Subject: [PATCH 1/8] Add dummy Google Hangouts Chat integration --- app/models/project.rb | 1 + .../project_services/hangouts_chat_service.rb | 41 +++++++++++++++++++ app/models/service.rb | 1 + lib/api/services.rb | 9 ++++ spec/lib/gitlab/import_export/all_models.yml | 1 + spec/models/project_spec.rb | 1 + 6 files changed, 54 insertions(+) create mode 100644 app/models/project_services/hangouts_chat_service.rb diff --git a/app/models/project.rb b/app/models/project.rb index e29bca365a4..a0744b0c58e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -154,6 +154,7 @@ class Project < ActiveRecord::Base has_one :mock_monitoring_service has_one :microsoft_teams_service has_one :packagist_service + has_one :hangouts_chat_service # TODO: replace these relations with the fork network versions has_one :forked_project_link, foreign_key: "forked_to_project_id" diff --git a/app/models/project_services/hangouts_chat_service.rb b/app/models/project_services/hangouts_chat_service.rb new file mode 100644 index 00000000000..99a6afcc11a --- /dev/null +++ b/app/models/project_services/hangouts_chat_service.rb @@ -0,0 +1,41 @@ +class HangoutsChatService < ChatNotificationService + def title + 'Hangouts Chat' + end + + def description + 'Receive event notifications in Google Hangouts Chat' + end + + def self.to_param + 'hangouts_chat' + end + + def help + 'This service sends notifications about projects events to Google Hangouts Chat room.
+ To set up this service: +
    +
  1. Set up an incoming webhook for your room. All notifications will come to this room.
  2. +
  3. Paste the Webhook URL into the field below.
  4. +
  5. Select events below to enable notifications.
  6. +
' + end + + def event_field(event) + end + + def default_channel_placeholder + end + + def webhook_placeholder + 'https://chat.googleapis.com/v1/spaces…' + end + + def default_fields + [ + { type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}" }, + { type: 'checkbox', name: 'notify_only_broken_pipelines' }, + { type: 'checkbox', name: 'notify_only_default_branch' } + ] + end +end diff --git a/app/models/service.rb b/app/models/service.rb index ad835293b46..cbfe0c6eedd 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -254,6 +254,7 @@ class Service < ActiveRecord::Base emails_on_push external_wiki flowdock + hangouts_chat hipchat irker jira diff --git a/lib/api/services.rb b/lib/api/services.rb index 553e8dff4b9..1f2bf546cd7 100644 --- a/lib/api/services.rb +++ b/lib/api/services.rb @@ -368,6 +368,14 @@ module API desc: "The project's slug on gemnasium.com" } ], + 'hangouts-chat' => [ + { + required: true, + name: :webhook, + type: String, + desc: 'The Hangouts Chat webhook. e.g. https://chat.googleapis.com/v1/spaces…' + } + ], 'hipchat' => [ { required: true, @@ -688,6 +696,7 @@ module API ExternalWikiService, FlowdockService, GemnasiumService, + HangoutsChatService, HipchatService, IrkerService, JiraService, diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index 084ce3066d6..db5aab0cd76 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -211,6 +211,7 @@ project: - slack_service - microsoft_teams_service - mattermost_service +- hangouts_chat_service - buildkite_service - bamboo_service - teamcity_service diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index d200e5f2e42..b0ec725bf70 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -26,6 +26,7 @@ describe Project do it { is_expected.to have_one(:slack_service) } it { is_expected.to have_one(:microsoft_teams_service) } it { is_expected.to have_one(:mattermost_service) } + it { is_expected.to have_one(:hangouts_chat_service) } it { is_expected.to have_one(:packagist_service) } it { is_expected.to have_one(:pushover_service) } it { is_expected.to have_one(:asana_service) } From cb77d939c919ac8ebf4288724febdf7bb8238399 Mon Sep 17 00:00:00 2001 From: Kukovskii Vladimir Date: Sun, 24 Jun 2018 19:35:35 +0900 Subject: [PATCH 2/8] Add Hangouts Chat service implementation --- Gemfile | 3 + Gemfile.lock | 2 + Gemfile.rails5.lock | 2 + .../project_services/hangouts_chat_service.rb | 25 ++ .../hangouts_chat_service_spec.rb | 311 ++++++++++++++++++ 5 files changed, 343 insertions(+) create mode 100644 spec/models/project_services/hangouts_chat_service_spec.rb diff --git a/Gemfile b/Gemfile index d575568adaa..5aa05bf53f9 100644 --- a/Gemfile +++ b/Gemfile @@ -220,6 +220,9 @@ gem 'gemnasium-gitlab-service', '~> 0.2' # Slack integration gem 'slack-notifier', '~> 1.5.1' +# Hangouts Chat integration +gem 'hangouts-chat', '~> 0.0.5' + # Asana integration gem 'asana', '~> 0.6.0' diff --git a/Gemfile.lock b/Gemfile.lock index 7f9207d9dfe..2e711e50dfc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -385,6 +385,7 @@ GEM temple (>= 0.8.0) thor tilt + hangouts-chat (0.0.5) hashdiff (0.3.4) hashie (3.5.7) hashie-forbidden_attributes (0.1.1) @@ -1058,6 +1059,7 @@ DEPENDENCIES grpc (~> 1.11.0) haml_lint (~> 0.26.0) hamlit (~> 2.8.8) + hangouts-chat (~> 0.0.5) hashie-forbidden_attributes health_check (~> 2.6.0) hipchat (~> 1.5.0) diff --git a/Gemfile.rails5.lock b/Gemfile.rails5.lock index 766f2479ea5..9bb25e53fe1 100644 --- a/Gemfile.rails5.lock +++ b/Gemfile.rails5.lock @@ -388,6 +388,7 @@ GEM temple (>= 0.8.0) thor tilt + hangouts-chat (0.0.5) hashdiff (0.3.4) hashie (3.5.7) hashie-forbidden_attributes (0.1.1) @@ -1068,6 +1069,7 @@ DEPENDENCIES grpc (~> 1.11.0) haml_lint (~> 0.26.0) hamlit (~> 2.8.8) + hangouts-chat (~> 0.0.5) hashie-forbidden_attributes health_check (~> 2.6.0) hipchat (~> 1.5.0) diff --git a/app/models/project_services/hangouts_chat_service.rb b/app/models/project_services/hangouts_chat_service.rb index 99a6afcc11a..00e9b634dd1 100644 --- a/app/models/project_services/hangouts_chat_service.rb +++ b/app/models/project_services/hangouts_chat_service.rb @@ -1,3 +1,5 @@ +require 'hangouts_chat' + class HangoutsChatService < ChatNotificationService def title 'Hangouts Chat' @@ -38,4 +40,27 @@ class HangoutsChatService < ChatNotificationService { type: 'checkbox', name: 'notify_only_default_branch' } ] end + + private + + def notify(message, opts) + simple_text = compose_simple_message(message) + HangoutsChat::Sender.new(webhook).simple(simple_text) + end + + def compose_simple_message(message) + header = message.pretext + return header if message.attachments.empty? + + title = fetch_attachment_title(message.attachments.first) + body = message.attachments.first[:text] + [header, title, body].compact.join("\n") + end + + def fetch_attachment_title(attachment) + return nil if attachment[:title].nil? + return attachment[:title] if attachment[:title_link].nil? + + "<#{attachment[:title_link]}|#{attachment[:title]}>" + end end diff --git a/spec/models/project_services/hangouts_chat_service_spec.rb b/spec/models/project_services/hangouts_chat_service_spec.rb new file mode 100644 index 00000000000..73472700548 --- /dev/null +++ b/spec/models/project_services/hangouts_chat_service_spec.rb @@ -0,0 +1,311 @@ +require 'spec_helper' + +describe HangoutsChatService do + let(:chat_service) { described_class.new } + let(:webhook_url) { 'https://example.gitlab.com/' } + + describe 'Associations' do + it { is_expected.to belong_to :project } + it { is_expected.to have_one :service_hook } + end + + describe 'Validations' do + context 'when service is active' do + before do + subject.active = true + end + + it { is_expected.to validate_presence_of(:webhook) } + it_behaves_like 'issue tracker service URL attribute', :webhook + end + + context 'when service is inactive' do + before do + subject.active = false + end + + it { is_expected.not_to validate_presence_of(:webhook) } + end + end + + describe '#execute' do + let(:user) { create(:user) } + let(:project) { create(:project, :repository) } + + before do + allow(chat_service).to receive_messages( + project: project, + project_id: project.id, + service_hook: true, + webhook: webhook_url + ) + + WebMock.stub_request(:post, webhook_url) + end + + context 'with push events' do + let(:push_sample_data) do + Gitlab::DataBuilder::Push.build_sample(project, user) + end + + it 'calls Hangouts Chat API for push events' do + chat_service.execute(push_sample_data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + + it 'specifies the webhook when it is configured' do + expect(HangoutsChat::Sender).to receive(:new).with(webhook_url).and_return(double(:hangouts_chat_service).as_null_object) + + chat_service.execute(push_sample_data) + end + end + + context 'with issue events' do + let(:opts) { { title: 'Awesome issue', description: 'please fix' } } + let(:issues_sample_data) do + service = Issues::CreateService.new(project, user, opts) + issue = service.execute + service.hook_data(issue, 'open') + end + + it 'calls Hangouts Chat API' do + chat_service.execute(issues_sample_data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + + context 'with merge events' do + let(:opts) do + { + title: 'Awesome merge_request', + description: 'please fix', + source_branch: 'feature', + target_branch: 'master' + } + end + + let(:merge_sample_data) do + service = MergeRequests::CreateService.new(project, user, opts) + merge_request = service.execute + service.hook_data(merge_request, 'open') + end + + before do + project.add_developer(user) + end + + it 'calls Hangouts Chat API' do + chat_service.execute(merge_sample_data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + + context 'with wiki page events' do + let(:opts) do + { + title: 'Awesome wiki_page', + content: 'Some text describing some thing or another', + format: 'md', + message: 'user created page: Awesome wiki_page' + } + end + let(:wiki_page) { create(:wiki_page, wiki: project.wiki, attrs: opts) } + let(:wiki_page_sample_data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, 'create') } + + it 'calls Hangouts Chat API' do + chat_service.execute(wiki_page_sample_data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + end + + describe 'Note events' do + let(:user) { create(:user) } + let(:project) { create(:project, :repository, creator: user) } + + before do + allow(chat_service).to receive_messages( + project: project, + project_id: project.id, + service_hook: true, + webhook: webhook_url + ) + + WebMock.stub_request(:post, webhook_url) + end + + context 'when commit comment event executed' do + let(:commit_note) do + create(:note_on_commit, author: user, + project: project, + commit_id: project.repository.commit.id, + note: 'a comment on a commit') + end + + it 'calls Hangouts Chat API for commit comment events' do + data = Gitlab::DataBuilder::Note.build(commit_note, user) + + chat_service.execute(data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + + context 'when merge request comment event executed' do + let(:merge_request_note) do + create(:note_on_merge_request, project: project, + note: 'merge request note') + end + + it 'calls Hangouts Chat API for merge request comment events' do + data = Gitlab::DataBuilder::Note.build(merge_request_note, user) + + chat_service.execute(data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + + context 'when issue comment event executed' do + let(:issue_note) do + create(:note_on_issue, project: project, note: 'issue note') + end + + it 'calls Hangouts Chat API for issue comment events' do + data = Gitlab::DataBuilder::Note.build(issue_note, user) + + chat_service.execute(data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + + context 'when snippet comment event executed' do + let(:snippet_note) do + create(:note_on_project_snippet, project: project, + note: 'snippet note') + end + + it 'calls Hangouts Chat API for snippet comment events' do + data = Gitlab::DataBuilder::Note.build(snippet_note, user) + + chat_service.execute(data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + end + + describe 'Pipeline events' do + let(:user) { create(:user) } + let(:project) { create(:project, :repository) } + + let(:pipeline) do + create(:ci_pipeline, + project: project, status: status, + sha: project.commit.sha, ref: project.default_branch) + end + + before do + allow(chat_service).to receive_messages( + project: project, + service_hook: true, + webhook: webhook_url + ) + end + + shared_examples 'call Hangouts Chat API' do + before do + WebMock.stub_request(:post, webhook_url) + end + + it 'calls Hangouts Chat API for pipeline events' do + data = Gitlab::DataBuilder::Pipeline.build(pipeline) + + chat_service.execute(data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + + context 'with failed pipeline' do + let(:status) { 'failed' } + + it_behaves_like 'call Hangouts Chat API' + end + + context 'with succeeded pipeline' do + let(:status) { 'success' } + + context 'with default to notify_only_broken_pipelines' do + it 'does not call Hangouts Chat API for pipeline events' do + data = Gitlab::DataBuilder::Pipeline.build(pipeline) + result = chat_service.execute(data) + + expect(result).to be_falsy + end + end + + context 'with setting notify_only_broken_pipelines to false' do + before do + chat_service.notify_only_broken_pipelines = false + end + + it_behaves_like 'call Hangouts Chat API' + end + end + + context 'only notify for the default branch' do + context 'when enabled' do + let(:pipeline) do + create(:ci_pipeline, project: project, status: 'failed', ref: 'not-the-default-branch') + end + + before do + chat_service.notify_only_default_branch = true + WebMock.stub_request(:post, webhook_url) + end + + it 'does not call the Hangouts Chat API for pipeline events' do + data = Gitlab::DataBuilder::Pipeline.build(pipeline) + result = chat_service.execute(data) + + expect(result).to be_falsy + end + + it 'does not notify push events if they are not for the default branch' do + ref = "#{Gitlab::Git::BRANCH_REF_PREFIX}test" + push_sample_data = Gitlab::DataBuilder::Push.build(project, user, nil, nil, ref, []) + + chat_service.execute(push_sample_data) + + expect(WebMock).not_to have_requested(:post, webhook_url) + end + + it 'notifies about push events for the default branch' do + push_sample_data = Gitlab::DataBuilder::Push.build_sample(project, user) + + chat_service.execute(push_sample_data) + + expect(WebMock).to have_requested(:post, webhook_url).once + end + end + + context 'when disabled' do + let(:pipeline) do + create(:ci_pipeline, :failed, project: project, ref: 'not-the-default-branch') + end + + before do + chat_service.notify_only_default_branch = false + end + + it_behaves_like 'call Hangouts Chat API' + end + end + end +end From d63a0a07f4ac80c1a3f801fd8087762847b4a018 Mon Sep 17 00:00:00 2001 From: Kukovskii Vladimir Date: Thu, 28 Jun 2018 22:53:37 +0900 Subject: [PATCH 3/8] Add documentation for Hangouts Chat integration --- .../unreleased/hangouts_chat_integration.yml | 5 ++ doc/api/services.md | 46 ++++++++++++++++++ .../project/integrations/hangouts_chat.md | 27 ++++++++++ .../img/hangouts_chat_configuration.png | Bin 0 -> 101788 bytes .../project/integrations/project_services.md | 1 + 5 files changed, 79 insertions(+) create mode 100644 changelogs/unreleased/hangouts_chat_integration.yml create mode 100644 doc/user/project/integrations/hangouts_chat.md create mode 100644 doc/user/project/integrations/img/hangouts_chat_configuration.png diff --git a/changelogs/unreleased/hangouts_chat_integration.yml b/changelogs/unreleased/hangouts_chat_integration.yml new file mode 100644 index 00000000000..f19d64e8ef9 --- /dev/null +++ b/changelogs/unreleased/hangouts_chat_integration.yml @@ -0,0 +1,5 @@ +--- +title: Add Hangouts Chat integration +merge_request: +author: Kukovskii Vladimir +type: added diff --git a/doc/api/services.md b/doc/api/services.md index aeb48ccc36c..29da1139fcc 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -443,6 +443,52 @@ Get Gemnasium service settings for a project. GET /projects/:id/services/gemnasium ``` +## Hangouts Chat + +Google GSuite team collaboration tool. + +### Create/Edit Hangouts Chat service + +Set Hangouts Chat service for a project. + +``` +PUT /projects/:id/services/hangouts_chat +``` + +>**Note:** Specific event parameters (e.g. `push_events` flag) were [introduced in v10.4][11435] + +Parameters: + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `webhook` | string | true | The Hangouts Chat webhook. e.g. https://chat.googleapis.com/v1/spaces... | +| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines | +| `notify_only_default_branch` | boolean | false | Send notifications only for the default branch | +| `push_events` | boolean | false | Enable notifications for push events | +| `issues_events` | boolean | false | Enable notifications for issue events | +| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events | +| `merge_requests_events` | boolean | false | Enable notifications for merge request events | +| `tag_push_events` | boolean | false | Enable notifications for tag push events | +| `note_events` | boolean | false | Enable notifications for note events | +| `pipeline_events` | boolean | false | Enable notifications for pipeline events | +| `wiki_page_events` | boolean | false | Enable notifications for wiki page events | + +### Delete Hangouts Chat service + +Delete Hangouts Chat service for a project. + +``` +DELETE /projects/:id/services/hangouts_chat +``` + +### Get Hangouts Chat service settings + +Get Hangouts Chat service settings for a project. + +``` +GET /projects/:id/services/hangouts_chat +``` + ## HipChat Private group chat and IM diff --git a/doc/user/project/integrations/hangouts_chat.md b/doc/user/project/integrations/hangouts_chat.md new file mode 100644 index 00000000000..5d8869637c9 --- /dev/null +++ b/doc/user/project/integrations/hangouts_chat.md @@ -0,0 +1,27 @@ +# Hangouts Chat service + +The Hangouts Chat service sends notifications from GitLab to the room for which the webhook was created. + +## On Hangouts Chat + +1. Open the chat room in which you want to see the notifications. +1. From the chat room menu, select **Configure Webhooks**. +1. Click on **ADD WEBHOOK** and fill in the name of the bot that will post the messages. Optionally define avatar. +1. Click **SAVE** and copy the **Webhook URL** of your webhook. + +Details: https://developers.google.com/hangouts/chat/how-tos/webhooks + +## On GitLab + +When you have **Webhook URL** for your Hangouts Chat room webhook, you can setup the GitLab service. + +1. Navigate to the [Integrations page](project_services.md#accessing-the-project-services) in your project's settings, i.e. **Project > Settings > Integrations**. +1. Select the **Hangouts Chat** project service to configure it. +1. Check the **Active** checkbox to turn on the service. +1. Check the checkboxes corresponding to the GitLab events you want to receive. +1. Paste the **Webhook URL** that you copied from the Hangouts Chat configuration step. +1. Configure the remaining options and click `Save changes`. + +Your Hangouts Chat room will now start receiving GitLab event notifications as configured. + +![Hangouts Chat configuration](img/hangouts_chat_configuration.png) diff --git a/doc/user/project/integrations/img/hangouts_chat_configuration.png b/doc/user/project/integrations/img/hangouts_chat_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..33fadbe6547e314d021aa83ba797a55474c96067 GIT binary patch literal 101788 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 Date: Tue, 3 Jul 2018 21:01:56 +0900 Subject: [PATCH 4/8] Fix fetch_attachment_title method of Hangouts Chat service --- app/models/project_services/hangouts_chat_service.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/models/project_services/hangouts_chat_service.rb b/app/models/project_services/hangouts_chat_service.rb index 00e9b634dd1..53f11c424e3 100644 --- a/app/models/project_services/hangouts_chat_service.rb +++ b/app/models/project_services/hangouts_chat_service.rb @@ -58,8 +58,7 @@ class HangoutsChatService < ChatNotificationService end def fetch_attachment_title(attachment) - return nil if attachment[:title].nil? - return attachment[:title] if attachment[:title_link].nil? + return attachment[:title] unless attachment[:title_link] "<#{attachment[:title_link]}|#{attachment[:title]}>" end From 6cfb0a9e9463d54f7ad74d5ee79af36ba08be186 Mon Sep 17 00:00:00 2001 From: Kukovskii Vladimir Date: Tue, 3 Jul 2018 22:26:50 +0900 Subject: [PATCH 5/8] Rework spec for Hangouts Chat service --- .../hangouts_chat_service_spec.rb | 305 +++++++----------- 1 file changed, 120 insertions(+), 185 deletions(-) diff --git a/spec/models/project_services/hangouts_chat_service_spec.rb b/spec/models/project_services/hangouts_chat_service_spec.rb index 73472700548..7b19edb1e51 100644 --- a/spec/models/project_services/hangouts_chat_service_spec.rb +++ b/spec/models/project_services/hangouts_chat_service_spec.rb @@ -43,37 +43,64 @@ describe HangoutsChatService do WebMock.stub_request(:post, webhook_url) end - context 'with push events' do - let(:push_sample_data) do - Gitlab::DataBuilder::Push.build_sample(project, user) - end - - it 'calls Hangouts Chat API for push events' do - chat_service.execute(push_sample_data) + shared_examples 'Hangouts Chat service' do + it 'calls Hangouts Chat API' do + chat_service.execute(sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end + end + + context 'with push events' do + let(:sample_data) do + Gitlab::DataBuilder::Push.build_sample(project, user) + end + + it_behaves_like 'Hangouts Chat service' it 'specifies the webhook when it is configured' do expect(HangoutsChat::Sender).to receive(:new).with(webhook_url).and_return(double(:hangouts_chat_service).as_null_object) - chat_service.execute(push_sample_data) + chat_service.execute(sample_data) + end + + context 'with not default branch' do + let(:sample_data) do + ref = "#{Gitlab::Git::BRANCH_REF_PREFIX}test" + Gitlab::DataBuilder::Push.build(project, user, nil, nil, ref, []) + end + + context 'when notify_only_default_branch enabled' do + before do + chat_service.notify_only_default_branch = true + end + + it 'does not call the Hangouts Chat API' do + result = chat_service.execute(sample_data) + + expect(result).to be_falsy + end + end + + context 'when notify_only_default_branch disabled' do + before do + chat_service.notify_only_default_branch = false + end + + it_behaves_like 'Hangouts Chat service' + end end end context 'with issue events' do let(:opts) { { title: 'Awesome issue', description: 'please fix' } } - let(:issues_sample_data) do + let(:sample_data) do service = Issues::CreateService.new(project, user, opts) issue = service.execute service.hook_data(issue, 'open') end - it 'calls Hangouts Chat API' do - chat_service.execute(issues_sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end + it_behaves_like 'Hangouts Chat service' end context 'with merge events' do @@ -86,7 +113,7 @@ describe HangoutsChatService do } end - let(:merge_sample_data) do + let(:sample_data) do service = MergeRequests::CreateService.new(project, user, opts) merge_request = service.execute service.hook_data(merge_request, 'open') @@ -96,11 +123,7 @@ describe HangoutsChatService do project.add_developer(user) end - it 'calls Hangouts Chat API' do - chat_service.execute(merge_sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end + it_behaves_like 'Hangouts Chat service' end context 'with wiki page events' do @@ -113,198 +136,110 @@ describe HangoutsChatService do } end let(:wiki_page) { create(:wiki_page, wiki: project.wiki, attrs: opts) } - let(:wiki_page_sample_data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, 'create') } + let(:sample_data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, 'create') } - it 'calls Hangouts Chat API' do - chat_service.execute(wiki_page_sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - end - end - - describe 'Note events' do - let(:user) { create(:user) } - let(:project) { create(:project, :repository, creator: user) } - - before do - allow(chat_service).to receive_messages( - project: project, - project_id: project.id, - service_hook: true, - webhook: webhook_url - ) - - WebMock.stub_request(:post, webhook_url) + it_behaves_like 'Hangouts Chat service' end - context 'when commit comment event executed' do - let(:commit_note) do - create(:note_on_commit, author: user, - project: project, - commit_id: project.repository.commit.id, - note: 'a comment on a commit') + context 'with note events' do + let(:sample_data) { Gitlab::DataBuilder::Note.build(note, user) } + + context 'with commit comment' do + let(:note) do + create(:note_on_commit, author: user, + project: project, + commit_id: project.repository.commit.id, + note: 'a comment on a commit') + end + + it_behaves_like 'Hangouts Chat service' end - it 'calls Hangouts Chat API for commit comment events' do - data = Gitlab::DataBuilder::Note.build(commit_note, user) + context 'with merge request comment' do + let(:note) do + create(:note_on_merge_request, project: project, + note: 'merge request note') + end - chat_service.execute(data) + it_behaves_like 'Hangouts Chat service' + end - expect(WebMock).to have_requested(:post, webhook_url).once + context 'with issue comment' do + let(:note) do + create(:note_on_issue, project: project, note: 'issue note') + end + + it_behaves_like 'Hangouts Chat service' + end + + context 'wiht snippet comment' do + let(:note) do + create(:note_on_project_snippet, project: project, + note: 'snippet note') + end + + it_behaves_like 'Hangouts Chat service' end end - context 'when merge request comment event executed' do - let(:merge_request_note) do - create(:note_on_merge_request, project: project, - note: 'merge request note') + context 'with pipeline events' do + let(:pipeline) do + create(:ci_pipeline, + project: project, status: status, + sha: project.commit.sha, ref: project.default_branch) + end + let(:sample_data) { Gitlab::DataBuilder::Pipeline.build(pipeline) } + + context 'with failed pipeline' do + let(:status) { 'failed' } + + it_behaves_like 'Hangouts Chat service' end - it 'calls Hangouts Chat API for merge request comment events' do - data = Gitlab::DataBuilder::Note.build(merge_request_note, user) + context 'with succeeded pipeline' do + let(:status) { 'success' } - chat_service.execute(data) + context 'with default notify_only_broken_pipelines' do + it 'does not call Hangouts Chat API' do + result = chat_service.execute(sample_data) - expect(WebMock).to have_requested(:post, webhook_url).once - end - end + expect(result).to be_falsy + end + end - context 'when issue comment event executed' do - let(:issue_note) do - create(:note_on_issue, project: project, note: 'issue note') - end + context 'when notify_only_broken_pipelines is false' do + before do + chat_service.notify_only_broken_pipelines = false + end - it 'calls Hangouts Chat API for issue comment events' do - data = Gitlab::DataBuilder::Note.build(issue_note, user) - - chat_service.execute(data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - end - - context 'when snippet comment event executed' do - let(:snippet_note) do - create(:note_on_project_snippet, project: project, - note: 'snippet note') - end - - it 'calls Hangouts Chat API for snippet comment events' do - data = Gitlab::DataBuilder::Note.build(snippet_note, user) - - chat_service.execute(data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - end - end - - describe 'Pipeline events' do - let(:user) { create(:user) } - let(:project) { create(:project, :repository) } - - let(:pipeline) do - create(:ci_pipeline, - project: project, status: status, - sha: project.commit.sha, ref: project.default_branch) - end - - before do - allow(chat_service).to receive_messages( - project: project, - service_hook: true, - webhook: webhook_url - ) - end - - shared_examples 'call Hangouts Chat API' do - before do - WebMock.stub_request(:post, webhook_url) - end - - it 'calls Hangouts Chat API for pipeline events' do - data = Gitlab::DataBuilder::Pipeline.build(pipeline) - - chat_service.execute(data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - end - - context 'with failed pipeline' do - let(:status) { 'failed' } - - it_behaves_like 'call Hangouts Chat API' - end - - context 'with succeeded pipeline' do - let(:status) { 'success' } - - context 'with default to notify_only_broken_pipelines' do - it 'does not call Hangouts Chat API for pipeline events' do - data = Gitlab::DataBuilder::Pipeline.build(pipeline) - result = chat_service.execute(data) - - expect(result).to be_falsy + it_behaves_like 'Hangouts Chat service' end end - context 'with setting notify_only_broken_pipelines to false' do - before do - chat_service.notify_only_broken_pipelines = false - end - - it_behaves_like 'call Hangouts Chat API' - end - end - - context 'only notify for the default branch' do - context 'when enabled' do + context 'with not default branch' do let(:pipeline) do create(:ci_pipeline, project: project, status: 'failed', ref: 'not-the-default-branch') end - before do - chat_service.notify_only_default_branch = true - WebMock.stub_request(:post, webhook_url) + context 'when notify_only_default_branch enabled' do + before do + chat_service.notify_only_default_branch = true + end + + it 'does not call the Hangouts Chat API' do + result = chat_service.execute(sample_data) + + expect(result).to be_falsy + end end - it 'does not call the Hangouts Chat API for pipeline events' do - data = Gitlab::DataBuilder::Pipeline.build(pipeline) - result = chat_service.execute(data) + context 'when notify_only_default_branch disabled' do + before do + chat_service.notify_only_default_branch = false + end - expect(result).to be_falsy + it_behaves_like 'Hangouts Chat service' end - - it 'does not notify push events if they are not for the default branch' do - ref = "#{Gitlab::Git::BRANCH_REF_PREFIX}test" - push_sample_data = Gitlab::DataBuilder::Push.build(project, user, nil, nil, ref, []) - - chat_service.execute(push_sample_data) - - expect(WebMock).not_to have_requested(:post, webhook_url) - end - - it 'notifies about push events for the default branch' do - push_sample_data = Gitlab::DataBuilder::Push.build_sample(project, user) - - chat_service.execute(push_sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - end - - context 'when disabled' do - let(:pipeline) do - create(:ci_pipeline, :failed, project: project, ref: 'not-the-default-branch') - end - - before do - chat_service.notify_only_default_branch = false - end - - it_behaves_like 'call Hangouts Chat API' end end end From d64196ddb3336bd435c5756407cabc162f9acc6c Mon Sep 17 00:00:00 2001 From: Kukovskii Vladimir Date: Sat, 14 Jul 2018 19:19:04 +0900 Subject: [PATCH 6/8] Fix couple of moments in HangoutsChatService and its spec --- .../project_services/hangouts_chat_service.rb | 12 +++--- .../unreleased/hangouts_chat_integration.yml | 2 +- .../hangouts_chat_service_spec.rb | 38 ++++++++++--------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/app/models/project_services/hangouts_chat_service.rb b/app/models/project_services/hangouts_chat_service.rb index 53f11c424e3..a8512c5f57c 100644 --- a/app/models/project_services/hangouts_chat_service.rb +++ b/app/models/project_services/hangouts_chat_service.rb @@ -44,20 +44,22 @@ class HangoutsChatService < ChatNotificationService private def notify(message, opts) - simple_text = compose_simple_message(message) + simple_text = parse_simple_text_message(message) HangoutsChat::Sender.new(webhook).simple(simple_text) end - def compose_simple_message(message) + def parse_simple_text_message(message) header = message.pretext return header if message.attachments.empty? - title = fetch_attachment_title(message.attachments.first) - body = message.attachments.first[:text] + attachment = message.attachments.first + title = format_attachment_title(attachment) + body = attachment[:text] + [header, title, body].compact.join("\n") end - def fetch_attachment_title(attachment) + def format_attachment_title(attachment) return attachment[:title] unless attachment[:title_link] "<#{attachment[:title_link]}|#{attachment[:title]}>" diff --git a/changelogs/unreleased/hangouts_chat_integration.yml b/changelogs/unreleased/hangouts_chat_integration.yml index f19d64e8ef9..bf3484a6d02 100644 --- a/changelogs/unreleased/hangouts_chat_integration.yml +++ b/changelogs/unreleased/hangouts_chat_integration.yml @@ -1,5 +1,5 @@ --- title: Add Hangouts Chat integration -merge_request: +merge_request: 20290 author: Kukovskii Vladimir type: added diff --git a/spec/models/project_services/hangouts_chat_service_spec.rb b/spec/models/project_services/hangouts_chat_service_spec.rb index 7b19edb1e51..8a1c4e33204 100644 --- a/spec/models/project_services/hangouts_chat_service_spec.rb +++ b/spec/models/project_services/hangouts_chat_service_spec.rb @@ -1,9 +1,6 @@ require 'spec_helper' describe HangoutsChatService do - let(:chat_service) { described_class.new } - let(:webhook_url) { 'https://example.gitlab.com/' } - describe 'Associations' do it { is_expected.to belong_to :project } it { is_expected.to have_one :service_hook } @@ -31,9 +28,10 @@ describe HangoutsChatService do describe '#execute' do let(:user) { create(:user) } let(:project) { create(:project, :repository) } + let(:webhook_url) { 'https://example.gitlab.com/' } before do - allow(chat_service).to receive_messages( + allow(subject).to receive_messages( project: project, project_id: project.id, service_hook: true, @@ -45,7 +43,7 @@ describe HangoutsChatService do shared_examples 'Hangouts Chat service' do it 'calls Hangouts Chat API' do - chat_service.execute(sample_data) + subject.execute(sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -61,22 +59,28 @@ describe HangoutsChatService do it 'specifies the webhook when it is configured' do expect(HangoutsChat::Sender).to receive(:new).with(webhook_url).and_return(double(:hangouts_chat_service).as_null_object) - chat_service.execute(sample_data) + subject.execute(sample_data) + end + + it 'sends the simple text message to the Hangouts Chat API' do + subject.execute(sample_data) + + expect(WebMock).to have_requested(:post, webhook_url).once + .with { |req| req.body =~ /\A{"text":.+}\Z/ } end context 'with not default branch' do let(:sample_data) do - ref = "#{Gitlab::Git::BRANCH_REF_PREFIX}test" - Gitlab::DataBuilder::Push.build(project, user, nil, nil, ref, []) + Gitlab::DataBuilder::Push.build(project, user, nil, nil, 'not-the-default-branch') end context 'when notify_only_default_branch enabled' do before do - chat_service.notify_only_default_branch = true + subject.notify_only_default_branch = true end it 'does not call the Hangouts Chat API' do - result = chat_service.execute(sample_data) + result = subject.execute(sample_data) expect(result).to be_falsy end @@ -84,7 +88,7 @@ describe HangoutsChatService do context 'when notify_only_default_branch disabled' do before do - chat_service.notify_only_default_branch = false + subject.notify_only_default_branch = false end it_behaves_like 'Hangouts Chat service' @@ -172,7 +176,7 @@ describe HangoutsChatService do it_behaves_like 'Hangouts Chat service' end - context 'wiht snippet comment' do + context 'with snippet comment' do let(:note) do create(:note_on_project_snippet, project: project, note: 'snippet note') @@ -201,7 +205,7 @@ describe HangoutsChatService do context 'with default notify_only_broken_pipelines' do it 'does not call Hangouts Chat API' do - result = chat_service.execute(sample_data) + result = subject.execute(sample_data) expect(result).to be_falsy end @@ -209,7 +213,7 @@ describe HangoutsChatService do context 'when notify_only_broken_pipelines is false' do before do - chat_service.notify_only_broken_pipelines = false + subject.notify_only_broken_pipelines = false end it_behaves_like 'Hangouts Chat service' @@ -223,11 +227,11 @@ describe HangoutsChatService do context 'when notify_only_default_branch enabled' do before do - chat_service.notify_only_default_branch = true + subject.notify_only_default_branch = true end it 'does not call the Hangouts Chat API' do - result = chat_service.execute(sample_data) + result = subject.execute(sample_data) expect(result).to be_falsy end @@ -235,7 +239,7 @@ describe HangoutsChatService do context 'when notify_only_default_branch disabled' do before do - chat_service.notify_only_default_branch = false + subject.notify_only_default_branch = false end it_behaves_like 'Hangouts Chat service' From b38a3485f0f6f08ce43bdf372a436ae5d73c329c Mon Sep 17 00:00:00 2001 From: Kukovskii Vladimir Date: Wed, 18 Jul 2018 20:14:55 +0900 Subject: [PATCH 7/8] Fix Hangouts Chat service spec shared example --- .../project_services/hangouts_chat_service_spec.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/spec/models/project_services/hangouts_chat_service_spec.rb b/spec/models/project_services/hangouts_chat_service_spec.rb index 8a1c4e33204..cfa55188a64 100644 --- a/spec/models/project_services/hangouts_chat_service_spec.rb +++ b/spec/models/project_services/hangouts_chat_service_spec.rb @@ -45,7 +45,10 @@ describe HangoutsChatService do it 'calls Hangouts Chat API' do subject.execute(sample_data) - expect(WebMock).to have_requested(:post, webhook_url).once + expect(WebMock) + .to have_requested(:post, webhook_url) + .with { |req| req.body =~ /\A{"text":.+}\Z/ } + .once end end @@ -62,13 +65,6 @@ describe HangoutsChatService do subject.execute(sample_data) end - it 'sends the simple text message to the Hangouts Chat API' do - subject.execute(sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - .with { |req| req.body =~ /\A{"text":.+}\Z/ } - end - context 'with not default branch' do let(:sample_data) do Gitlab::DataBuilder::Push.build(project, user, nil, nil, 'not-the-default-branch') From 1ce57a7fba560daa66eee006b64bb9e77f7c51ac Mon Sep 17 00:00:00 2001 From: Kukovskii Vladimir Date: Sun, 22 Jul 2018 20:17:35 +0900 Subject: [PATCH 8/8] Fix some moments in documentation --- doc/api/services.md | 2 ++ doc/user/project/integrations/hangouts_chat.md | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/api/services.md b/doc/api/services.md index 29da1139fcc..efa173180bb 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -447,6 +447,8 @@ GET /projects/:id/services/gemnasium Google GSuite team collaboration tool. +>**Note:** This service was [introduced in v11.2](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20290) + ### Create/Edit Hangouts Chat service Set Hangouts Chat service for a project. diff --git a/doc/user/project/integrations/hangouts_chat.md b/doc/user/project/integrations/hangouts_chat.md index 5d8869637c9..6ab44420a10 100644 --- a/doc/user/project/integrations/hangouts_chat.md +++ b/doc/user/project/integrations/hangouts_chat.md @@ -9,11 +9,11 @@ The Hangouts Chat service sends notifications from GitLab to the room for which 1. Click on **ADD WEBHOOK** and fill in the name of the bot that will post the messages. Optionally define avatar. 1. Click **SAVE** and copy the **Webhook URL** of your webhook. -Details: https://developers.google.com/hangouts/chat/how-tos/webhooks +See also [the Hangouts Chat documentation for configuring incoming webhooks](https://developers.google.com/hangouts/chat/how-tos/webhooks) ## On GitLab -When you have **Webhook URL** for your Hangouts Chat room webhook, you can setup the GitLab service. +When you have the **Webhook URL** for your Hangouts Chat room webhook, you can setup the GitLab service. 1. Navigate to the [Integrations page](project_services.md#accessing-the-project-services) in your project's settings, i.e. **Project > Settings > Integrations**. 1. Select the **Hangouts Chat** project service to configure it.