diff --git a/lib/travis/addons/campfire/task.rb b/lib/travis/addons/campfire/task.rb index 0d9d2e7e9..b625e6cf9 100644 --- a/lib/travis/addons/campfire/task.rb +++ b/lib/travis/addons/campfire/task.rb @@ -43,8 +43,7 @@ def send_line(url, line) end def template - template = config[:template] rescue nil - Array(template || DEFAULT_TEMPLATE) + Array(template_for(build[:state]) || DEFAULT_TEMPLATE) end def parse(target) diff --git a/lib/travis/addons/hipchat/task.rb b/lib/travis/addons/hipchat/task.rb index 63e4885ca..dcaa81db5 100644 --- a/lib/travis/addons/hipchat/task.rb +++ b/lib/travis/addons/hipchat/task.rb @@ -43,8 +43,7 @@ def process end def template - template = config[:template] rescue nil - Array(template || DEFAULT_TEMPLATE) + Array(template_for(build[:state]) || DEFAULT_TEMPLATE) end def color diff --git a/lib/travis/addons/irc/task.rb b/lib/travis/addons/irc/task.rb index 06b70cfba..98f2f2a46 100644 --- a/lib/travis/addons/irc/task.rb +++ b/lib/travis/addons/irc/task.rb @@ -76,7 +76,7 @@ def join? end def template - Array(try_config(:template) || DEFAULT_TEMPLATE) + Array(template_for(build[:state]) || DEFAULT_TEMPLATE) end def client_options(port, ssl) diff --git a/lib/travis/addons/slack/task.rb b/lib/travis/addons/slack/task.rb index 7260abb20..291d3b192 100644 --- a/lib/travis/addons/slack/task.rb +++ b/lib/travis/addons/slack/task.rb @@ -70,10 +70,10 @@ def color end def template_from_config - slack_config.is_a?(Hash) ? slack_config[:template] : nil + config.is_a?(Hash) ? template_for(build[:state]) : nil end - def slack_config + def config build[:config].try(:[], :notifications).try(:[], :slack) || {} end diff --git a/lib/travis/addons/sqwiggle/task.rb b/lib/travis/addons/sqwiggle/task.rb index f950599b3..a0ea85f2e 100644 --- a/lib/travis/addons/sqwiggle/task.rb +++ b/lib/travis/addons/sqwiggle/task.rb @@ -6,9 +6,9 @@ module Sqwiggle # configuration (`.travis.yml`). # class Task < Travis::Task - DEFAULT_TEMPLATE = %Q[ + DEFAULT_TEMPLATE = %Q[ %{repository} - build number: %{build_number} (%{branch} - %{commit} : %{author}) - - build has + build has %{result} ] @@ -23,7 +23,7 @@ def message private def template - (config[:template] rescue nil) || DEFAULT_TEMPLATE + template_for(build[:state]) || DEFAULT_TEMPLATE end def process diff --git a/lib/travis/task.rb b/lib/travis/task.rb index 63e5630a7..6f8078651 100644 --- a/lib/travis/task.rb +++ b/lib/travis/task.rb @@ -89,5 +89,23 @@ def http_options def timeout(options = { after: 60 }, &block) Timeout::timeout(options[:after], &block) end + + def template_for(state = nil) + if state == 'passed' && config[:template_success] + config[:template_success] + elsif state == 'failed' && config[:template_failure] + config[:template_failure] + elsif state == 'errored' && config[:template_error] + config[:template_error] + else + config[:template] + end + rescue + nil + end + + def config + raise NotImplementedError, "#config must be implemented by the subclass" + end end end diff --git a/spec/travis/addons/campfire/task_spec.rb b/spec/travis/addons/campfire/task_spec.rb index 8045ea356..6872ab63d 100644 --- a/spec/travis/addons/campfire/task_spec.rb +++ b/spec/travis/addons/campfire/task_spec.rb @@ -44,6 +44,44 @@ def run(targets) http.verify_stubbed_calls end + it 'using a custom template_success' do + targets = ['account-1:token-1@1234'] + template = ['%{repository}', '%{commit}'] + messages = ['svenfuchs/minimal', '62aae5f'] + + payload['build']['config']['notifications'] = { campfire: { template_success: template } } + expect_campfire('account-1', '1234', 'token-1', messages) + + run(targets) + http.verify_stubbed_calls + end + + it 'using a custom template_failure' do + targets = ['account-1:token-1@1234'] + template = ['%{repository}', '%{commit}'] + messages = ['svenfuchs/minimal', '62aae5f'] + + payload['build']['config']['notifications'] = { campfire: { template_failure: template } } + payload['build']['state'] = 'failed' + expect_campfire('account-1', '1234', 'token-1', messages) + + run(targets) + http.verify_stubbed_calls + end + + it 'using a custom template_error' do + targets = ['account-1:token-1@1234'] + template = ['%{repository}', '%{commit}'] + messages = ['svenfuchs/minimal', '62aae5f'] + + payload['build']['config']['notifications'] = { campfire: { template_error: template } } + payload['build']['state'] = 'errored' + expect_campfire('account-1', '1234', 'token-1', messages) + + run(targets) + http.verify_stubbed_calls + end + def expect_campfire(account, room, token, body) host = "#{account}.campfirenow.com" path = "room/#{room}/speak.json" diff --git a/spec/travis/addons/hipchat/task_spec.rb b/spec/travis/addons/hipchat/task_spec.rb index fd38a680a..94c19cfbe 100644 --- a/spec/travis/addons/hipchat/task_spec.rb +++ b/spec/travis/addons/hipchat/task_spec.rb @@ -50,13 +50,51 @@ def run(targets) http.verify_stubbed_calls end + it 'uses template_success if defined' do + targets = ["#{room_1_token}@room_1"] + template = ['%{repository}', '%{commit}'] + messages = ['svenfuchs/minimal', '62aae5f'] + + payload['build']['config']['notifications'] = { hipchat: { template_success: template } } + expect_hipchat('room_1', room_1_token, messages) + + run(targets) + http.verify_stubbed_calls + end + + it 'uses template_failure if defined for failed build' do + targets = ["#{room_1_token}@room_1"] + template = ['%{repository}', '%{commit}'] + messages = ['svenfuchs/minimal', '62aae5f'] + + payload['build']['config']['notifications'] = { hipchat: { template_failure: template } } + payload['build']['state'] = 'failed' + expect_hipchat('room_1', room_1_token, messages, message_color: 'red') + + run(targets) + http.verify_stubbed_calls + end + + it 'uses template_error if defined for errored build' do + targets = ["#{room_1_token}@room_1"] + template = ['%{repository}', '%{commit}'] + messages = ['svenfuchs/minimal', '62aae5f'] + + payload['build']['config']['notifications'] = { hipchat: { template_error: template } } + payload['build']['state'] = 'errored' + expect_hipchat('room_1', room_1_token, messages, message_color: 'gray') + + run(targets) + http.verify_stubbed_calls + end + it "sends HTML notifications if requested" do targets = ["#{room_1_token}@room_1"] template = ['Details'] messages = ['Details'] payload['build']['config']['notifications'] = { hipchat: { template: template, format: 'html' } } - expect_hipchat('room_1', room_1_token, messages, 'message_format' => 'html') + expect_hipchat('room_1', room_1_token, messages, extra_body: {'message_format' => 'html'}) run(targets) http.verify_stubbed_calls @@ -87,7 +125,7 @@ def run(targets) ] payload["build"]["state"] = "errored" - expect_hipchat("room_1", room_1_token, messages, "color" => "gray") + expect_hipchat("room_1", room_1_token, messages, extra_body: {"color" => "gray"}) run(targets) http.verify_stubbed_calls @@ -101,9 +139,11 @@ def run(targets) end end - def expect_hipchat(room_id, token, lines, extra_body={}) + def expect_hipchat(room_id, token, lines, opts={}) + extra_body = opts[:extra_body] || {} + message_color = opts[:message_color] || 'green' Array(lines).each do |line| - body = { 'room_id' => room_id, 'from' => 'Travis CI', 'message' => line, 'color' => 'green', 'message_format' => 'text' }.merge(extra_body) + body = { 'room_id' => room_id, 'from' => 'Travis CI', 'message' => line, 'color' => message_color, 'message_format' => 'text' }.merge(extra_body) http.post("v1/rooms/message?format=json&auth_token=#{token}") do |env| env[:url].host.should == 'api.hipchat.com' Rack::Utils.parse_query(env[:body]).should == body @@ -111,9 +151,11 @@ def expect_hipchat(room_id, token, lines, extra_body={}) end end - def expect_hipchat_v2(room_id, token, lines, extra_body={}) + def expect_hipchat_v2(room_id, token, lines, opts={}) + extra_body = opts[:extra_body] || {} + message_color = opts[:message_color] || 'green' Array(lines).each do |line| - body = { 'message' => line, 'color' => 'green', 'message_format' => 'text' }.merge(extra_body).to_json + body = { 'message' => line, 'color' => message_color, 'message_format' => 'text' }.merge(extra_body).to_json http.post("https://api.hipchat.com/v2/room/#{URI::encode(room_id, Travis::Addons::Hipchat::HttpHelper::UNSAFE_URL_CHARS)}/notification?auth_token=#{token}") do |env| env[:request_headers]['Content-Type'].should == 'application/json' env[:body].should == body diff --git a/spec/travis/addons/irc/task_spec.rb b/spec/travis/addons/irc/task_spec.rb index 78a518616..b5c3cd774 100644 --- a/spec/travis/addons/irc/task_spec.rb +++ b/spec/travis/addons/irc/task_spec.rb @@ -91,6 +91,50 @@ def run(channels = nil) run end + it 'with a custom message template_success' do + payload['build']['config']['notifications'] = { irc: { template_success: '%{repository} %{commit}' } } + + expect_irc 'irc.freenode.net', 1234, 'travis', [ + 'NICK travis-ci', + 'USER travis-ci travis-ci travis-ci :travis-ci', + 'JOIN #travis', + 'PRIVMSG #travis :[travis-ci] svenfuchs/minimal 62aae5f', + 'PART #travis', + 'QUIT' + ] + run + end + + it 'with a custom message template_failure for a failed build' do + payload['build']['config']['notifications'] = { irc: { template_failure: '%{repository} %{commit}' } } + payload['build']['state'] = 'failed' + + expect_irc 'irc.freenode.net', 1234, 'travis', [ + 'NICK travis-ci', + 'USER travis-ci travis-ci travis-ci :travis-ci', + 'JOIN #travis', + 'PRIVMSG #travis :[travis-ci] svenfuchs/minimal 62aae5f', + 'PART #travis', + 'QUIT' + ] + run + end + + it 'with a custom message template_error for a errored build' do + payload['build']['config']['notifications'] = { irc: { template_error: '%{repository} %{commit}' } } + payload['build']['state'] = 'errored' + + expect_irc 'irc.freenode.net', 1234, 'travis', [ + 'NICK travis-ci', + 'USER travis-ci travis-ci travis-ci :travis-ci', + 'JOIN #travis', + 'PRIVMSG #travis :[travis-ci] svenfuchs/minimal 62aae5f', + 'PART #travis', + 'QUIT' + ] + run + end + it 'with multiple custom message templates' do payload['build']['config']['notifications'] = { irc: { template: ['%{repository} %{commit}', '%{message}'] } } @@ -106,6 +150,53 @@ def run(channels = nil) run end + it 'with multiple custom message templates for successful build' do + payload['build']['config']['notifications'] = { irc: { template_success: ['%{repository} %{commit}', '%{message}'] } } + + expect_irc 'irc.freenode.net', 1234, 'travis', [ + 'NICK travis-ci', + 'USER travis-ci travis-ci travis-ci :travis-ci', + 'JOIN #travis', + 'PRIVMSG #travis :[travis-ci] svenfuchs/minimal 62aae5f', + 'PRIVMSG #travis :[travis-ci] The build passed.', + 'PART #travis', + 'QUIT' + ] + run + end + + it 'with multiple custom message templates for failed build' do + payload['build']['config']['notifications'] = { irc: { template_failure: ['%{repository} %{commit}', '%{message}'] } } + payload['build']['state'] = 'failed' + + expect_irc 'irc.freenode.net', 1234, 'travis', [ + 'NICK travis-ci', + 'USER travis-ci travis-ci travis-ci :travis-ci', + 'JOIN #travis', + 'PRIVMSG #travis :[travis-ci] svenfuchs/minimal 62aae5f', + 'PRIVMSG #travis :[travis-ci] The build was broken.', + 'PART #travis', + 'QUIT' + ] + run + end + + it 'with multiple custom message templates for errored build' do + payload['build']['config']['notifications'] = { irc: { template_error: ['%{repository} %{commit}', '%{message}'] } } + payload['build']['state'] = 'errored' + + expect_irc 'irc.freenode.net', 1234, 'travis', [ + 'NICK travis-ci', + 'USER travis-ci travis-ci travis-ci :travis-ci', + 'JOIN #travis', + 'PRIVMSG #travis :[travis-ci] svenfuchs/minimal 62aae5f', + 'PRIVMSG #travis :[travis-ci] The build has errored.', + 'PART #travis', + 'QUIT' + ] + run + end + it 'with two irc notifications to different hosts' do [['irc.freenode.net', 1234, 'travis'], ['irc.example.com', 6667, 'example']].each do |host, port, channel| expect_irc host, port, channel, [ diff --git a/spec/travis/addons/slack/task_spec.rb b/spec/travis/addons/slack/task_spec.rb index 982b326f4..898d65592 100644 --- a/spec/travis/addons/slack/task_spec.rb +++ b/spec/travis/addons/slack/task_spec.rb @@ -50,10 +50,10 @@ def run(targets) run(targets) http.verify_stubbed_calls end - + it "allows specifying a custom template" do targets = ['team-1:token-1'] - payload['build']['config']['notifications'] = { slack: { template: 'Custom: %{author}'}} + payload['build']['config']['notifications'] = { slack: { template: 'Custom: %{author}'}} message = { icon_url: "https://travis-ci.org/images/travis-mascot-150.png", attachments: [{ @@ -67,6 +67,56 @@ def run(targets) http.verify_stubbed_calls end + it "uses template_success for successful build" do + targets = ['team-1:token-1'] + payload['build']['config']['notifications'] = { slack: { template_success: 'Custom: %{author}'}} + message = { + icon_url: "https://travis-ci.org/images/travis-mascot-150.png", + attachments: [{ + text: "Custom: Sven Fuchs", + color: 'good' + }.stringify_keys] + }.stringify_keys + expect_slack('team-1', 'token-1', message) + + run(targets) + http.verify_stubbed_calls + end + + it "uses template_error for errored build" do + targets = ['team-1:token-1'] + payload['build']['config']['notifications'] = { slack: { template_error: 'Custom: %{author}'}} + payload['build']['state'] = 'errored' + message = { + icon_url: "https://travis-ci.org/images/travis-mascot-150.png", + attachments: [{ + text: "Custom: Sven Fuchs", + color: 'warning' + }.stringify_keys] + }.stringify_keys + expect_slack('team-1', 'token-1', message) + + run(targets) + http.verify_stubbed_calls + end + + it "uses template_failure for failed build" do + targets = ['team-1:token-1'] + payload['build']['config']['notifications'] = { slack: { template_failure: 'Custom: %{author}'}} + payload['build']['state'] = 'failed' + message = { + icon_url: "https://travis-ci.org/images/travis-mascot-150.png", + attachments: [{ + text: "Custom: Sven Fuchs", + color: 'danger' + }.stringify_keys] + }.stringify_keys + expect_slack('team-1', 'token-1', message) + + run(targets) + http.verify_stubbed_calls + end + it "ignores garbage configurations" do targets = ['3109euaofjelw;arj;gfer//asfg=adfaf4lk3rj'] expect { diff --git a/spec/travis/addons/sqwiggle/task_spec.rb b/spec/travis/addons/sqwiggle/task_spec.rb index 2a2189275..20a5daaa4 100644 --- a/spec/travis/addons/sqwiggle/task_spec.rb +++ b/spec/travis/addons/sqwiggle/task_spec.rb @@ -21,7 +21,7 @@ def run(targets) targets = ['12345@2', '23456@3'] message = %Q[svenfuchs/minimal - build number: 2 (master - 62aae5f : Sven Fuchs) - - build has + build has passed ].squish @@ -59,11 +59,73 @@ def run(targets) http.verify_stubbed_calls end + it 'uses template_success for successful build if defined' do + targets = ['12345@1'] + template = '%{repository} %{commit}' + message = 'svenfuchs/minimal 62aae5f' + + payload['build']['config']['notifications'] = { sqwiggle: { template_success: template } } + + sqwiggle_payload = { + text: message, + format: 'html', + color: 'green', + parse: false + } + + expect_sqwiggle('12345', sqwiggle_payload, 1) + + run(targets) + http.verify_stubbed_calls + end + + it 'uses template_error for errored build if defined' do + targets = ['12345@1'] + template = '%{repository} %{commit}' + message = 'svenfuchs/minimal 62aae5f' + + payload['build']['config']['notifications'] = { sqwiggle: { template_error: template } } + payload['build']['state'] = 'errored' + + sqwiggle_payload = { + text: message, + format: 'html', + color: 'gray', + parse: false + } + + expect_sqwiggle('12345', sqwiggle_payload, 1) + + run(targets) + http.verify_stubbed_calls + end + + it 'uses template_failure for failed build if defined' do + targets = ['12345@1'] + template = '%{repository} %{commit}' + message = 'svenfuchs/minimal 62aae5f' + + payload['build']['config']['notifications'] = { sqwiggle: { template_failure: template } } + payload['build']['state'] = 'failed' + + sqwiggle_payload = { + text: message, + format: 'html', + color: 'red', + parse: false + } + + expect_sqwiggle('12345', sqwiggle_payload, 1) + + run(targets) + http.verify_stubbed_calls + end + it "sends red messages for failed builds" do targets = ["12345@1"] message = %Q[svenfuchs/minimal - build number: 2 (master - 62aae5f : Sven Fuchs) - - build has + build has failed ].squish @@ -80,12 +142,12 @@ def run(targets) run(targets) http.verify_stubbed_calls end - + it "sends gray messages for errored builds" do targets = ["12345@1"] message = %Q[svenfuchs/minimal - build number: 2 (master - 62aae5f : Sven Fuchs) - - build has + build has errored ].squish