From f9f1a508c6a4bdb2fcee98d18394e28e1cc663c3 Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Fri, 16 Dec 2016 14:21:06 +0100
Subject: [PATCH] Fix SlackSlashCommands tests

---
 .../chat_slash_commands_service.rb            |   2 +-
 .../mattermost_slash_commands_service.rb      |   2 +-
 lib/gitlab/chat_commands/presenter.rb         |   2 +-
 spec/lib/gitlab/chat_commands/command_spec.rb |  20 +++-
 .../project_services/chat_service_spec.rb     |  15 ---
 .../chat_slash_commands_service_spec.rb       | 103 ++++++++++++++++++
 .../mattermost_slash_commands_service_spec.rb |  96 +---------------
 .../slack_slash_commands_service.rb           |   5 +
 8 files changed, 127 insertions(+), 118 deletions(-)
 delete mode 100644 spec/models/project_services/chat_service_spec.rb
 create mode 100644 spec/models/project_services/chat_slash_commands_service_spec.rb
 create mode 100644 spec/models/project_services/slack_slash_commands_service.rb

diff --git a/app/models/project_services/chat_slash_commands_service.rb b/app/models/project_services/chat_slash_commands_service.rb
index f11d257e6c1..e58c96f5094 100644
--- a/app/models/project_services/chat_slash_commands_service.rb
+++ b/app/models/project_services/chat_slash_commands_service.rb
@@ -5,7 +5,7 @@ class ChatSlashCommandsService < Service
 
   prop_accessor :token
 
-  has_many :chat_names, foreign_key: :service_id
+  has_many :chat_names, foreign_key: :service_id, dependent: :destroy
 
   def valid_token?(token)
     self.respond_to?(:token) &&
diff --git a/app/models/project_services/mattermost_slash_commands_service.rb b/app/models/project_services/mattermost_slash_commands_service.rb
index f9d4b29f4ea..72a7b9c8f3a 100644
--- a/app/models/project_services/mattermost_slash_commands_service.rb
+++ b/app/models/project_services/mattermost_slash_commands_service.rb
@@ -1,4 +1,4 @@
-class MattermostSlashCommandsService < ChatService
+class MattermostSlashCommandsService < ChatSlashCommandsService
   include TriggersHelper
 
   prop_accessor :token
diff --git a/lib/gitlab/chat_commands/presenter.rb b/lib/gitlab/chat_commands/presenter.rb
index c86efc0c3f8..98356ebebb3 100644
--- a/lib/gitlab/chat_commands/presenter.rb
+++ b/lib/gitlab/chat_commands/presenter.rb
@@ -1,5 +1,5 @@
 module Gitlab
-  class ChatCommands
+  module ChatCommands
     class Presenter
       include Gitlab::Routing.url_helpers
 
diff --git a/spec/lib/gitlab/chat_commands/command_spec.rb b/spec/lib/gitlab/chat_commands/command_spec.rb
index ed8d25a526a..dec98d990b2 100644
--- a/spec/lib/gitlab/chat_commands/command_spec.rb
+++ b/spec/lib/gitlab/chat_commands/command_spec.rb
@@ -3,9 +3,13 @@ require 'spec_helper'
 describe Gitlab::ChatCommands::Command, service: true do
   let(:project) { create(:empty_project) }
   let(:user) { create(:user) }
+  let(:format) { nil }
 
   describe '#execute' do
-    subject { described_class.new(project, user, params).execute }
+    subject do
+      described_class.new(project, user,
+        params.merge(presenter_format: format)).execute
+    end
 
     context 'when no command is available' do
       let(:params) { { text: 'issue show 1' } }
@@ -47,8 +51,14 @@ describe Gitlab::ChatCommands::Command, service: true do
         expect(subject[:text]).to match("my new issue")
       end
 
-      it 'shows a link to the new issue' do
-        expect(subject[:text]).to match(/\/issues\/\d+/)
+      %w(slack mattermost).each do |format|
+        context "for #{format}" do
+          let(:format) { format }
+
+          it 'shows a link to the new issue' do
+            expect(subject[:text]).to match(/\/issues\/\d+/)
+          end
+        end
       end
     end
 
@@ -64,7 +74,7 @@ describe Gitlab::ChatCommands::Command, service: true do
       context 'and user can not create deployment' do
         it 'returns action' do
           expect(subject[:response_type]).to be(:ephemeral)
-          expect(subject[:text]).to start_with('Whoops! This action is not allowed')
+          expect(subject[:text]).to start_with('Whoops! That action is not allowed')
         end
       end
 
@@ -74,7 +84,7 @@ describe Gitlab::ChatCommands::Command, service: true do
         end
 
         it 'returns action' do
-          expect(subject[:text]).to include('Deployment started from staging to production')
+          expect(subject[:text]).to include('Deployment from staging to production started.')
           expect(subject[:response_type]).to be(:in_channel)
         end
 
diff --git a/spec/models/project_services/chat_service_spec.rb b/spec/models/project_services/chat_service_spec.rb
deleted file mode 100644
index c6a45a3e1be..00000000000
--- a/spec/models/project_services/chat_service_spec.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-require 'spec_helper'
-
-describe ChatService, models: true do
-  describe "Associations" do
-    it { is_expected.to have_many :chat_names }
-  end
-
-  describe '#valid_token?' do
-    subject { described_class.new }
-
-    it 'is false as it has no token' do
-      expect(subject.valid_token?('wer')).to be_falsey
-    end
-  end
-end
diff --git a/spec/models/project_services/chat_slash_commands_service_spec.rb b/spec/models/project_services/chat_slash_commands_service_spec.rb
new file mode 100644
index 00000000000..64fdd4d570b
--- /dev/null
+++ b/spec/models/project_services/chat_slash_commands_service_spec.rb
@@ -0,0 +1,103 @@
+require 'spec_helper'
+
+describe ChatSlashCommandsService, models: true do
+  describe "Associations" do
+    it { is_expected.to respond_to :token }
+    it { is_expected.to have_many :chat_names }
+  end
+
+  describe '#valid_token?' do
+    subject { described_class.new }
+
+    context 'when the token is empty' do
+      it 'is false' do
+        expect(subject.valid_token?('wer')).to be_falsey
+      end
+    end
+
+    context 'when there is a token' do
+      before do
+        subject.token = '123'
+      end
+
+      it 'accepts equal tokens' do
+        expect(subject.valid_token?('123')).to be_truthy
+      end
+    end
+  end
+
+  describe '#trigger' do
+    subject { described_class.new }
+
+    before do
+      allow(subject).to receive(:presenter_format).and_return('unknown')
+    end
+
+    context 'no token is passed' do
+      let(:params) { Hash.new }
+
+      it 'returns nil' do
+        expect(subject.trigger(params)).to be_nil
+      end
+    end
+
+    context 'with a token passed' do
+      let(:project) { create(:empty_project) }
+      let(:params) { { token: 'token' } }
+
+      before do
+        allow(subject).to receive(:token).and_return('token')
+      end
+
+      context 'no user can be found' do
+        context 'when no url can be generated' do
+          it 'responds with the authorize url' do
+            response = subject.trigger(params)
+
+            expect(response[:response_type]).to eq :ephemeral
+            expect(response[:text]).to start_with ":sweat_smile: Couldn't identify you"
+          end
+        end
+
+        context 'when an auth url can be generated' do
+          let(:params) do
+            {
+              team_domain: 'http://domain.tld',
+              team_id: 'T3423423',
+              user_id: 'U234234',
+              user_name: 'mepmep',
+              token: 'token'
+            }
+          end
+
+          let(:service) do
+            project.create_mattermost_slash_commands_service(
+              properties: { token: 'token' }
+            )
+          end
+
+          it 'generates the url' do
+            response = service.trigger(params)
+
+            expect(response[:text]).to start_with(':wave: Hi there!')
+          end
+        end
+      end
+
+      context 'when the user is authenticated' do
+        let!(:chat_name) { create(:chat_name, service: subject) }
+        let(:params) { { token: 'token', team_id: chat_name.team_id, user_id: chat_name.chat_id } }
+
+        subject do
+          described_class.create(project: project, properties: { token: 'token' })
+        end
+
+        it 'triggers the command' do
+          expect_any_instance_of(Gitlab::ChatCommands::Command).to receive(:execute)
+
+          subject.trigger(params)
+        end
+      end
+    end
+  end
+end
diff --git a/spec/models/project_services/mattermost_slash_commands_service_spec.rb b/spec/models/project_services/mattermost_slash_commands_service_spec.rb
index 4a1037e950b..b9deb0201e1 100644
--- a/spec/models/project_services/mattermost_slash_commands_service_spec.rb
+++ b/spec/models/project_services/mattermost_slash_commands_service_spec.rb
@@ -1,99 +1,5 @@
 require 'spec_helper'
 
 describe MattermostSlashCommandsService, models: true do
-  describe "Associations" do
-    it { is_expected.to respond_to :token }
-  end
-
-  describe '#valid_token?' do
-    subject { described_class.new }
-
-    context 'when the token is empty' do
-      it 'is false' do
-        expect(subject.valid_token?('wer')).to be_falsey
-      end
-    end
-
-    context 'when there is a token' do
-      before do
-        subject.token = '123'
-      end
-
-      it 'accepts equal tokens' do
-        expect(subject.valid_token?('123')).to be_truthy
-      end
-    end
-  end
-
-  describe '#trigger' do
-    subject { described_class.new }
-
-    context 'no token is passed' do
-      let(:params) { Hash.new }
-
-      it 'returns nil' do
-        expect(subject.trigger(params)).to be_nil
-      end
-    end
-
-    context 'with a token passed' do
-      let(:project) { create(:empty_project) }
-      let(:params) { { token: 'token' } }
-
-      before do
-        allow(subject).to receive(:token).and_return('token')
-      end
-
-      context 'no user can be found' do
-        context 'when no url can be generated' do
-          it 'responds with the authorize url' do
-            response = subject.trigger(params)
-
-            expect(response[:response_type]).to eq :ephemeral
-            expect(response[:text]).to start_with ":sweat_smile: Couldn't identify you"
-          end
-        end
-
-        context 'when an auth url can be generated' do
-          let(:params) do
-            {
-              team_domain: 'http://domain.tld',
-              team_id: 'T3423423',
-              user_id: 'U234234',
-              user_name: 'mepmep',
-              token: 'token'
-            }
-          end
-
-          let(:service) do
-            project.create_mattermost_slash_commands_service(
-              properties: { token: 'token' }
-            )
-          end
-
-          it 'generates the url' do
-            response = service.trigger(params)
-
-            expect(response[:text]).to start_with(':wave: Hi there!')
-          end
-        end
-      end
-
-      context 'when the user is authenticated' do
-        let!(:chat_name) { create(:chat_name, service: service) }
-        let(:service) do
-          project.create_mattermost_slash_commands_service(
-            properties: { token: 'token' }
-          )
-        end
-        let(:params) { { token: 'token', team_id: chat_name.team_id, user_id: chat_name.chat_id } }
-
-        it 'triggers the command' do
-          expect_any_instance_of(Gitlab::ChatCommands::Command).to receive(:execute)
-
-          service.trigger(params)
-        end
-      end
-    end
-  end
+  it { is_expected.to respond_to :presenter_format }
 end
diff --git a/spec/models/project_services/slack_slash_commands_service.rb b/spec/models/project_services/slack_slash_commands_service.rb
new file mode 100644
index 00000000000..5ef97b9a2ed
--- /dev/null
+++ b/spec/models/project_services/slack_slash_commands_service.rb
@@ -0,0 +1,5 @@
+require 'spec_helper'
+
+describe SlackSlashCommandsService, models: true do
+  it { is_expected.to respond_to :presenter_format }
+end
-- 
GitLab