fluent-plugin-slack 0.5.5 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f75a082b3fc4e977a269cd78744064139e102945
4
- data.tar.gz: c9a28cc8cfafa9b4bb80522b2b6261de9b4af55a
3
+ metadata.gz: 63a07a1d2026c16d55cd088092f69953404b202e
4
+ data.tar.gz: 33f8b2de136067d8e0e7adfa69457bb676d97eaa
5
5
  SHA512:
6
- metadata.gz: fc23d99226fe190408dbbb144325a90de7d19af07d67ab54544170059124cb1c6e03b68610aa4e976abeeca47cafc12b4d5120e8c67ff8f7301157d199911114
7
- data.tar.gz: 1eca5ba6bac83f01942b4aec43a24327b5c50d04cdf964c0478dec2d0ce2afbcecea49d492bfc0061a1478186f33aabbad3512afdd43984020fb82e80c818561
6
+ metadata.gz: 429287c6ea93b6a2af9371e7c50624142295be16a2e81e2ba27f3d293dc310eed431a0481f33b349c52384839db415401285f38ee7a4dbbcc778dc2f5017ad06
7
+ data.tar.gz: 50b5c8f83db6ef873cc448c85106b63e6dd7c6ff547f960701ec0634077d9539d09cbb5adfea347448c17982c538f87c5cfd37a44876eb5f90c2e91d43c3dfc6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## 0.6.0 (2015/04/02)
2
+
3
+ This version has impcompatibility with previous versions in default option values
4
+
5
+ Enhancements:
6
+
7
+ * Support `link_names` and `parse` option. `link_names` option is `true` as default
8
+
9
+ Changes:
10
+
11
+ * the default payload of Incoming Webhook was changed
12
+ * `color` is `nil` as default
13
+ * `icon_emoji` is `nil` as default
14
+ * `username` is `nil` as default
15
+ * `mrkdwn` is `true` as default
16
+
1
17
  ## 0.5.5 (2015/04/01)
2
18
 
3
19
  Enhancements:
data/README.md CHANGED
@@ -14,7 +14,6 @@ $ fluent-gem install fluent-plugin-slack
14
14
  webhook_url https://hooks.slack.com/services/XXX/XXX/XXX
15
15
  channel general
16
16
  username sowasowa
17
- color good
18
17
  icon_emoji :ghost:
19
18
  flush_interval 60s
20
19
  </match>
@@ -51,7 +50,6 @@ fluent_logger.post('slack', {
51
50
  token xoxb-XXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXX
52
51
  channel general
53
52
  username sowasowa
54
- color good
55
53
  icon_emoji :ghost:
56
54
  flush_interval 60s
57
55
  </match>
@@ -68,16 +66,18 @@ fluent_logger.post('slack', {
68
66
  |parameter|description|default|
69
67
  |---|---|---|
70
68
  |webhook_url|Incoming Webhook URI (Required for Incoming Webhook mode). See https://api.slack.com/incoming-webhooks||
71
- |slackbot_url|Slackbot URI (Required for Slackbot mode). See https://api.slack.com/slackbot. `username`, `color`, `icon_emoji`, `icon_url` are not available for this mode, but Desktop Notification via Highlight Words works with only this mode (Notification via Mentions works from Incoming Webhook and Web API with link_names=1, but Notification via Highlight Words does not)||
69
+ |slackbot_url|Slackbot URI (Required for Slackbot mode). See https://api.slack.com/slackbot. NOTE: most of optional parameters such as `username`, `color`, `icon_emoji`, `icon_url`, and `title` are not available for this mode, but Desktop Notification via Highlight Words works with only this mode||
72
70
  |token|Token for Web API (Required for Web API mode). See https://api.slack.com/web||
73
- |username|name of bot|fluentd|
74
- |color|color to use|good|
75
- |icon_emoji|emoji to use as the icon. either of icon_emoji or icon_url can be specified|`:question:`|
76
- |icon_url|url to an image to use as the icon. either of icon_emoji or icon_url can be specified|nil|
77
- |mrkdwn|enable formatting. see https://api.slack.com/docs/formatting|false|
71
+ |username|name of bot|nil|
72
+ |color|color to use such as `good` or `bad`. See `Color` section of https://api.slack.com/docs/attachments. NOTE: This parameter must **not** be specified to receive Desktop Notification via Mentions in cases of Incoming Webhook and Slack Web API|nil|
73
+ |icon_emoji|emoji to use as the icon. either of `icon_emoji` or `icon_url` can be specified|nil|
74
+ |icon_url|url to an image to use as the icon. either of `icon_emoji` or `icon_url` can be specified|nil|
75
+ |mrkdwn|enable formatting. see https://api.slack.com/docs/formatting|true|
76
+ |link_names|find and link channel names and usernames. NOTE: This parameter must be `true` to receive Desktop Notification via Mentions in cases of Incoming Webhook and Slack Web API|true|
77
+ |parse|change how messages are treated. `none` or `full` can be specified. See `Parsing mode` section of https://api.slack.com/docs/formatting|nil|
78
78
  |channel|channel to send messages (without first '#')||
79
79
  |channel_keys|keys used to format channel. %s will be replaced with value specified by channel_keys if this option is used|nil|
80
- |title|title format. %s will be replaced with value specified by title_keys. title is created from the first appeared record on each tag|nil|
80
+ |title|title format. %s will be replaced with value specified by title_keys. title is created from the first appeared record on each tag. NOTE: This parameter must **not** be specified to receive Desktop Notification via Mentions in cases of Incoming Webhook and Slack Web API|nil|
81
81
  |title_keys|keys used to format the title|nil|
82
82
  |message|message format. %s will be replaced with value specified by message_keys|%s|
83
83
  |message_keys|keys used to format messages|message|
@@ -97,6 +97,17 @@ fluent_logger.post('slack', {
97
97
 
98
98
  `fluent-plugin-slack` is a kind of BufferedOutput plugin, so you can also use [Buffer Parameters](http://docs.fluentd.org/articles/out_exec#buffer-parameters).
99
99
 
100
+ ## FAQ
101
+
102
+ ### Desktop Notification seems not working?
103
+
104
+ Currently, slack.com has following limitations:
105
+
106
+ 1. Desktop Notification via both Highlight Words and Mentions works only with Slackbot Remote Control
107
+ 2. Desktop Notification via Mentions works for the `text` field if `link_names` parameter is specified in cases of Incoming Webhook and Slack Web API, that is,
108
+ * Desktop Notification does not work for the `attachments` filed (used in `color` and `title`)
109
+ * Desktop Notification via Highlight Words does not work for Incoming Webhook and Slack Web API anyway
110
+
100
111
  ## ChangeLog
101
112
 
102
113
  See [CHANGELOG.md](CHANGELOG.md) for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.5
1
+ 0.6.0
@@ -14,11 +14,13 @@ module Fluent
14
14
  config_param :webhook_url, :string, default: nil # incoming webhook
15
15
  config_param :slackbot_url, :string, default: nil # slackbot
16
16
  config_param :token, :string, default: nil # api token
17
- config_param :username, :string, default: 'fluentd'
18
- config_param :color, :string, default: 'good'
17
+ config_param :username, :string, default: nil
18
+ config_param :color, :string, default: nil
19
19
  config_param :icon_emoji, :string, default: nil
20
20
  config_param :icon_url, :string, default: nil
21
- config_param :mrkdwn, :bool, default: false
21
+ config_param :mrkdwn, :bool, default: true
22
+ config_param :link_names, :bool, default: true
23
+ config_param :parse, :string, default: nil
22
24
  config_param :auto_channels_create, :bool, default: false
23
25
  config_param :https_proxy, :string, default: nil
24
26
 
@@ -56,25 +58,19 @@ module Fluent
56
58
  if @webhook_url.empty?
57
59
  raise Fluent::ConfigError.new("`webhook_url` is an empty string")
58
60
  end
59
- # following default values are for old version compatibility
60
- @title ||= '%s'
61
- @title_keys ||= %w[tag]
62
- @message ||= '[%s] %s'
63
- @message_keys ||= %w[time message]
64
61
  @slack = Fluent::SlackClient::IncomingWebhook.new(@webhook_url)
65
62
  elsif @slackbot_url
66
63
  if @slackbot_url.empty?
67
64
  raise Fluent::ConfigError.new("`slackbot_url` is an empty string")
68
65
  end
69
- @message ||= '%s'
70
- @message_keys ||= %w[message]
66
+ if @username or @color or @icon_emoji or @icon_url
67
+ log.warn "out_slack: `username`, `color`, `icon_emoji`, `icon_url` parameters are not available for Slackbot Remote Control"
68
+ end
71
69
  @slack = Fluent::SlackClient::Slackbot.new(@slackbot_url)
72
70
  elsif @token
73
71
  if @token.empty?
74
72
  raise Fluent::ConfigError.new("`token` is an empty string")
75
73
  end
76
- @message ||= '%s'
77
- @message_keys ||= %w[message]
78
74
  @slack = Fluent::SlackClient::WebApi.new
79
75
  else
80
76
  raise Fluent::ConfigError.new("One of `webhook_url` or `slackbot_url`, or `token` is required")
@@ -86,6 +82,8 @@ module Fluent
86
82
  @slack.https_proxy = @https_proxy
87
83
  end
88
84
 
85
+ @message ||= '%s'
86
+ @message_keys ||= %w[message]
89
87
  begin
90
88
  @message % (['1'] * @message_keys.length)
91
89
  rescue ArgumentError
@@ -109,13 +107,16 @@ module Fluent
109
107
  if @icon_emoji and @icon_url
110
108
  raise Fluent::ConfigError, "either of `icon_emoji` or `icon_url` can be specified"
111
109
  end
112
- @icon_emoji ||= ':question:' unless @icon_url
113
110
 
114
111
  if @mrkdwn
115
112
  # Enable markdown for attachments. See https://api.slack.com/docs/formatting
116
113
  @mrkdwn_in = %w[text fields]
117
114
  end
118
115
 
116
+ if @parse and !%w[none full].include?(@parse)
117
+ raise Fluent::ConfigError, "`parse` must be either of `none` or `full`"
118
+ end
119
+
119
120
  @post_message_opts = @auto_channels_create ? {auto_channels_create: true} : {}
120
121
  end
121
122
 
@@ -142,6 +143,8 @@ module Fluent
142
143
  def build_payloads(chunk)
143
144
  if @title
144
145
  build_title_payloads(chunk)
146
+ elsif @color
147
+ build_color_payloads(chunk)
145
148
  else
146
149
  build_plain_payloads(chunk)
147
150
  end
@@ -150,9 +153,12 @@ module Fluent
150
153
  def common_payload
151
154
  return @common_payload if @common_payload
152
155
  @common_payload = {}
153
- @common_payload[:username] = @username
156
+ @common_payload[:username] = @username if @username
154
157
  @common_payload[:icon_emoji] = @icon_emoji if @icon_emoji
155
158
  @common_payload[:icon_url] = @icon_url if @icon_url
159
+ @common_payload[:mrkdwn] = @mrkdwn if @mrkdwn
160
+ @common_payload[:link_names] = @link_names if @link_names
161
+ @common_payload[:parse] = @parse if @parse
156
162
  @common_payload[:token] = @token if @token
157
163
  @common_payload
158
164
  end
@@ -160,7 +166,8 @@ module Fluent
160
166
  def common_attachment
161
167
  return @common_attachment if @common_attachment
162
168
  @common_attachment = {}
163
- @common_attachment[:mrkdwn_in] = @mrkdwn_in if @mrkdwn_in
169
+ @common_attachment[:color] = @color if @color
170
+ @common_attachment[:mrkdwn_in] = @mrkdwn_in if @mrkdwn_in
164
171
  @common_attachment
165
172
  end
166
173
 
@@ -179,7 +186,6 @@ module Fluent
179
186
  {
180
187
  channel: channel,
181
188
  attachments: [{
182
- :color => @color,
183
189
  :fallback => fields.values.map(&:title).join(' '), # fallback is the message shown on popup
184
190
  :fields => fields.values.map(&:to_h)
185
191
  }.merge(common_attachment)],
@@ -187,7 +193,7 @@ module Fluent
187
193
  end
188
194
  end
189
195
 
190
- def build_plain_payloads(chunk)
196
+ def build_color_payloads(chunk)
191
197
  messages = {}
192
198
  chunk.msgpack_each do |tag, time, record|
193
199
  channel = build_channel(record)
@@ -198,7 +204,6 @@ module Fluent
198
204
  {
199
205
  channel: channel,
200
206
  attachments: [{
201
- :color => @color,
202
207
  :fallback => text,
203
208
  :text => text,
204
209
  }.merge(common_attachment)],
@@ -206,6 +211,21 @@ module Fluent
206
211
  end
207
212
  end
208
213
 
214
+ def build_plain_payloads(chunk)
215
+ messages = {}
216
+ chunk.msgpack_each do |tag, time, record|
217
+ channel = build_channel(record)
218
+ messages[channel] ||= ''
219
+ messages[channel] << "#{build_message(record)}\n"
220
+ end
221
+ messages.map do |channel, text|
222
+ {
223
+ channel: channel,
224
+ text: text,
225
+ }.merge(common_payload)
226
+ end
227
+ end
228
+
209
229
  def build_message(record)
210
230
  values = fetch_keys(record, @message_keys)
211
231
  @message % values
@@ -14,11 +14,13 @@ module Fluent
14
14
  config_param :webhook_url, :string, default: nil # incoming webhook
15
15
  config_param :slackbot_url, :string, default: nil # slackbot
16
16
  config_param :token, :string, default: nil # api token
17
- config_param :username, :string, default: 'fluentd'
18
- config_param :color, :string, default: 'good'
17
+ config_param :username, :string, default: nil
18
+ config_param :color, :string, default: nil
19
19
  config_param :icon_emoji, :string, default: nil
20
20
  config_param :icon_url, :string, default: nil
21
- config_param :mrkdwn, :bool, default: false
21
+ config_param :mrkdwn, :bool, default: true
22
+ config_param :link_names, :bool, default: true
23
+ config_param :parse, :string, default: nil
22
24
  config_param :auto_channels_create, :bool, default: false
23
25
  config_param :https_proxy, :string, default: nil
24
26
 
@@ -56,25 +58,19 @@ module Fluent
56
58
  if @webhook_url.empty?
57
59
  raise Fluent::ConfigError.new("`webhook_url` is an empty string")
58
60
  end
59
- # following default values are for old version compatibility
60
- @title ||= '%s'
61
- @title_keys ||= %w[tag]
62
- @message ||= '[%s] %s'
63
- @message_keys ||= %w[time message]
64
61
  @slack = Fluent::SlackClient::IncomingWebhook.new(@webhook_url)
65
62
  elsif @slackbot_url
66
63
  if @slackbot_url.empty?
67
64
  raise Fluent::ConfigError.new("`slackbot_url` is an empty string")
68
65
  end
69
- @message ||= '%s'
70
- @message_keys ||= %w[message]
66
+ if @username or @color or @icon_emoji or @icon_url
67
+ log.warn "out_slack: `username`, `color`, `icon_emoji`, `icon_url` parameters are not available for Slackbot Remote Control"
68
+ end
71
69
  @slack = Fluent::SlackClient::Slackbot.new(@slackbot_url)
72
70
  elsif @token
73
71
  if @token.empty?
74
72
  raise Fluent::ConfigError.new("`token` is an empty string")
75
73
  end
76
- @message ||= '%s'
77
- @message_keys ||= %w[message]
78
74
  @slack = Fluent::SlackClient::WebApi.new
79
75
  else
80
76
  raise Fluent::ConfigError.new("One of `webhook_url` or `slackbot_url`, or `token` is required")
@@ -86,6 +82,8 @@ module Fluent
86
82
  @slack.https_proxy = @https_proxy
87
83
  end
88
84
 
85
+ @message ||= '%s'
86
+ @message_keys ||= %w[message]
89
87
  begin
90
88
  @message % (['1'] * @message_keys.length)
91
89
  rescue ArgumentError
@@ -109,13 +107,16 @@ module Fluent
109
107
  if @icon_emoji and @icon_url
110
108
  raise Fluent::ConfigError, "either of `icon_emoji` or `icon_url` can be specified"
111
109
  end
112
- @icon_emoji ||= ':question:' unless @icon_url
113
110
 
114
111
  if @mrkdwn
115
112
  # Enable markdown for attachments. See https://api.slack.com/docs/formatting
116
113
  @mrkdwn_in = %w[text fields]
117
114
  end
118
115
 
116
+ if @parse and !%w[none full].include?(@parse)
117
+ raise Fluent::ConfigError, "`parse` must be either of `none` or `full`"
118
+ end
119
+
119
120
  @post_message_opts = @auto_channels_create ? {auto_channels_create: true} : {}
120
121
  end
121
122
 
@@ -142,6 +143,8 @@ module Fluent
142
143
  def build_payloads(chunk)
143
144
  if @title
144
145
  build_title_payloads(chunk)
146
+ elsif @color
147
+ build_color_payloads(chunk)
145
148
  else
146
149
  build_plain_payloads(chunk)
147
150
  end
@@ -150,9 +153,12 @@ module Fluent
150
153
  def common_payload
151
154
  return @common_payload if @common_payload
152
155
  @common_payload = {}
153
- @common_payload[:username] = @username
156
+ @common_payload[:username] = @username if @username
154
157
  @common_payload[:icon_emoji] = @icon_emoji if @icon_emoji
155
158
  @common_payload[:icon_url] = @icon_url if @icon_url
159
+ @common_payload[:mrkdwn] = @mrkdwn if @mrkdwn
160
+ @common_payload[:link_names] = @link_names if @link_names
161
+ @common_payload[:parse] = @parse if @parse
156
162
  @common_payload[:token] = @token if @token
157
163
  @common_payload
158
164
  end
@@ -160,7 +166,8 @@ module Fluent
160
166
  def common_attachment
161
167
  return @common_attachment if @common_attachment
162
168
  @common_attachment = {}
163
- @common_attachment[:mrkdwn_in] = @mrkdwn_in if @mrkdwn_in
169
+ @common_attachment[:color] = @color if @color
170
+ @common_attachment[:mrkdwn_in] = @mrkdwn_in if @mrkdwn_in
164
171
  @common_attachment
165
172
  end
166
173
 
@@ -179,7 +186,6 @@ module Fluent
179
186
  {
180
187
  channel: channel,
181
188
  attachments: [{
182
- :color => @color,
183
189
  :fallback => fields.values.map(&:title).join(' '), # fallback is the message shown on popup
184
190
  :fields => fields.values.map(&:to_h)
185
191
  }.merge(common_attachment)],
@@ -187,7 +193,7 @@ module Fluent
187
193
  end
188
194
  end
189
195
 
190
- def build_plain_payloads(chunk)
196
+ def build_color_payloads(chunk)
191
197
  messages = {}
192
198
  chunk.msgpack_each do |tag, time, record|
193
199
  channel = build_channel(record)
@@ -198,7 +204,6 @@ module Fluent
198
204
  {
199
205
  channel: channel,
200
206
  attachments: [{
201
- :color => @color,
202
207
  :fallback => text,
203
208
  :text => text,
204
209
  }.merge(common_attachment)],
@@ -206,6 +211,21 @@ module Fluent
206
211
  end
207
212
  end
208
213
 
214
+ def build_plain_payloads(chunk)
215
+ messages = {}
216
+ chunk.msgpack_each do |tag, time, record|
217
+ channel = build_channel(record)
218
+ messages[channel] ||= ''
219
+ messages[channel] << "#{build_message(record)}\n"
220
+ end
221
+ messages.map do |channel, text|
222
+ {
223
+ channel: channel,
224
+ text: text,
225
+ }.merge(common_payload)
226
+ end
227
+ end
228
+
209
229
  def build_message(record)
210
230
  values = fetch_keys(record, @message_keys)
211
231
  @message % values
@@ -151,8 +151,12 @@ module Fluent
151
151
  end
152
152
 
153
153
  def encode_body(params = {})
154
- raise ArgumentError, 'params[:attachments] is required' unless params[:attachments]
155
- attachment = Array(params[:attachments]).first # let me see only the first for now
154
+ return params[:text]if params[:text]
155
+ unless params[:attachments]
156
+ raise ArgumentError, 'params[:text] or params[:attachments] is required'
157
+ end
158
+ # handle params[:attachments]
159
+ attachment = Array(params[:attachments]).first # see only the first for now
156
160
  # {
157
161
  # attachments: [{
158
162
  # text: "HERE",
@@ -168,7 +172,7 @@ module Fluent
168
172
  # }]
169
173
  # }
170
174
  if text.nil? and attachment[:fields]
171
- text = Array(attachment[:fields]).first[:value] # let me see only the first for now
175
+ text = Array(attachment[:fields]).first[:value] # see only the first for now
172
176
  end
173
177
  text
174
178
  end
@@ -12,9 +12,23 @@ class SlackOutputTest < Test::Unit::TestCase
12
12
 
13
13
  CONFIG = %[
14
14
  channel channel
15
- token XXX-XXX-XXX
15
+ webhook_url https://hooks.slack.com/services/XXXX/XXXX/XXX
16
16
  ]
17
17
 
18
+ def default_payload
19
+ {
20
+ channel: '#channel',
21
+ mrkdwn: true,
22
+ link_names: true,
23
+ }
24
+ end
25
+
26
+ def default_attachment
27
+ {
28
+ mrkdwn_in: %w[text fields],
29
+ }
30
+ end
31
+
18
32
  def create_driver(conf = CONFIG)
19
33
  Fluent::Test::BufferedOutputTestDriver.new(Fluent::SlackOutput).configure(conf)
20
34
  end
@@ -23,12 +37,15 @@ class SlackOutputTest < Test::Unit::TestCase
23
37
  def test_old_config
24
38
  # default check
25
39
  d = create_driver
26
- assert_equal true, d.instance.localtime
27
- assert_equal 'fluentd', d.instance.username
28
- assert_equal 'good', d.instance.color
29
- assert_equal ':question:', d.instance.icon_emoji
40
+ assert_equal true, d.instance.localtime
41
+ assert_equal nil, d.instance.username # 'fluentd' break lower version compatibility
42
+ assert_equal nil, d.instance.color # 'good' break lower version compatibility
43
+ assert_equal nil, d.instance.icon_emoji # ':question:' break lower version compatibility
44
+ assert_equal nil, d.instance.icon_url
45
+ assert_equal true, d.instance.mrkdwn
46
+ assert_equal true, d.instance.link_names
47
+ assert_equal nil, d.instance.parse
30
48
 
31
- # incoming webhook endpoint was changed. api_key option should be ignored
32
49
  assert_nothing_raised do
33
50
  create_driver(CONFIG + %[api_key testtoken])
34
51
  end
@@ -84,7 +101,9 @@ class SlackOutputTest < Test::Unit::TestCase
84
101
  assert_raise(Fluent::ConfigError) do
85
102
  create_driver(CONFIG + %[channel %s %s\nchannel_keys foo])
86
103
  end
104
+ end
87
105
 
106
+ def test_slack_configure
88
107
  # One of webhook_url or slackbot_url, or token is required
89
108
  assert_raise(Fluent::ConfigError) do
90
109
  create_driver(%[channel foo])
@@ -146,7 +165,7 @@ class SlackOutputTest < Test::Unit::TestCase
146
165
  def test_icon_configure
147
166
  # default
148
167
  d = create_driver(CONFIG)
149
- assert_equal ':question:', d.instance.icon_emoji
168
+ assert_equal nil, d.instance.icon_emoji
150
169
  assert_equal nil, d.instance.icon_url
151
170
 
152
171
  # either of icon_emoji or icon_url can be specified
@@ -165,28 +184,66 @@ class SlackOutputTest < Test::Unit::TestCase
165
184
  assert_equal @icon_url, d.instance.icon_url
166
185
  end
167
186
 
168
- def test_https_proxy_configure
187
+ def test_link_names_configure
169
188
  # default
170
189
  d = create_driver(CONFIG)
171
- assert_equal nil, d.instance.slack.https_proxy
172
- assert_equal Net::HTTP, d.instance.slack.proxy_class
190
+ assert_equal true, d.instance.link_names
173
191
 
174
- # https_proxy
175
- d = create_driver(CONFIG + %[https_proxy https://proxy.foo.bar:443])
176
- assert_equal URI.parse('https://proxy.foo.bar:443'), d.instance.slack.https_proxy
177
- assert_not_equal Net::HTTP, d.instance.slack.proxy_class # Net::HTTP.Proxy
192
+ # true
193
+ d = create_driver(CONFIG + %[link_names true])
194
+ assert_equal true, d.instance.link_names
195
+
196
+ # false
197
+ d = create_driver(CONFIG + %[link_names false])
198
+ assert_equal false, d.instance.link_names
199
+ end
200
+
201
+ def test_parse_configure
202
+ # default
203
+ d = create_driver(CONFIG)
204
+ assert_equal nil, d.instance.parse
205
+
206
+ # none
207
+ d = create_driver(CONFIG + %[parse none])
208
+ assert_equal 'none', d.instance.parse
209
+
210
+ # full
211
+ d = create_driver(CONFIG + %[parse full])
212
+ assert_equal 'full', d.instance.parse
213
+
214
+ # invalid
215
+ assert_raise(Fluent::ConfigError) do
216
+ d = create_driver(CONFIG + %[parse invalid])
217
+ end
178
218
  end
179
219
 
180
220
  def test_mrkwn_configure
181
221
  # default
182
222
  d = create_driver(CONFIG)
183
- assert_equal false, d.instance.mrkdwn
184
- assert_equal nil, d.instance.mrkdwn_in
223
+ assert_equal true, d.instance.mrkdwn
224
+ assert_equal %w[text fields], d.instance.mrkdwn_in
185
225
 
186
- # mrkdwn
226
+ # true
187
227
  d = create_driver(CONFIG + %[mrkdwn true])
188
228
  assert_equal true, d.instance.mrkdwn
189
229
  assert_equal %w[text fields], d.instance.mrkdwn_in
230
+
231
+ # false
232
+ d = create_driver(CONFIG + %[mrkdwn false])
233
+ assert_equal false, d.instance.mrkdwn
234
+ assert_equal nil, d.instance.mrkdwn_in
235
+ end
236
+
237
+ def test_https_proxy_configure
238
+ # default
239
+ d = create_driver(CONFIG)
240
+ assert_equal nil, d.instance.slack.https_proxy
241
+ assert_equal Net::HTTP, d.instance.slack.proxy_class
242
+
243
+ # https_proxy
244
+ d = create_driver(CONFIG + %[https_proxy https://proxy.foo.bar:443])
245
+ assert_equal URI.parse('https://proxy.foo.bar:443'), d.instance.slack.https_proxy
246
+ assert_not_equal Net::HTTP, d.instance.slack.proxy_class # Net::HTTP.Proxy
190
247
  end
191
248
 
192
249
  def test_default_incoming_webhook
@@ -197,19 +254,9 @@ class SlackOutputTest < Test::Unit::TestCase
197
254
  assert_equal Fluent::SlackClient::IncomingWebhook, d.instance.slack.class
198
255
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
199
256
  d.tag = 'test'
200
- mock(d.instance.slack).post_message({
201
- channel: '#channel',
202
- username: 'fluentd',
203
- icon_emoji: ':question:',
204
- attachments: [{
205
- color: 'good',
206
- fallback: 'test',
207
- fields: [{
208
- title: 'test',
209
- value: "[07:00:00] sowawa1\n[07:00:00] sowawa2\n",
210
- }],
211
- }]
212
- }, {})
257
+ mock(d.instance.slack).post_message(default_payload.merge({
258
+ text: "sowawa1\nsowawa2\n",
259
+ }), {})
213
260
  with_timezone('Asia/Tokyo') do
214
261
  d.emit({message: 'sowawa1'}, time)
215
262
  d.emit({message: 'sowawa2'}, time)
@@ -225,16 +272,9 @@ class SlackOutputTest < Test::Unit::TestCase
225
272
  assert_equal Fluent::SlackClient::Slackbot, d.instance.slack.class
226
273
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
227
274
  d.tag = 'test'
228
- mock(d.instance.slack).post_message({
229
- channel: '#channel',
230
- username: 'fluentd',
231
- icon_emoji: ':question:',
232
- attachments: [{
233
- color: 'good',
234
- fallback: "sowawa1\nsowawa2\n",
235
- text: "sowawa1\nsowawa2\n",
236
- }]
237
- }, {})
275
+ mock(d.instance.slack).post_message(default_payload.merge({
276
+ text: "sowawa1\nsowawa2\n",
277
+ }), {})
238
278
  with_timezone('Asia/Tokyo') do
239
279
  d.emit({message: 'sowawa1'}, time)
240
280
  d.emit({message: 'sowawa2'}, time)
@@ -250,17 +290,69 @@ class SlackOutputTest < Test::Unit::TestCase
250
290
  assert_equal Fluent::SlackClient::WebApi, d.instance.slack.class
251
291
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
252
292
  d.tag = 'test'
253
- mock(d.instance.slack).post_message({
254
- token: 'XX-XX-XX',
255
- channel: '#channel',
256
- username: 'fluentd',
257
- icon_emoji: ':question:',
258
- attachments: [{
259
- color: 'good',
293
+ mock(d.instance.slack).post_message(default_payload.merge({
294
+ token: 'XX-XX-XX',
295
+ text: "sowawa1\nsowawa2\n",
296
+ }), {})
297
+ with_timezone('Asia/Tokyo') do
298
+ d.emit({message: 'sowawa1'}, time)
299
+ d.emit({message: 'sowawa2'}, time)
300
+ d.run
301
+ end
302
+ end
303
+
304
+ def test_title_payload
305
+ title = "mytitle"
306
+ d = create_driver(CONFIG + %[title #{title}])
307
+ time = Time.parse("2014-01-01 22:00:00 UTC").to_i
308
+ d.tag = 'test'
309
+ # attachments field should be changed to show the title
310
+ mock(d.instance.slack).post_message(default_payload.merge({
311
+ attachments: [default_attachment.merge({
312
+ fallback: title,
313
+ fields: [
314
+ {
315
+ title: title,
316
+ value: "sowawa1\nsowawa2\n",
317
+ }
318
+ ],
319
+ })]
320
+ }), {})
321
+ with_timezone('Asia/Tokyo') do
322
+ d.emit({message: 'sowawa1'}, time)
323
+ d.emit({message: 'sowawa2'}, time)
324
+ d.run
325
+ end
326
+ end
327
+
328
+ def test_color_payload
329
+ color = 'good'
330
+ d = create_driver(CONFIG + %[color #{color}])
331
+ time = Time.parse("2014-01-01 22:00:00 UTC").to_i
332
+ d.tag = 'test'
333
+ # attachments field should be changed to show the title
334
+ mock(d.instance.slack).post_message(default_payload.merge({
335
+ attachments: [default_attachment.merge({
336
+ color: color,
260
337
  fallback: "sowawa1\nsowawa2\n",
261
338
  text: "sowawa1\nsowawa2\n",
262
- }]
263
- }, {})
339
+ })]
340
+ }), {})
341
+ with_timezone('Asia/Tokyo') do
342
+ d.emit({message: 'sowawa1'}, time)
343
+ d.emit({message: 'sowawa2'}, time)
344
+ d.run
345
+ end
346
+ end
347
+
348
+ def test_plain_payload
349
+ d = create_driver(CONFIG)
350
+ time = Time.parse("2014-01-01 22:00:00 UTC").to_i
351
+ d.tag = 'test'
352
+ # attachments field should be changed to show the title
353
+ mock(d.instance.slack).post_message(default_payload.merge({
354
+ text: "sowawa1\nsowawa2\n",
355
+ }), {})
264
356
  with_timezone('Asia/Tokyo') do
265
357
  d.emit({message: 'sowawa1'}, time)
266
358
  d.emit({message: 'sowawa2'}, time)
@@ -269,26 +361,21 @@ class SlackOutputTest < Test::Unit::TestCase
269
361
  end
270
362
 
271
363
  def test_title_keys
272
- d = create_driver(CONFIG + %[title %s\ntitle_keys tag])
364
+ d = create_driver(CONFIG + %[title [%s] %s\ntitle_keys time,tag])
273
365
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
274
366
  d.tag = 'test'
275
367
  # attachments field should be changed to show the title
276
- mock(d.instance.slack).post_message({
277
- token: 'XXX-XXX-XXX',
278
- channel: '#channel',
279
- username: 'fluentd',
280
- icon_emoji: ':question:',
281
- attachments: [{
282
- color: 'good',
283
- fallback: d.tag,
368
+ mock(d.instance.slack).post_message(default_payload.merge({
369
+ attachments: [default_attachment.merge({
370
+ fallback: "[07:00:00] #{d.tag}",
284
371
  fields: [
285
372
  {
286
- title: d.tag,
373
+ title: "[07:00:00] #{d.tag}",
287
374
  value: "sowawa1\nsowawa2\n",
288
375
  }
289
376
  ],
290
- }]
291
- }, {})
377
+ })]
378
+ }), {})
292
379
  with_timezone('Asia/Tokyo') do
293
380
  d.emit({message: 'sowawa1'}, time)
294
381
  d.emit({message: 'sowawa2'}, time)
@@ -297,20 +384,12 @@ class SlackOutputTest < Test::Unit::TestCase
297
384
  end
298
385
 
299
386
  def test_message_keys
300
- d = create_driver(CONFIG + %[message %s %s\nmessage_keys tag,message])
387
+ d = create_driver(CONFIG + %[message [%s] %s %s\nmessage_keys time,tag,message])
301
388
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
302
389
  d.tag = 'test'
303
- mock(d.instance.slack).post_message({
304
- token: 'XXX-XXX-XXX',
305
- channel: '#channel',
306
- username: 'fluentd',
307
- icon_emoji: ':question:',
308
- attachments: [{
309
- color: 'good',
310
- fallback: "test sowawa1\ntest sowawa2\n",
311
- text: "test sowawa1\ntest sowawa2\n",
312
- }]
313
- }, {})
390
+ mock(d.instance.slack).post_message(default_payload.merge({
391
+ text: "[07:00:00] test sowawa1\n[07:00:00] test sowawa2\n",
392
+ }), {})
314
393
  with_timezone('Asia/Tokyo') do
315
394
  d.emit({message: 'sowawa1'}, time)
316
395
  d.emit({message: 'sowawa2'}, time)
@@ -322,28 +401,14 @@ class SlackOutputTest < Test::Unit::TestCase
322
401
  d = create_driver(CONFIG + %[channel %s\nchannel_keys channel])
323
402
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
324
403
  d.tag = 'test'
325
- mock(d.instance.slack).post_message({
326
- token: 'XXX-XXX-XXX',
327
- channel: '#channel1',
328
- username: 'fluentd',
329
- icon_emoji: ':question:',
330
- attachments: [{
331
- color: 'good',
332
- fallback: "sowawa1\n",
333
- text: "sowawa1\n",
334
- }]
335
- }, {})
336
- mock(d.instance.slack).post_message({
337
- token: 'XXX-XXX-XXX',
338
- channel: '#channel2',
339
- username: 'fluentd',
340
- icon_emoji: ':question:',
341
- attachments: [{
342
- color: 'good',
343
- fallback: "sowawa2\n",
344
- text: "sowawa2\n",
345
- }]
346
- }, {})
404
+ mock(d.instance.slack).post_message(default_payload.merge({
405
+ channel: '#channel1',
406
+ text: "sowawa1\n",
407
+ }), {})
408
+ mock(d.instance.slack).post_message(default_payload.merge({
409
+ channel: '#channel2',
410
+ text: "sowawa2\n",
411
+ }), {})
347
412
  with_timezone('Asia/Tokyo') do
348
413
  d.emit({message: 'sowawa1', channel: 'channel1'}, time)
349
414
  d.emit({message: 'sowawa2', channel: 'channel2'}, time)
@@ -355,17 +420,10 @@ class SlackOutputTest < Test::Unit::TestCase
355
420
  d = create_driver(CONFIG + %[icon_emoji :ghost:])
356
421
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
357
422
  d.tag = 'test'
358
- mock(d.instance.slack).post_message({
359
- token: 'XXX-XXX-XXX',
360
- channel: '#channel',
361
- username: 'fluentd',
362
- icon_emoji: ':ghost:',
363
- attachments: [{
364
- color: 'good',
365
- fallback: "foo\n",
366
- text: "foo\n",
367
- }]
368
- }, {})
423
+ mock(d.instance.slack).post_message(default_payload.merge({
424
+ icon_emoji: ':ghost:',
425
+ text: "foo\n",
426
+ }), {})
369
427
  with_timezone('Asia/Tokyo') do
370
428
  d.emit({message: 'foo'}, time)
371
429
  d.run
@@ -376,17 +434,10 @@ class SlackOutputTest < Test::Unit::TestCase
376
434
  d = create_driver(CONFIG + %[icon_url #{@icon_url}])
377
435
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
378
436
  d.tag = 'test'
379
- mock(d.instance.slack).post_message({
380
- token: 'XXX-XXX-XXX',
381
- channel: '#channel',
382
- username: 'fluentd',
383
- icon_url: @icon_url,
384
- attachments: [{
385
- color: 'good',
386
- fallback: "foo\n",
387
- text: "foo\n",
388
- }]
389
- }, {})
437
+ mock(d.instance.slack).post_message(default_payload.merge({
438
+ icon_url: @icon_url,
439
+ text: "foo\n",
440
+ }), {})
390
441
  with_timezone('Asia/Tokyo') do
391
442
  d.emit({message: 'foo'}, time)
392
443
  d.run
@@ -397,18 +448,56 @@ class SlackOutputTest < Test::Unit::TestCase
397
448
  d = create_driver(CONFIG + %[mrkdwn true])
398
449
  time = Time.parse("2014-01-01 22:00:00 UTC").to_i
399
450
  d.tag = 'test'
400
- mock(d.instance.slack).post_message({
401
- token: 'XXX-XXX-XXX',
402
- channel: '#channel',
403
- username: 'fluentd',
404
- icon_emoji: ':question:',
405
- attachments: [{
406
- color: 'good',
451
+ mock(d.instance.slack).post_message(default_payload.merge({
452
+ mrkdwn: true,
453
+ text: "foo\n",
454
+ }), {})
455
+ with_timezone('Asia/Tokyo') do
456
+ d.emit({message: 'foo'}, time)
457
+ d.run
458
+ end
459
+ end
460
+
461
+ def test_mrkdwn_in
462
+ d = create_driver(CONFIG + %[mrkdwn true\ncolor good])
463
+ time = Time.parse("2014-01-01 22:00:00 UTC").to_i
464
+ d.tag = 'test'
465
+ mock(d.instance.slack).post_message(default_payload.merge({
466
+ attachments: [default_attachment.merge({
467
+ color: "good",
407
468
  fallback: "foo\n",
408
469
  text: "foo\n",
409
470
  mrkdwn_in: ["text", "fields"],
410
- }]
411
- }, {})
471
+ })]
472
+ }), {})
473
+ with_timezone('Asia/Tokyo') do
474
+ d.emit({message: 'foo'}, time)
475
+ d.run
476
+ end
477
+ end
478
+
479
+ def test_link_names
480
+ d = create_driver(CONFIG + %[link_names true])
481
+ time = Time.parse("2014-01-01 22:00:00 UTC").to_i
482
+ d.tag = 'test'
483
+ mock(d.instance.slack).post_message(default_payload.merge({
484
+ link_names: true,
485
+ text: "foo\n",
486
+ }), {})
487
+ with_timezone('Asia/Tokyo') do
488
+ d.emit({message: 'foo'}, time)
489
+ d.run
490
+ end
491
+ end
492
+
493
+ def test_parse
494
+ d = create_driver(CONFIG + %[parse full])
495
+ time = Time.parse("2014-01-01 22:00:00 UTC").to_i
496
+ d.tag = 'test'
497
+ mock(d.instance.slack).post_message(default_payload.merge({
498
+ parse: "full",
499
+ text: "foo\n",
500
+ }), {})
412
501
  with_timezone('Asia/Tokyo') do
413
502
  d.emit({message: 'foo'}, time)
414
503
  d.run
@@ -10,10 +10,11 @@ require 'webrick/httpproxy'
10
10
  # Create .env file with contents as:
11
11
  #
12
12
  # WEBHOOK_URL=https://hooks.slack.com/services/XXXX/YYYY/ZZZZ
13
- # TOKEN=XXXXX
13
+ # SLACKBOt_URL=https://xxxx.slack.com/services/hooks/slackbot?token=XXXX
14
+ # SLACK_API_TOKEN=XXXXX
14
15
  #
15
16
  Dotenv.load
16
- if ENV['WEBHOOK_URL'] and ENV['SLACKBOT_URL'] and ENV['TOKEN']
17
+ if ENV['WEBHOOK_URL'] and ENV['SLACKBOT_URL'] and ENV['SLACK_API_TOKEN']
17
18
 
18
19
  class TestProxyServer
19
20
  def initialize
@@ -47,152 +48,148 @@ if ENV['WEBHOOK_URL'] and ENV['SLACKBOT_URL'] and ENV['TOKEN']
47
48
  end
48
49
 
49
50
  class SlackClientTest < Test::Unit::TestCase
51
+ class << self
52
+ attr_reader :proxy
53
+
54
+ def startup
55
+ @proxy = TestProxyServer.new.tap {|proxy| proxy.start }
56
+ end
57
+
58
+ def shutdown
59
+ @proxy.shutdown
60
+ end
61
+ end
62
+
50
63
  def setup
51
64
  super
52
65
  @incoming = Fluent::SlackClient::IncomingWebhook.new(ENV['WEBHOOK_URL'])
53
66
  @slackbot = Fluent::SlackClient::Slackbot.new(ENV['SLACKBOT_URL'])
54
67
  @api = Fluent::SlackClient::WebApi.new
55
68
 
56
- @proxy = TestProxyServer.new.tap {|proxy| proxy.start }
57
- @incoming_proxy = Fluent::SlackClient::IncomingWebhook.new(ENV['WEBHOOK_URL'], @proxy.proxy_url)
58
- @slackbot_proxy = Fluent::SlackClient::Slackbot.new(ENV['SLACKBOT_URL'], @proxy.proxy_url)
59
- @api_proxy = Fluent::SlackClient::WebApi.new(nil, @proxy.proxy_url)
69
+ proxy_url = self.class.proxy.proxy_url
70
+ @incoming_proxy = Fluent::SlackClient::IncomingWebhook.new(ENV['WEBHOOK_URL'], proxy_url)
71
+ @slackbot_proxy = Fluent::SlackClient::Slackbot.new(ENV['SLACKBOT_URL'], proxy_url)
72
+ @api_proxy = Fluent::SlackClient::WebApi.new(nil, proxy_url)
60
73
 
61
74
  @icon_url = 'http://www.google.com/s2/favicons?domain=www.google.de'
62
75
  end
63
76
 
64
- def teardown
65
- @proxy.shutdown
77
+ def token(client)
78
+ client.is_a?(Fluent::SlackClient::IncomingWebhook) ? {} : {token: ENV['SLACK_API_TOKEN']}
66
79
  end
67
80
 
68
- def token(client)
69
- client.is_a?(Fluent::SlackClient::IncomingWebhook) ? {} : {token: ENV['TOKEN']}
81
+ def default_payload(client)
82
+ {
83
+ channel: '#general',
84
+ mrkdwn: true,
85
+ link_names: true,
86
+ }.merge!(token(client))
70
87
  end
71
88
 
72
- def test_post_message_text
89
+ def default_attachment
90
+ {
91
+ mrkdwn_in: %w[text fields]
92
+ }
93
+ end
94
+
95
+ # Notification via Mention works for all three with plain text payload
96
+ def test_post_message_plain_payload_mention
73
97
  [@incoming, @slackbot, @api].each do |slack|
74
98
  assert_nothing_raised do
75
- slack.post_message(
76
- {
77
- channel: '#general',
78
- username: 'fluentd',
79
- icon_emoji: ':question:',
80
- attachments: [{
81
- color: 'good',
82
- fallback: "sowawa1\nsowawa2\n",
83
- text: "sowawa1\nsowawa2\n",
84
- }]
85
- }.merge(token(slack))
86
- )
99
+ slack.post_message(default_payload(slack).merge({
100
+ text: "#general @everyone\n",
101
+ }))
87
102
  end
88
103
  end
89
104
  end
90
105
 
91
- def test_post_message_fields
106
+ # Notification via Highlight Words works with only Slackbot with plain text payload
107
+ # NOTE: Please add `sowawa1` to Highlight Words
108
+ def test_post_message_plain_payload_highlight_words
92
109
  [@incoming, @slackbot, @api].each do |slack|
93
110
  assert_nothing_raised do
94
- slack.post_message(
95
- {
96
- channel: '#general',
97
- username: 'fluentd',
98
- icon_emoji: ':question:',
99
- attachments: [{
100
- color: 'good',
101
- fallback: 'test1 test2',
102
- fields: [
103
- {
104
- title: 'test1',
105
- value: "[07:00:00] sowawa1\n[07:00:00] sowawa2\n",
106
- },
107
- {
108
- title: 'test2',
109
- value: "[07:00:00] sowawa1\n[07:00:00] sowawa2\n",
110
- },
111
- ],
112
- }]
113
- }.merge(token(slack))
114
- )
111
+ slack.post_message(default_payload(slack).merge({
112
+ text: "sowawa1\n",
113
+ }))
115
114
  end
116
115
  end
117
116
  end
118
117
 
119
- def test_post_via_proxy
120
- [@incoming_proxy, @slackbot_proxy, @api_proxy].each do |slack|
118
+ # Notification via Mention does not work for attachments
119
+ def test_post_message_color_payload
120
+ [@incoming, @slackbot, @api].each do |slack|
121
121
  assert_nothing_raised do
122
- slack.post_message(
123
- {
124
- channel: '#general',
125
- username: 'fluentd',
126
- icon_emoji: ':question:',
127
- attachments: [{
128
- color: 'good',
129
- fallback: "sowawa1\nsowawa2\n",
130
- text: "sowawa1\nsowawa2\n",
131
- }]
132
- }.merge(token(slack))
133
- )
122
+ slack.post_message(default_payload(slack).merge({
123
+ attachments: [default_attachment.merge({
124
+ color: 'good',
125
+ fallback: "sowawa1\n@everyone\n",
126
+ text: "sowawa1\n@everyone\n",
127
+ })]
128
+ }))
134
129
  end
135
130
  end
136
131
  end
137
132
 
138
- def test_post_message_icon_url
139
- [@incoming, @api].each do |slack|
133
+ # Notification via Mention does not work for attachments
134
+ def test_post_message_fields_payload
135
+ [@incoming, @slackbot, @api].each do |slack|
136
+ assert_nothing_raised do
137
+ slack.post_message(default_payload(slack).merge({
138
+ attachments: [default_attachment.merge({
139
+ color: 'good',
140
+ fallback: 'test1 test2',
141
+ fields: [
142
+ {
143
+ title: 'test1',
144
+ value: "[07:00:00] sowawa1\n[07:00:00] @everyone\n",
145
+ },
146
+ {
147
+ title: 'test2',
148
+ value: "[07:00:00] sowawa1\n[07:00:00] @everyone\n",
149
+ },
150
+ ],
151
+ })]
152
+ }))
153
+ end
154
+ end
155
+ end
156
+
157
+ def test_post_via_proxy
158
+ [@incoming_proxy, @slackbot_proxy, @api_proxy].each do |slack|
140
159
  assert_nothing_raised do
141
- slack.post_message(
142
- {
143
- channel: '#general',
144
- username: 'fluentd',
145
- icon_url: @icon_url,
146
- attachments: [{
147
- color: 'good',
148
- fallback: "sowawa1\nsowawa2\n",
149
- text: "sowawa1\nsowawa2\n",
150
- }]
151
- }.merge(token(slack))
152
- )
160
+ slack.post_message(default_payload(slack).merge({
161
+ attachments: [default_attachment.merge({
162
+ color: 'good',
163
+ fallback: "sowawa1\n@everyone\n",
164
+ text: "sowawa1\n@everyone\n",
165
+ })]
166
+ }))
153
167
  end
154
168
  end
155
169
  end
156
170
 
157
- def test_post_message_text_mrkdwn
171
+ def test_post_message_username
158
172
  [@incoming, @api].each do |slack|
159
173
  assert_nothing_raised do
160
- slack.post_message(
161
- {
162
- channel: '#general',
163
- username: 'fluentd',
164
- attachments: [{
165
- color: 'good',
166
- fallback: "plain *bold* _italic_ `preformat`\n", # mrkdwn not work
167
- text: "plain *bold* _italic_ `preformat`\n",
168
- mrkdwn_in: ['text', 'fields'],
169
- }]
170
- }.merge(token(slack))
171
- )
174
+ slack.post_message(default_payload(slack).merge({
175
+ username: 'fluentd',
176
+ text: "#general @everyone\n",
177
+ }))
172
178
  end
173
179
  end
174
180
  end
175
181
 
176
- def test_post_message_fields_mrkdwn
182
+ def test_post_message_icon_url
177
183
  [@incoming, @api].each do |slack|
178
184
  assert_nothing_raised do
179
- slack.post_message(
180
- {
181
- channel: '#general',
182
- username: 'fluentd',
183
- attachments: [{
184
- color: 'good',
185
- fallback: "plain *bold* _italic_ `preformat`\n", # mrkdwn not work
186
- fields: [
187
- {
188
- title: 'plain *bold* _italic* `preformat`', # mrkdwn not work
189
- value: "plain *bold* _italic* `preformat`\n",
190
- },
191
- ],
192
- mrkdwn_in: ['text', 'fields'],
193
- }]
194
- }.merge(token(slack))
195
- )
185
+ slack.post_message(default_payload(slack).merge({
186
+ icon_url: @icon_url,
187
+ attachments: [default_attachment.merge({
188
+ color: 'good',
189
+ fallback: "sowawa1\n@everyone\n",
190
+ text: "sowawa1\n@everyone\n",
191
+ })]
192
+ }))
196
193
  end
197
194
  end
198
195
  end
@@ -201,11 +198,9 @@ if ENV['WEBHOOK_URL'] and ENV['SLACKBOT_URL'] and ENV['TOKEN']
201
198
  # but slack does not provide channels.delete API
202
199
  def test_channels_create
203
200
  begin
204
- @api.channels_create(
205
- {
206
- name: '#test_channels_create',
207
- }.merge(token(@api))
208
- )
201
+ @api.channels_create(token(@api).merge({
202
+ name: '#test_channels_create',
203
+ }))
209
204
  rescue Fluent::SlackClient::NameTakenError
210
205
  end
211
206
  end
@@ -214,17 +209,11 @@ if ENV['WEBHOOK_URL'] and ENV['SLACKBOT_URL'] and ENV['TOKEN']
214
209
  # but slack does not provide channels.delete API
215
210
  def test_auto_channels_create
216
211
  assert_nothing_raised do
217
- @api.post_message(
212
+ @api.post_message(default_payload(@api).merge(
218
213
  {
219
- channel: '#test_auto_api',
220
- username: 'fluentd',
221
- icon_emoji: ':question:',
222
- attachments: [{
223
- color: 'good',
224
- fallback: "bar\n",
225
- text: "bar\n",
226
- }]
227
- }.merge(token(@api)),
214
+ channel: '#test_auto_api',
215
+ text: "bar\n",
216
+ }),
228
217
  {
229
218
  auto_channels_create: true,
230
219
  }
@@ -232,17 +221,11 @@ if ENV['WEBHOOK_URL'] and ENV['SLACKBOT_URL'] and ENV['TOKEN']
232
221
  end
233
222
 
234
223
  assert_nothing_raised do
235
- @slackbot.post_message(
224
+ @slackbot.post_message(default_payload(@slackbot).merge(
236
225
  {
237
- channel: '#test_auto_slackbot',
238
- username: 'fluentd',
239
- icon_emoji: ':question:',
240
- attachments: [{
241
- color: 'good',
242
- fallback: "bar\n",
243
- text: "bar\n",
244
- }]
245
- }.merge(token(@api)),
226
+ channel: '#test_auto_slackbot',
227
+ text: "bar\n",
228
+ }),
246
229
  {
247
230
  auto_channels_create: true,
248
231
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-slack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keisuke SOGAWA
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-01 00:00:00.000000000 Z
12
+ date: 2015-04-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd