More coverage on service level
This commit is contained in:
		
							parent
							
								
									778b5a5a04
								
							
						
					
					
						commit
						0d04724fa1
					
				|  | @ -90,6 +90,15 @@ module API | ||||||
|       @project_service || not_found!("Service") |       @project_service || not_found!("Service") | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     def service_by_slug(project, slug) | ||||||
|  |       underscored_service = slug.underscore | ||||||
|  | 
 | ||||||
|  |       not_found!('Service') unless Service.available_services_names.include?(underscored_service) | ||||||
|  |       service_method = "#{underscored_service}_service" | ||||||
|  | 
 | ||||||
|  |       service = project.public_send(service_method) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     def service_attributes |     def service_attributes | ||||||
|       @service_attributes ||= project_service.fields.inject([]) do |arr, hash| |       @service_attributes ||= project_service.fields.inject([]) do |arr, hash| | ||||||
|         arr << hash[:name].to_sym |         arr << hash[:name].to_sym | ||||||
|  |  | ||||||
|  | @ -67,12 +67,7 @@ module API | ||||||
|       post ':id/services/:service_slug/trigger' do |       post ':id/services/:service_slug/trigger' do | ||||||
|         project = Project.find_with_namespace(params[:id]) || Project.find_by(id: params[:id]) |         project = Project.find_with_namespace(params[:id]) || Project.find_by(id: params[:id]) | ||||||
| 
 | 
 | ||||||
|         underscored_service = params[:service_slug].underscore |         service = service_by_slug(project, params[:service_slug]) | ||||||
| 
 |  | ||||||
|         not_found!('Service') unless Service.available_services_names.include?(underscored_service) |  | ||||||
|         service_method = "#{underscored_service}_service" |  | ||||||
| 
 |  | ||||||
|         service = project.public_send(service_method) |  | ||||||
| 
 | 
 | ||||||
|         result = service.try(:active?) && service.try(:trigger, params) |         result = service.try(:active?) && service.try(:trigger, params) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,7 +4,11 @@ module Mattermost | ||||||
|       include Rails.application.routes.url_helpers |       include Rails.application.routes.url_helpers | ||||||
| 
 | 
 | ||||||
|       def authorize_chat_name(url) |       def authorize_chat_name(url) | ||||||
|         message = ":wave: Hi there! Before I do anything for you, please [connect your GitLab account](#{url})." |         message = if url | ||||||
|  |                     ":wave: Hi there! Before I do anything for you, please [connect your GitLab account](#{url})." | ||||||
|  |                   else | ||||||
|  |                     ":sweat_smile: Couldn't identify you, nor can I autorize you!" | ||||||
|  |                   end | ||||||
| 
 | 
 | ||||||
|         ephemeral_response(message) |         ephemeral_response(message) | ||||||
|       end |       end | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| require 'spec_helper' | require 'spec_helper' | ||||||
| 
 | 
 | ||||||
| describe Gitlab::ChatCommands::Command, service: true do | describe Gitlab::ChatCommands::Command, service: true do | ||||||
|   let(:project) { create(:project) } |   let(:project) { create(:empty_project) } | ||||||
|   let(:user) { create(:user) } |   let(:user) { create(:user) } | ||||||
| 
 | 
 | ||||||
|   subject { described_class.new(project, user, params).execute } |   subject { described_class.new(project, user, params).execute } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | 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 | ||||||
|  | @ -0,0 +1,99 @@ | ||||||
|  | require 'spec_helper' | ||||||
|  | 
 | ||||||
|  | describe MattermostCommandService, 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_command_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_command_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 | ||||||
|  | end | ||||||
|  | @ -88,4 +88,50 @@ describe API::API, api: true  do | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   describe 'POST /projects/:id/services/:slug/trigger' do | ||||||
|  |     let!(:project) { create(:empty_project) } | ||||||
|  |     let(:service_name) { 'mattermost_command' } | ||||||
|  | 
 | ||||||
|  |     context 'no service is available' do | ||||||
|  |       it 'returns a not found message' do | ||||||
|  |         post api("/projects/#{project.id}/services/mattermost_command/trigger") | ||||||
|  | 
 | ||||||
|  |         expect(response).to have_http_status(404) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     context 'the service exists' do | ||||||
|  |       context 'the service is not active' do | ||||||
|  |         let!(:inactive_service) do | ||||||
|  |           project.create_mattermost_command_service( | ||||||
|  |             active: false, | ||||||
|  |             properties: { token: 'token' } | ||||||
|  |           ) | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         it 'when the service is inactive' do | ||||||
|  |           post api("/projects/#{project.id}/services/mattermost_command/trigger") | ||||||
|  | 
 | ||||||
|  |           expect(response).to have_http_status(404) | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       context 'the service is active' do | ||||||
|  |         let!(:active_service) do | ||||||
|  |           project.create_mattermost_command_service( | ||||||
|  |             active: true, | ||||||
|  |             properties: { token: 'token' } | ||||||
|  |           ) | ||||||
|  |         end | ||||||
|  |         let(:params) { { token: 'token' } } | ||||||
|  | 
 | ||||||
|  |         it 'retusn status 200' do | ||||||
|  |           post api("/projects/#{project.id}/services/mattermost_command/trigger"), params | ||||||
|  | 
 | ||||||
|  |           expect(response).to have_http_status(200) | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ describe ChatNames::FindUserService, services: true do | ||||||
|       context 'when existing user is requested' do |       context 'when existing user is requested' do | ||||||
|         let(:params) { { team_id: chat_name.team_id, user_id: chat_name.chat_id } } |         let(:params) { { team_id: chat_name.team_id, user_id: chat_name.chat_id } } | ||||||
| 
 | 
 | ||||||
|         it 'returns existing user' do |         it 'returns the existing user' do | ||||||
|           is_expected.to eq(user) |           is_expected.to eq(user) | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue