Allow build email service to be tested

This commit is contained in:
Felipe Artur 2016-07-12 18:19:47 -03:00
parent 2d96c66d63
commit 2e9d535868
7 changed files with 79 additions and 2 deletions

View file

@ -24,6 +24,7 @@ v 8.10.0 (unreleased)
- Add a new column `artifacts_size` to table `ci_builds` !4964
- Let Workhorse serve format-patch diffs
- Display tooltip for mentioned users and groups !5261 (winniehell)
- Allow build email service to be tested
- Added day name to contribution calendar tooltips
- Make images fit to the size of the viewport !4810
- Fix check for New Branch button on Issue page !4630 (winniehell)

View file

@ -45,8 +45,9 @@ class Projects::ServicesController < Projects::ApplicationController
end
def test
data = Gitlab::PushDataBuilder.build_sample(project, current_user)
data = @service.test_data(project, current_user)
outcome = @service.test(data)
if outcome[:success]
message = { notice: 'We sent a request to the provided URL' }
else

View file

@ -6,6 +6,7 @@ module Emails
add_project_headers
add_build_headers('failed')
mail(to: to, subject: subject("Build failed for #{@project.name}", @build.short_sha))
end

View file

@ -42,6 +42,19 @@ class BuildsEmailService < Service
end
end
def can_test?
project.builds.count > 0
end
def disabled_title
"Please setup a build on your repository."
end
def test_data(project = nil, user = nil)
build = project.builds.last
Gitlab::BuildDataBuilder.build(build)
end
def fields
[
{ type: 'textarea', name: 'recipients', placeholder: 'Emails separated by comma' },
@ -50,6 +63,20 @@ class BuildsEmailService < Service
]
end
def test(data)
begin
# bypass build status verification when testing
data[:build_status] = "failed"
data[:build_allow_failure] = false
result = execute(data)
rescue StandardError => error
return { success: false, result: error }
end
{ success: true, result: result }
end
def should_build_be_notified?(data)
case data[:build_status]
when 'success'

View file

@ -76,6 +76,10 @@ class Service < ActiveRecord::Base
[]
end
def test_data(project, user)
Gitlab::PushDataBuilder.build_sample(project, user)
end
def supported_events
%w(push tag_push issue merge_request wiki_page)
end
@ -94,6 +98,11 @@ class Service < ActiveRecord::Base
!project.empty_repo?
end
# reason why service cannot be tested
def disabled_title
"Please setup a project repository."
end
# Provide convenient accessor methods
# for each serialized property.
# Also keep track of updated properties in a similar way as ActiveModel::Dirty

View file

@ -12,5 +12,5 @@
&nbsp;
- if @service.valid? && @service.activated?
- disabled = @service.can_test? ? '':'disabled'
= link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service.to_param), class: "btn #{disabled}"
= link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled}", title: @service.disabled_title
= link_to "Cancel", namespace_project_services_path(@project.namespace, @project), class: "btn btn-cancel"

View file

@ -23,6 +23,44 @@ describe BuildsEmailService do
end
end
describe '#test_data' do
let(:build) { create(:ci_build) }
let(:project) { build.project }
let(:user) { create(:user) }
before { project.team << [user, :developer] }
it 'builds test data' do
data = subject.test_data(project)
expect(data[:object_kind]).to eq("build")
end
end
describe '#test' do
it 'sends email' do
data = Gitlab::BuildDataBuilder.build(create(:ci_build))
subject.recipients = 'test@gitlab.com'
expect(BuildEmailWorker).to receive(:perform_async)
subject.test(data)
end
context 'notify only failed builds is true' do
it 'sends email' do
data = Gitlab::BuildDataBuilder.build(create(:ci_build))
data[:build_status] = "success"
subject.recipients = 'test@gitlab.com'
expect(subject).not_to receive(:notify_only_broken_builds)
expect(BuildEmailWorker).to receive(:perform_async)
subject.test(data)
end
end
end
describe '#execute' do
it 'sends email' do
subject.recipients = 'test@gitlab.com'