diff options
-rw-r--r-- | app/controllers/projects/mattermost_controller.rb | 19 | ||||
-rw-r--r-- | app/models/project_services/mattermost_slash_commands_service.rb | 25 | ||||
-rw-r--r-- | config/routes/project.rb | 6 | ||||
-rw-r--r-- | lib/mattermost/command.rb | 17 | ||||
-rw-r--r-- | lib/mattermost/session.rb | 4 | ||||
-rw-r--r-- | lib/mattermost/team.rb | 20 | ||||
-rw-r--r-- | spec/fixtures/mattermost_new_command.json | 1 | ||||
-rw-r--r-- | spec/lib/mattermost/command_spec.rb | 20 | ||||
-rw-r--r-- | spec/lib/mattermost/session_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/mattermost/team_spec.rb | 18 | ||||
-rw-r--r-- | spec/models/project_services/mattermost_slash_commands_service_spec.rb | 35 |
11 files changed, 91 insertions, 76 deletions
diff --git a/app/controllers/projects/mattermost_controller.rb b/app/controllers/projects/mattermost_controller.rb index 1759d21e84f..a0eaec262ee 100644 --- a/app/controllers/projects/mattermost_controller.rb +++ b/app/controllers/projects/mattermost_controller.rb @@ -7,12 +7,13 @@ class Projects::MattermostController < Projects::ApplicationController def new end - def configure - @service.configure(host, current_user, configure_params) + def create + message = @service.configure(current_user, configure_params) + notice = message.is_a?(String) ? message : 'This service is now configured' redirect_to( new_namespace_project_mattermost_path(@project.namespace, @project), - notice: 'This service is now configured.' + notice: notice ) rescue NoSessionError redirect_to( @@ -24,7 +25,8 @@ class Projects::MattermostController < Projects::ApplicationController private def configure_params - params.permit(:trigger, :team_id).merge(url: service_trigger_url(@service), icon_url: asset_url('gitlab_logo.png')) + params.permit(:trigger, :team_id). + merge(url: service_trigger_url(@service), icon_url: asset_url('gitlab_logo.png')) end def service @@ -32,13 +34,6 @@ class Projects::MattermostController < Projects::ApplicationController end def teams - @teams = - begin - Mattermost::Mattermost.new(Gitlab.config.mattermost.host, current_user).with_session do - Mattermost::Team.team_admin - end - rescue - [] - end + @teams = @service.list_teams(current_user) end end diff --git a/app/models/project_services/mattermost_slash_commands_service.rb b/app/models/project_services/mattermost_slash_commands_service.rb index 5dfc4cc2744..6fdcb770593 100644 --- a/app/models/project_services/mattermost_slash_commands_service.rb +++ b/app/models/project_services/mattermost_slash_commands_service.rb @@ -25,12 +25,29 @@ class MattermostSlashCommandsService < ChatService ] end - def configure(host, current_user, params) - new_token = Mattermost::Session.new(host, current_user).with_session do - Mattermost::Command.create(params[:team_id], command) + def configure(current_user, params) + result = Mattermost::Session.new(current_user).with_session do |session| + Mattermost::Command.create(session, params[:team_id], command) end - update!(token: new_token, active: true) + if result.has_key?('message') + result['message'] + else + update!(token: result['token'], active: true) + end + end + + def list_teams + begin + response = Mattermost::Mattermost.new(current_user).with_session do |session| + Mattermost::Team.teams(session) + end + + # We ignore the error message as we can't display it + response.has_key?('message') ? [] : response + rescue Mattermost::NoSessionError + [] + end end def trigger(params) diff --git a/config/routes/project.rb b/config/routes/project.rb index 23d85368f1b..b42c5e5211c 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -76,11 +76,7 @@ constraints(ProjectUrlConstrainer.new) do end end - resources :mattermost, only: [:new] do - collection do - post :configure - end - end + resources :mattermost, only: [:new, :create] resources :deploy_keys, constraints: { id: /\d+/ }, only: [:index, :new, :create] do member do diff --git a/lib/mattermost/command.rb b/lib/mattermost/command.rb index 9c37d0b0d79..afbf2ce3349 100644 --- a/lib/mattermost/command.rb +++ b/lib/mattermost/command.rb @@ -1,14 +1,13 @@ module Mattermost - class Command < Session - def self.create(team_id, trigger: 'gitlab', url:, icon_url:) + class Command + def self.create(session, team_id, command) + response = session.post("/api/v3/teams/#{team_id}/commands/create", body: command.to_json).parsed_response - post_command(command)['token'] - end - - private - - def post_command(command) - post( "/teams/#{team_id}/commands/create", body: command.to_json).parsed_response + if response.has_key?('message') + response + else + response['token'] + end end end end diff --git a/lib/mattermost/session.rb b/lib/mattermost/session.rb index dcdff94814c..670f83bb6bc 100644 --- a/lib/mattermost/session.rb +++ b/lib/mattermost/session.rb @@ -30,6 +30,8 @@ module Mattermost begin yield self + rescue Errno::ECONNREFUSED + raise NoSessionError ensure destroy end @@ -112,4 +114,4 @@ module Mattermost end end end -end
\ No newline at end of file +end diff --git a/lib/mattermost/team.rb b/lib/mattermost/team.rb index 714748aea3c..c1b867629b6 100644 --- a/lib/mattermost/team.rb +++ b/lib/mattermost/team.rb @@ -1,21 +1,13 @@ module Mattermost - class Team < Session - def self.team_admin - return [] unless initial_load['team_members'] + class Team + def self.all(session) + response_body = retreive_teams(session) - team_ids = initial_load['team_members'].map do |team| - team['team_id'] if team['roles'].split.include?('team_admin') - end.compact - - initial_load['teams'].select do |team| - team_ids.include?(team['id']) - end + response_body.has_key?('message') ? response_body : response_body.values end - private - - def initial_load - @initial_load ||= get('/users/initial_load').parsed_response + def self.retreive_teams(session) + session.get('/api/v3/teams/all').parsed_response end end end diff --git a/spec/fixtures/mattermost_new_command.json b/spec/fixtures/mattermost_new_command.json deleted file mode 100644 index 4b827f19926..00000000000 --- a/spec/fixtures/mattermost_new_command.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"y8j1nexrdirj5nubq5uzdwwidr","token":"pzajm5hfbtni3r49ujpt8betpc","create_at":1481897117122,"update_at":1481897117122,"delete_at":0,"creator_id":"78nm4euoc7dypergdc13ekxgpo","team_id":"w59qt5a817f69jkxdz6xe7y4ir","trigger":"display","method":"P","username":"GitLab","icon_url":"","auto_complete":false,"auto_complete_desc":"","auto_complete_hint":"","display_name":"Display name","description":"the description","url":"http://trigger.url/trigger"} diff --git a/spec/lib/mattermost/command_spec.rb b/spec/lib/mattermost/command_spec.rb index 7c6457f639d..bc2e47ebbc9 100644 --- a/spec/lib/mattermost/command_spec.rb +++ b/spec/lib/mattermost/command_spec.rb @@ -1,17 +1,25 @@ require 'spec_helper' describe Mattermost::Command do + let(:session) { double("session") } + let(:hash) { { 'token' => 'token' } } + describe '.create' do - let(:new_command) do - JSON.parse(File.read(Rails.root.join('spec/fixtures/', 'mattermost_new_command.json'))) + before do + allow(session).to receive(:post).and_return(hash) + allow(hash).to receive(:parsed_response).and_return(hash) end - it 'gets the teams' do - allow(described_class).to receive(:post_command).and_return(new_command) + context 'with access' do + it 'gets the teams' do + expect(session).to receive(:post) + + described_class.create(session, 'abc', url: 'http://trigger.com') + end + end - token = described_class.create('abc', url: 'http://trigger.url/trigger', icon_url: 'http://myicon.com/icon.png') + context 'on an error' do - expect(token).to eq('pzajm5hfbtni3r49ujpt8betpc') end end end diff --git a/spec/lib/mattermost/session_spec.rb b/spec/lib/mattermost/session_spec.rb index 752ac796b1c..3c2eddbd221 100644 --- a/spec/lib/mattermost/session_spec.rb +++ b/spec/lib/mattermost/session_spec.rb @@ -96,4 +96,4 @@ describe Mattermost::Session, type: :request do end end end -end
\ No newline at end of file +end diff --git a/spec/lib/mattermost/team_spec.rb b/spec/lib/mattermost/team_spec.rb index 0fe6163900d..32a0dbf42ec 100644 --- a/spec/lib/mattermost/team_spec.rb +++ b/spec/lib/mattermost/team_spec.rb @@ -2,20 +2,22 @@ require 'spec_helper' describe Mattermost::Team do describe '.team_admin' do - let(:init_load) do - JSON.parse(File.read(Rails.root.join('spec/fixtures/', 'mattermost_initial_load.json'))) - end + let(:session) { double("session") } + # TODO fix fixture + let(:json) { File.read(Rails.root.join('spec/fixtures/', 'mattermost_initial_load.json')) } + let(:parsed_response) { JSON.parse(json) } before do - allow(described_class).to receive(:initial_load).and_return(init_load) + allow(session).to receive(:get).with('/api/v3/teams/all'). + and_return(json) + allow(json).to receive(:parsed_response).and_return(parsed_response) end - it 'gets the teams' do - expect(described_class.team_admin.count).to be(2) + xit 'gets the teams' do + expect(described_class.all(session).count).to be(2) end - it 'filters on being team admin' do - ids = described_class.team_admin.map { |team| team['id'] } + xit 'filters on being team admin' do expect(ids).to include("w59qt5a817f69jkxdz6xe7y4ir", "my9oujxf5jy1zqdgu9rihd66do") 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 43b2c2c1302..00018624d96 100644 --- a/spec/models/project_services/mattermost_slash_commands_service_spec.rb +++ b/spec/models/project_services/mattermost_slash_commands_service_spec.rb @@ -102,29 +102,34 @@ describe MattermostSlashCommandsService, models: true do let(:service) { project.build_mattermost_slash_commands_service } subject do - service.configure('http://localhost:8065', nil, team_id: 'abc', trigger: 'gitlab', url: 'http://trigger.url', icon_url: 'http://icon.url/icon.png') + service.configure('http://localhost:8065', team_id: 'abc', trigger: 'gitlab', url: 'http://trigger.url', icon_url: 'http://icon.url/icon.png') end - it 'creates a new Mattermost session' do - expect_any_instance_of(Mattermost::Session).to receive(:with_session) + context 'the requests succeeds' do + before do + allow_any_instance_of(Mattermost::Session).to receive(:with_session). + and_return('token' => 'mynewtoken') + end - subject - end + it 'saves the service' do + expect_any_instance_of(Mattermost::Session).to receive(:with_session) + expect { subject }.to change { project.services.count }.by(1) + end - it 'saves the service' do - allow_any_instance_of(Mattermost::Session).to receive(:with_session). - and_return('mynewtoken') + it 'saves the token' do + subject - expect { subject }.to change { project.services.count }.by(1) + expect(service.reload.token).to eq('mynewtoken') + end end - it 'saves the token' do - allow_any_instance_of(Mattermost::Session).to receive(:with_session). - and_return('mynewtoken') - - subject + context 'an error is received' do + it 'shows error messages' do + allow_any_instance_of(Mattermost::Session).to receive(:with_session). + and_return('token' => 'mynewtoken', 'message' => "Error") - expect(service.reload.token).to eq('mynewtoken') + expect(subject).to eq("Error") + end end end end |