diff --git a/app/models/project.rb b/app/models/project.rb index ffbc355d5e34865be49bdc035bb69e387655390e..aa315de18fafd6587e27ce06588f3c0161eab183 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -89,8 +89,7 @@ def set_last_activity_at has_one :asana_service, dependent: :destroy has_one :gemnasium_service, dependent: :destroy has_one :mattermost_slash_commands_service, dependent: :destroy - has_one :mattermost_notification_service, dependent: :destroy - has_one :slack_notification_service, dependent: :destroy + has_one :slack_service, dependent: :destroy has_one :jenkins_service, dependent: :destroy has_one :jenkins_deprecated_service, dependent: :destroy has_one :buildkite_service, dependent: :destroy diff --git a/app/models/project_services/chat_service.rb b/app/models/project_services/chat_service.rb index 574788462deddcc160b75a23b2c8b494640d4682..d36beff5fa6e69829fac47db912b808f628e2d5a 100644 --- a/app/models/project_services/chat_service.rb +++ b/app/models/project_services/chat_service.rb @@ -1,5 +1,5 @@ # Base class for Chat services -# This class is not meant to be used directly, but only to inherit from. +# This class is not meant to be used directly, but only to inherrit from. class ChatService < Service default_value_for :category, 'chat' diff --git a/app/models/project_services/mattermost_notification_service.rb b/app/models/project_services/mattermost_notification_service.rb deleted file mode 100644 index de18c4b1f00cda5d5fa68873b940c3540e5b060c..0000000000000000000000000000000000000000 --- a/app/models/project_services/mattermost_notification_service.rb +++ /dev/null @@ -1,41 +0,0 @@ -class MattermostNotificationService < ChatNotificationService - def title - 'Mattermost notifications' - end - - def description - 'Receive event notifications in Mattermost' - end - - def to_param - 'mattermost_notification' - end - - def help - 'This service sends notifications about projects events to Mattermost channels.
- To set up this service: -
    -
  1. Enable incoming webhooks in your Mattermost installation.
  2. -
  3. Add an incoming webhook in your Mattermost team. The default channel can be overridden for each event.
  4. -
  5. Paste the webhook URL into the field bellow.
  6. -
  7. Select events below to enable notifications. The channel and username are optional.
  8. -
' - end - - def fields - default_fields + build_event_channels - end - - def default_fields - [ - { type: 'text', name: 'webhook', placeholder: 'http://mattermost_host/hooks/...' }, - { type: 'text', name: 'username', placeholder: 'username' }, - { type: 'checkbox', name: 'notify_only_broken_builds' }, - { type: 'checkbox', name: 'notify_only_broken_pipelines' }, - ] - end - - def default_channel - "#town-square" - end -end diff --git a/app/models/project_services/slack_notification_service.rb b/app/models/project_services/slack_notification_service.rb deleted file mode 100644 index 3cbf89efba4e32b0b1f6c92d4780842abbc9ff4b..0000000000000000000000000000000000000000 --- a/app/models/project_services/slack_notification_service.rb +++ /dev/null @@ -1,40 +0,0 @@ -class SlackNotificationService < ChatNotificationService - def title - 'Slack notifications' - end - - def description - 'Receive event notifications in Slack' - end - - def to_param - 'slack_notification' - end - - def help - 'This service sends notifications about projects events to Slack channels.
- To setup this service: -
    -
  1. Add an incoming webhook in your Slack team. The default channel can be overridden for each event.
  2. -
  3. Paste the Webhook URL into the field below.
  4. -
  5. Select events below to enable notifications. The channel and username are optional.
  6. -
' - end - - def fields - default_fields + build_event_channels - end - - def default_fields - [ - { type: 'text', name: 'webhook', placeholder: 'https://hooks.slack.com/services/...' }, - { type: 'text', name: 'username', placeholder: 'username' }, - { type: 'checkbox', name: 'notify_only_broken_builds' }, - { type: 'checkbox', name: 'notify_only_broken_pipelines' }, - ] - end - - def default_channel - "#general" - end -end diff --git a/app/models/project_services/chat_notification_service.rb b/app/models/project_services/slack_service.rb similarity index 65% rename from app/models/project_services/chat_notification_service.rb rename to app/models/project_services/slack_service.rb index b05569877210677134332d2d35801efcfd12100b..e1b937817f4649d7bfd4adbdd10665da35b023ef 100644 --- a/app/models/project_services/chat_notification_service.rb +++ b/app/models/project_services/slack_service.rb @@ -1,13 +1,6 @@ -# Base class for Chat notifications services -# This class is not meant to be used directly, but only to inherit from. -class ChatNotificationService < Service - include ChatMessage - - default_value_for :category, 'chat' - +class SlackService < Service prop_accessor :webhook, :username, :channel boolean_accessor :notify_only_broken_builds, :notify_only_broken_pipelines - validates :webhook, presence: true, url: true, if: :activated? def initialize_properties @@ -21,8 +14,35 @@ def initialize_properties end end - def can_test? - valid? + def title + 'Slack' + end + + def description + 'A team communication tool for the 21st century' + end + + def to_param + 'slack' + end + + def help + 'This service sends notifications to your Slack channel.
+ To setup this Service you need to create a new "Incoming webhook" in your Slack integration panel, + and enter the Webhook URL below.' + end + + def fields + default_fields = + [ + { type: 'text', name: 'webhook', placeholder: 'https://hooks.slack.com/services/...' }, + { type: 'text', name: 'username', placeholder: 'username' }, + { type: 'text', name: 'channel', placeholder: "#general" }, + { type: 'checkbox', name: 'notify_only_broken_builds' }, + { type: 'checkbox', name: 'notify_only_broken_pipelines' }, + ] + + default_fields + build_event_channels end def supported_events @@ -47,16 +67,21 @@ def execute(data) message = get_message(object_kind, data) - return false unless message + if message + opt = {} + + event_channel = get_channel_field(object_kind) || channel - opt = {} + opt[:channel] = event_channel if event_channel + opt[:username] = username if username - opt[:channel] = get_channel_field(object_kind).presence || channel || default_channel - opt[:username] = username if username - notifier = Slack::Notifier.new(webhook, opt) - notifier.ping(message.pretext, attachments: message.attachments, fallback: message.fallback) + notifier = Slack::Notifier.new(webhook, opt) + notifier.ping(message.pretext, attachments: message.attachments, fallback: message.fallback) - true + true + else + false + end end def event_channel_names @@ -71,10 +96,6 @@ def global_fields fields.reject { |field| field[:name].end_with?('channel') } end - def default_channel - raise NotImplementedError - end - private def get_message(object_kind, data) @@ -103,7 +124,7 @@ def get_channel_field(event) def build_event_channels supported_events.reduce([]) do |channels, event| - channels << { type: 'text', name: event_channel_name(event), placeholder: default_channel } + channels << { type: 'text', name: event_channel_name(event), placeholder: "#general" } end end @@ -145,3 +166,11 @@ def should_pipeline_be_notified?(data) end end end + +require "slack_service/issue_message" +require "slack_service/push_message" +require "slack_service/merge_message" +require "slack_service/note_message" +require "slack_service/build_message" +require "slack_service/pipeline_message" +require "slack_service/wiki_page_message" diff --git a/app/models/project_services/chat_message/base_message.rb b/app/models/project_services/slack_service/base_message.rb similarity index 96% rename from app/models/project_services/chat_message/base_message.rb rename to app/models/project_services/slack_service/base_message.rb index a03605d01fb5e507addb059755e0df1fa7b430cf..f1182824687885584ead06828ff30ab53ebd3f28 100644 --- a/app/models/project_services/chat_message/base_message.rb +++ b/app/models/project_services/slack_service/base_message.rb @@ -1,6 +1,6 @@ require 'slack-notifier' -module ChatMessage +class SlackService class BaseMessage def initialize(params) raise NotImplementedError diff --git a/app/models/project_services/chat_message/build_message.rb b/app/models/project_services/slack_service/build_message.rb similarity index 98% rename from app/models/project_services/chat_message/build_message.rb rename to app/models/project_services/slack_service/build_message.rb index 53e35cb21bf0692e3e83ac1e7520209ea1d67bb3..0fca4267bad8eb3f9246c40cf09e24a823526d0a 100644 --- a/app/models/project_services/chat_message/build_message.rb +++ b/app/models/project_services/slack_service/build_message.rb @@ -1,4 +1,4 @@ -module ChatMessage +class SlackService class BuildMessage < BaseMessage attr_reader :sha attr_reader :ref_type diff --git a/app/models/project_services/chat_message/issue_message.rb b/app/models/project_services/slack_service/issue_message.rb similarity index 98% rename from app/models/project_services/chat_message/issue_message.rb rename to app/models/project_services/slack_service/issue_message.rb index 14fd64e53321fe644ca98e2842e14e690c4ac6a8..cd87a79d0c607383f6c92b0c66cda190f095dcd4 100644 --- a/app/models/project_services/chat_message/issue_message.rb +++ b/app/models/project_services/slack_service/issue_message.rb @@ -1,4 +1,4 @@ -module ChatMessage +class SlackService class IssueMessage < BaseMessage attr_reader :user_name attr_reader :title diff --git a/app/models/project_services/chat_message/merge_message.rb b/app/models/project_services/slack_service/merge_message.rb similarity index 98% rename from app/models/project_services/chat_message/merge_message.rb rename to app/models/project_services/slack_service/merge_message.rb index 31c0e71fb8c3bd9eb2660ba101aca8742f051b65..12ce47bf604fd4facd41b37d6c2de63d5892e8e7 100644 --- a/app/models/project_services/chat_message/merge_message.rb +++ b/app/models/project_services/slack_service/merge_message.rb @@ -1,4 +1,4 @@ -module ChatMessage +class SlackService class MergeMessage < BaseMessage attr_reader :user_name attr_reader :project_name diff --git a/app/models/project_services/chat_message/note_message.rb b/app/models/project_services/slack_service/note_message.rb similarity index 99% rename from app/models/project_services/chat_message/note_message.rb rename to app/models/project_services/slack_service/note_message.rb index ca1d72070349c6b1a276fd053b114c71d01fdbfb..797c5937f097d8084d2bde57da39231448157862 100644 --- a/app/models/project_services/chat_message/note_message.rb +++ b/app/models/project_services/slack_service/note_message.rb @@ -1,4 +1,4 @@ -module ChatMessage +class SlackService class NoteMessage < BaseMessage attr_reader :message attr_reader :user_name diff --git a/app/models/project_services/chat_message/pipeline_message.rb b/app/models/project_services/slack_service/pipeline_message.rb similarity index 98% rename from app/models/project_services/chat_message/pipeline_message.rb rename to app/models/project_services/slack_service/pipeline_message.rb index 210027565a8cfe09e04596f95236a180bf439786..b6355fc4171ce20f02b444a38c8b3f0d0e7bc238 100644 --- a/app/models/project_services/chat_message/pipeline_message.rb +++ b/app/models/project_services/slack_service/pipeline_message.rb @@ -1,4 +1,4 @@ -module ChatMessage +class SlackService class PipelineMessage < BaseMessage attr_reader :ref_type, :ref, :status, :project_name, :project_url, :user_name, :duration, :pipeline_id diff --git a/app/models/project_services/chat_message/push_message.rb b/app/models/project_services/slack_service/push_message.rb similarity index 99% rename from app/models/project_services/chat_message/push_message.rb rename to app/models/project_services/slack_service/push_message.rb index 2d73b71ec376b11981912d7123a04a41e0dc684d..b26f3e9ddce9f392d6cc06e9446fb03a49fa1de3 100644 --- a/app/models/project_services/chat_message/push_message.rb +++ b/app/models/project_services/slack_service/push_message.rb @@ -1,4 +1,4 @@ -module ChatMessage +class SlackService class PushMessage < BaseMessage attr_reader :after attr_reader :before diff --git a/app/models/project_services/chat_message/wiki_page_message.rb b/app/models/project_services/slack_service/wiki_page_message.rb similarity index 98% rename from app/models/project_services/chat_message/wiki_page_message.rb rename to app/models/project_services/slack_service/wiki_page_message.rb index 134083e4504d639a67df5c54873118d8f47d9049..160ca3ac11523fa32fe5c5a36f640e1050401c11 100644 --- a/app/models/project_services/chat_message/wiki_page_message.rb +++ b/app/models/project_services/slack_service/wiki_page_message.rb @@ -1,4 +1,4 @@ -module ChatMessage +class SlackService class WikiPageMessage < BaseMessage attr_reader :user_name attr_reader :title diff --git a/app/models/service.rb b/app/models/service.rb index d46a0e21796f2f8fd21184770735cd36d19a3723..9fe4b5f7e9f39a4f23dc240f5fa3d89044b5fff7 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -222,8 +222,7 @@ def self.available_services_names pivotaltracker pushover redmine - mattermost_notification - slack_notification + slack teamcity ] end diff --git a/changelogs/unreleased/issue_22269.yml b/changelogs/unreleased/issue_22269.yml deleted file mode 100644 index 6b7164aff77d614e96d2375a437637bf8d97116e..0000000000000000000000000000000000000000 --- a/changelogs/unreleased/issue_22269.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Create mattermost service -merge_request: -author: diff --git a/db/migrate/20141006143943_move_slack_service_to_webhook.rb b/db/migrate/20141006143943_move_slack_service_to_webhook.rb index 42e88d6d6e3904102d8a89612823bb1a7eaced38..f373c664e1687a545e936b499b1344883bbeff97 100644 --- a/db/migrate/20141006143943_move_slack_service_to_webhook.rb +++ b/db/migrate/20141006143943_move_slack_service_to_webhook.rb @@ -1,11 +1,10 @@ # rubocop:disable all class MoveSlackServiceToWebhook < ActiveRecord::Migration - DOWNTIME = true DOWNTIME_REASON = 'Move old fields "token" and "subdomain" to one single field "webhook"' def change - SlackNotificationService.all.each do |slack_service| + SlackService.all.each do |slack_service| if ["token", "subdomain"].all? { |property| slack_service.properties.key? property } token = slack_service.properties['token'] subdomain = slack_service.properties['subdomain'] diff --git a/db/migrate/20161213172958_change_slack_service_to_slack_notification_service.rb b/db/migrate/20161213172958_change_slack_service_to_slack_notification_service.rb deleted file mode 100644 index a7278d7b5a629e06bdaf474c550de806678aaa89..0000000000000000000000000000000000000000 --- a/db/migrate/20161213172958_change_slack_service_to_slack_notification_service.rb +++ /dev/null @@ -1,14 +0,0 @@ -class ChangeSlackServiceToSlackNotificationService < ActiveRecord::Migration - include Gitlab::Database::MigrationHelpers - - DOWNTIME = true - DOWNTIME_REASON = 'Rename SlackService to SlackNotificationService' - - def up - execute("UPDATE services SET type = 'SlackNotificationService' WHERE type = 'SlackService'") - end - - def down - execute("UPDATE services SET type = 'SlackService' WHERE type = 'SlackNotificationService'") - end -end diff --git a/doc/api/services.md b/doc/api/services.md index 7f6efc9756b19b46a53c31b31ed760ba62fd24de..6fe823059aa4d8e74c6586a5ba9221c6e84ca6dc 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -703,9 +703,9 @@ Get Redmine service settings for a project. GET /projects/:id/services/redmine ``` -## Slack notifications +## Slack -Receive event notifications in Slack +A team communication tool for the 21st century ### Create/Edit Slack service @@ -737,40 +737,6 @@ Get Slack service settings for a project. GET /projects/:id/services/slack ``` -## Mattermost notifications - -Receive event notifications in Mattermost - -### Create/Edit Mattermost notifications service - -Set Mattermost service for a project. - -``` -PUT /projects/:id/services/mattermost -``` - -Parameters: - -- `webhook` (**required**) - https://mattermost.example/hooks/1298aff... -- `username` (optional) - username -- `channel` (optional) - #channel - -### Delete Mattermost notifications service - -Delete Mattermost Notifications service for a project. - -``` -DELETE /projects/:id/services/mattermost -``` - -### Get Mattermost notifications service settings - -Get Mattermost notifications service settings for a project. - -``` -GET /projects/:id/services/mattermost -``` - ## JetBrains TeamCity CI A continuous integration and build server diff --git a/doc/project_services/img/mattermost_configuration.png b/doc/project_services/img/mattermost_configuration.png deleted file mode 100644 index 3c5ff5ee317ff47596210461924bdd635faeaab1..0000000000000000000000000000000000000000 Binary files a/doc/project_services/img/mattermost_configuration.png and /dev/null differ diff --git a/doc/project_services/mattermost.md b/doc/project_services/mattermost.md deleted file mode 100644 index fbc7dfeee6d0637cb01ad4fcada6af1cd675bc39..0000000000000000000000000000000000000000 --- a/doc/project_services/mattermost.md +++ /dev/null @@ -1,45 +0,0 @@ -# Mattermost Notifications Service - -## On Mattermost - -To enable Mattermost integration you must create an incoming webhook integration: - -1. Sign in to your Mattermost instance -1. Visit incoming webhooks, that will be something like: https://mattermost.example/your_team_name/integrations/incoming_webhooks/add -1. Choose a display name, description and channel, those can be overridden on GitLab -1. Save it, copy the **Webhook URL**, we'll need this later for GitLab. - -There might be some cases that Incoming Webhooks are blocked by admin, ask your mattermost admin to enable -it on https://mattermost.example/admin_console/integrations/custom. - -Display name override is not enabled by default, you need to ask your admin to enable it on that same section. - -## On GitLab - -After you set up Mattermost, it's time to set up GitLab. - -Go to your project's **Settings > Services > Mattermost Notifications** and you will see a -checkbox with the following events that can be triggered: - -- Push -- Issue -- Merge request -- Note -- Tag push -- Build -- Wiki page - -Bellow each of these event checkboxes, you will have an input field to insert -which Mattermost channel you want to send that event message, with `#town-square` -being the default. The hash sign is optional. - -At the end, fill in your Mattermost details: - -| Field | Description | -| ----- | ----------- | -| **Webhook** | The incoming webhooks which you have to setup on Mattermost, it will be something like: http://mattermost.example/hooks/5xo... | -| **Username** | Optional username which can be on messages sent to Mattermost. Fill this in if you want to change the username of the bot. | -| **Notify only broken builds** | If you choose to enable the **Build** event and you want to be only notified about failed builds. | - - -![Mattermost configuration](img/mattermost_configuration.png) diff --git a/doc/project_services/project_services.md b/doc/project_services/project_services.md index 0f398874b8fc6db774c9b8b8ca698bd83699ae46..a7bcd186a8c8356792283699282c40777c0b5d28 100644 --- a/doc/project_services/project_services.md +++ b/doc/project_services/project_services.md @@ -44,11 +44,10 @@ further configuration instructions and details. Contributions are welcome. | JetBrains TeamCity CI | A continuous integration and build server | | [Kubernetes](kubernetes.md) | A containerized deployment service | | [Mattermost slash commands](mattermost_slash_commands.md) | Mattermost chat and ChatOps slash commands | -| [Mattermost Notifications](mattermost.md) | Receive event notifications in Mattermost | -| [Slack Notifications](slack.md) | Receive event notifications in Slack | | PivotalTracker | Project Management Software (Source Commits Endpoint) | | Pushover | Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop | | [Redmine](redmine.md) | Redmine issue tracker | +| [Slack](slack.md) | A team communication tool for the 21st century | ## Services Templates diff --git a/doc/project_services/slack.md b/doc/project_services/slack.md index 0b682b43810853a9fd1f868f4162563fa0a42b9e..3cfe77c9f851464350afc323ea9e4773e60b0ce9 100644 --- a/doc/project_services/slack.md +++ b/doc/project_services/slack.md @@ -1,4 +1,4 @@ -# Slack Notifications Service +# Slack Service ## On Slack @@ -15,7 +15,7 @@ Slack: After you set up Slack, it's time to set up GitLab. -Go to your project's **Settings > Services > Slack Notifications** and you will see a +Go to your project's **Settings > Services > Slack** and you will see a checkbox with the following events that can be triggered: - Push diff --git a/lib/api/services.rb b/lib/api/services.rb index 24008aa7fb87aa51367434159a407c17b12a0d0e..9e983b9561ae96cff73b446403428d4ca12ed799 100644 --- a/lib/api/services.rb +++ b/lib/api/services.rb @@ -472,7 +472,7 @@ class Services < Grape::API desc: 'The description of the tracker' } ], - 'slack-notification' => [ + 'slack' => [ { required: true, name: :webhook, @@ -492,14 +492,6 @@ class Services < Grape::API desc: 'The channel name' } ], - 'mattermost-notification' => [ - { - required: true, - name: :webhook, - type: String, - desc: 'The Mattermost webhook. e.g. http://mattermost_host/hooks/...' - } - ], 'teamcity' => [ { required: true, diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz index d3165d07d7b9a37d532a6bf97c7d74de7d32098b..bfe59bdb90e75cb869cab6aa86cb9dc81ac5e225 100644 Binary files a/spec/features/projects/import_export/test_project_export.tar.gz and b/spec/features/projects/import_export/test_project_export.tar.gz differ diff --git a/spec/features/projects/services/slack_service_spec.rb b/spec/features/projects/services/slack_service_spec.rb index 320ed13a01dd3d277de9d3537ad91ad582529bce..16541f51d98cb9fc6e54b9ba6189db1929325efb 100644 --- a/spec/features/projects/services/slack_service_spec.rb +++ b/spec/features/projects/services/slack_service_spec.rb @@ -2,8 +2,8 @@ feature 'Projects > Slack service > Setup events', feature: true do let(:user) { create(:user) } - let(:service) { SlackNotificationService.new } - let(:project) { create(:project, slack_notification_service: service) } + let(:service) { SlackService.new } + let(:project) { create(:project, slack_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 599023d45801615771d2dcb2ececdeade85a00f1..016b8b1eda1fc003d384ec41045cb41601803aab 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -145,8 +145,7 @@ project: - assembla_service - asana_service - gemnasium_service -- slack_notification_service -- mattermost_notification_service +- slack_service - buildkite_service - bamboo_service - teamcity_service diff --git a/spec/models/project_services/chat_notification_service_spec.rb b/spec/models/project_services/chat_notification_service_spec.rb deleted file mode 100644 index c98e7ee14fdf76cd2bd7b694f52a07164ffc4bf3..0000000000000000000000000000000000000000 --- a/spec/models/project_services/chat_notification_service_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index c01e64b4c8e9ec3ddefb8401440936d9dcd3c041..0000000000000000000000000000000000000000 --- a/spec/models/project_services/mattermost_notification_service_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 59ddddf745451a0cb049140aa09535011e9ac5a5..0000000000000000000000000000000000000000 --- a/spec/models/project_services/slack_notification_service_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'spec_helper' - -describe SlackNotificationService, models: true do - it_behaves_like "slack or mattermost" -end diff --git a/spec/models/project_services/chat_message/build_message_spec.rb b/spec/models/project_services/slack_service/build_message_spec.rb similarity index 94% rename from spec/models/project_services/chat_message/build_message_spec.rb rename to spec/models/project_services/slack_service/build_message_spec.rb index b71d153f814b49f30919e6d7afec9311925a35e8..452f4e2782c80568f71bffc76f8deeaa6438b0ed 100644 --- a/spec/models/project_services/chat_message/build_message_spec.rb +++ b/spec/models/project_services/slack_service/build_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe ChatMessage::BuildMessage do - subject { described_class.new(args) } +describe SlackService::BuildMessage do + subject { SlackService::BuildMessage.new(args) } let(:args) do { diff --git a/spec/models/project_services/chat_message/issue_message_spec.rb b/spec/models/project_services/slack_service/issue_message_spec.rb similarity index 93% rename from spec/models/project_services/chat_message/issue_message_spec.rb rename to spec/models/project_services/slack_service/issue_message_spec.rb index ebe0ead4408f8d7e16d2e33849ab26cf40f55ed3..98c36ec088dde79355b9a16943f194e68abbc285 100644 --- a/spec/models/project_services/chat_message/issue_message_spec.rb +++ b/spec/models/project_services/slack_service/issue_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe ChatMessage::IssueMessage, models: true do - subject { described_class.new(args) } +describe SlackService::IssueMessage, models: true do + subject { SlackService::IssueMessage.new(args) } let(:args) do { diff --git a/spec/models/project_services/chat_message/merge_message_spec.rb b/spec/models/project_services/slack_service/merge_message_spec.rb similarity index 94% rename from spec/models/project_services/chat_message/merge_message_spec.rb rename to spec/models/project_services/slack_service/merge_message_spec.rb index 956e63197188b8a096c5b94bf5d7611c2cd2fd0b..e1c774cff644501b7a8298ecd19c601315f15a5e 100644 --- a/spec/models/project_services/chat_message/merge_message_spec.rb +++ b/spec/models/project_services/slack_service/merge_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe ChatMessage::MergeMessage, models: true do - subject { described_class.new(args) } +describe SlackService::MergeMessage, models: true do + subject { SlackService::MergeMessage.new(args) } let(:args) do { diff --git a/spec/models/project_services/chat_message/note_message_spec.rb b/spec/models/project_services/slack_service/note_message_spec.rb similarity index 92% rename from spec/models/project_services/chat_message/note_message_spec.rb rename to spec/models/project_services/slack_service/note_message_spec.rb index 31936da40a221a8475933ed795764169fc8d6644..97f818125d33155cf1aea8f27098a97fa636e9a0 100644 --- a/spec/models/project_services/chat_message/note_message_spec.rb +++ b/spec/models/project_services/slack_service/note_message_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe ChatMessage::NoteMessage, models: true do +describe SlackService::NoteMessage, models: true do let(:color) { '#345' } before do @@ -36,7 +36,7 @@ end it 'returns a message regarding notes on commits' do - message = described_class.new(@args) + message = SlackService::NoteMessage.new(@args) expect(message.pretext).to eq("test.user in : " \ "*Added a commit message*") @@ -62,7 +62,7 @@ end it 'returns a message regarding notes on a merge request' do - message = described_class.new(@args) + message = SlackService::NoteMessage.new(@args) expect(message.pretext).to eq("test.user in : " \ "*merge request title*") @@ -88,7 +88,7 @@ end it 'returns a message regarding notes on an issue' do - message = described_class.new(@args) + message = SlackService::NoteMessage.new(@args) expect(message.pretext).to eq( "test.user in : " \ @@ -114,7 +114,7 @@ end it 'returns a message regarding notes on a project snippet' do - message = described_class.new(@args) + message = SlackService::NoteMessage.new(@args) expect(message.pretext).to eq("test.user in : " \ "*snippet title*") diff --git a/spec/models/project_services/chat_message/pipeline_message_spec.rb b/spec/models/project_services/slack_service/pipeline_message_spec.rb similarity index 94% rename from spec/models/project_services/chat_message/pipeline_message_spec.rb rename to spec/models/project_services/slack_service/pipeline_message_spec.rb index 532a5ecd8f519c86c31dc67a6e5f4eef78747a7e..4098500122f037867661722617e8b6f548aed4ec 100644 --- a/spec/models/project_services/chat_message/pipeline_message_spec.rb +++ b/spec/models/project_services/slack_service/pipeline_message_spec.rb @@ -1,8 +1,7 @@ require 'spec_helper' -describe ChatMessage::PipelineMessage do - subject { described_class.new(args) } - +describe SlackService::PipelineMessage do + subject { SlackService::PipelineMessage.new(args) } let(:user) { { name: 'hacker' } } let(:args) do diff --git a/spec/models/project_services/chat_message/push_message_spec.rb b/spec/models/project_services/slack_service/push_message_spec.rb similarity index 95% rename from spec/models/project_services/chat_message/push_message_spec.rb rename to spec/models/project_services/slack_service/push_message_spec.rb index b781c4505db7b29e526142203bedaa1fb118712f..17cd05e24f1291e4765fc70ae839f11e0da82c6f 100644 --- a/spec/models/project_services/chat_message/push_message_spec.rb +++ b/spec/models/project_services/slack_service/push_message_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe ChatMessage::PushMessage, models: true do - subject { described_class.new(args) } +describe SlackService::PushMessage, models: true do + subject { SlackService::PushMessage.new(args) } let(:args) do { diff --git a/spec/models/project_services/chat_message/wiki_page_message_spec.rb b/spec/models/project_services/slack_service/wiki_page_message_spec.rb similarity index 97% rename from spec/models/project_services/chat_message/wiki_page_message_spec.rb rename to spec/models/project_services/slack_service/wiki_page_message_spec.rb index 94c04dc08654bb46196a820c91ce1fdfa2fa38d6..093911598b009e29a2a606c2231f0968e5cd82e1 100644 --- a/spec/models/project_services/chat_message/wiki_page_message_spec.rb +++ b/spec/models/project_services/slack_service/wiki_page_message_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe ChatMessage::WikiPageMessage, models: true do +describe SlackService::WikiPageMessage, models: true do subject { described_class.new(args) } let(:args) do diff --git a/spec/support/slack_mattermost_shared_examples.rb b/spec/models/project_services/slack_service_spec.rb similarity index 76% rename from spec/support/slack_mattermost_shared_examples.rb rename to spec/models/project_services/slack_service_spec.rb index 56d4965f74df71a6cf46510e0cf40ee2900e95f0..c07a70a806965975c637e5a877b7225811c95a71 100644 --- a/spec/support/slack_mattermost_shared_examples.rb +++ b/spec/models/project_services/slack_service_spec.rb @@ -1,7 +1,7 @@ -Dir[Rails.root.join("app/models/project_services/chat_message/*.rb")].each { |f| require f } +require 'spec_helper' -RSpec.shared_examples 'slack or mattermost' do - let(:chat_service) { described_class.new } +describe SlackService, models: true do + let(:slack) { SlackService.new } let(:webhook_url) { 'https://example.gitlab.com/' } describe "Associations" do @@ -24,7 +24,7 @@ end end - describe "#execute" do + describe "Execute" do let(:user) { create(:user) } let(:project) { create(:project) } let(:username) { 'slack_username' } @@ -35,7 +35,7 @@ end before do - allow(chat_service).to receive_messages( + allow(slack).to receive_messages( project: project, project_id: project.id, service_hook: true, @@ -77,55 +77,54 @@ @wiki_page_sample_data = wiki_page_service.hook_data(@wiki_page, 'create') end - it "calls Slack/Mattermost API for push events" do - chat_service.execute(push_sample_data) + it "calls Slack API for push events" do + slack.execute(push_sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end - it "calls Slack/Mattermost API for issue events" do - chat_service.execute(@issues_sample_data) + it "calls Slack API for issue events" do + slack.execute(@issues_sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end - it "calls Slack/Mattermost API for merge requests events" do - chat_service.execute(@merge_sample_data) + it "calls Slack API for merge requests events" do + slack.execute(@merge_sample_data) expect(WebMock).to have_requested(:post, webhook_url).once end - it "calls Slack/Mattermost API for wiki page events" do - chat_service.execute(@wiki_page_sample_data) + it "calls Slack API for wiki page events" do + slack.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(chat_service).to receive(:username).and_return(username) - + allow(slack).to receive(:username).and_return(username) expect(Slack::Notifier).to receive(:new). - with(webhook_url, username: username, channel: chat_service.default_channel). + with(webhook_url, username: username). and_return( double(:slack_service).as_null_object ) - chat_service.execute(push_sample_data) + slack.execute(push_sample_data) end it 'uses the channel as an option when it is configured' do - allow(chat_service).to receive(:channel).and_return(channel) + allow(slack).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 ) - chat_service.execute(push_sample_data) + slack.execute(push_sample_data) end context "event channels" do it "uses the right channel for push event" do - chat_service.update_attributes(push_channel: "random") + slack.update_attributes(push_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -133,11 +132,11 @@ double(:slack_service).as_null_object ) - chat_service.execute(push_sample_data) + slack.execute(push_sample_data) end it "uses the right channel for merge request event" do - chat_service.update_attributes(merge_request_channel: "random") + slack.update_attributes(merge_request_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -145,11 +144,11 @@ double(:slack_service).as_null_object ) - chat_service.execute(@merge_sample_data) + slack.execute(@merge_sample_data) end it "uses the right channel for issue event" do - chat_service.update_attributes(issue_channel: "random") + slack.update_attributes(issue_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -157,11 +156,11 @@ double(:slack_service).as_null_object ) - chat_service.execute(@issues_sample_data) + slack.execute(@issues_sample_data) end it "uses the right channel for wiki event" do - chat_service.update_attributes(wiki_page_channel: "random") + slack.update_attributes(wiki_page_channel: "random") expect(Slack::Notifier).to receive(:new). with(webhook_url, channel: "random"). @@ -169,7 +168,7 @@ double(:slack_service).as_null_object ) - chat_service.execute(@wiki_page_sample_data) + slack.execute(@wiki_page_sample_data) end context "note event" do @@ -178,7 +177,7 @@ end it "uses the right channel" do - chat_service.update_attributes(note_channel: "random") + slack.update_attributes(note_channel: "random") note_data = Gitlab::DataBuilder::Note.build(issue_note, user) @@ -188,7 +187,7 @@ double(:slack_service).as_null_object ) - chat_service.execute(note_data) + slack.execute(note_data) end end end @@ -199,7 +198,7 @@ let(:project) { create(:project, creator_id: user.id) } before do - allow(chat_service).to receive_messages( + allow(slack).to receive_messages( project: project, project_id: project.id, service_hook: true, @@ -217,9 +216,9 @@ note: 'a comment on a commit') end - it "calls Slack/Mattermost API for commit comment events" do + it "calls Slack API for commit comment events" do data = Gitlab::DataBuilder::Note.build(commit_note, user) - chat_service.execute(data) + slack.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -233,7 +232,7 @@ it "calls Slack API for merge request comment events" do data = Gitlab::DataBuilder::Note.build(merge_request_note, user) - chat_service.execute(data) + slack.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -246,7 +245,7 @@ it "calls Slack API for issue comment events" do data = Gitlab::DataBuilder::Note.build(issue_note, user) - chat_service.execute(data) + slack.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -260,7 +259,7 @@ it "calls Slack API for snippet comment events" do data = Gitlab::DataBuilder::Note.build(snippet_note, user) - chat_service.execute(data) + slack.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -278,21 +277,21 @@ end before do - allow(chat_service).to receive_messages( + allow(slack).to receive_messages( project: project, service_hook: true, webhook: webhook_url ) end - shared_examples 'call Slack/Mattermost API' do + shared_examples 'call Slack API' do before do WebMock.stub_request(:post, webhook_url) end - it 'calls Slack/Mattermost API for pipeline events' do + it 'calls Slack API for pipeline events' do data = Gitlab::DataBuilder::Pipeline.build(pipeline) - chat_service.execute(data) + slack.execute(data) expect(WebMock).to have_requested(:post, webhook_url).once end @@ -301,16 +300,16 @@ context 'with failed pipeline' do let(:status) { 'failed' } - it_behaves_like 'call Slack/Mattermost API' + it_behaves_like 'call Slack API' end context 'with succeeded pipeline' do let(:status) { 'success' } context 'with default to notify_only_broken_pipelines' do - it 'does not call Slack/Mattermost API for pipeline events' do + it 'does not call Slack API for pipeline events' do data = Gitlab::DataBuilder::Pipeline.build(pipeline) - result = chat_service.execute(data) + result = slack.execute(data) expect(result).to be_falsy end @@ -318,10 +317,10 @@ context 'with setting notify_only_broken_pipelines to false' do before do - chat_service.notify_only_broken_pipelines = false + slack.notify_only_broken_pipelines = false end - it_behaves_like 'call Slack/Mattermost API' + it_behaves_like 'call Slack API' end end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 894ba6a718de2ab50c173e1294f24e319500c219..09f98c0ec4eeb203afc63c9dc270b5135a46b18c 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -22,8 +22,7 @@ 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_notification_service).dependent(:destroy) } - it { is_expected.to have_one(:mattermost_notification_service).dependent(:destroy) } + it { is_expected.to have_one(:slack_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) }