slack-notifier 1.5.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/slack-notifier.rb +35 -60
- data/lib/slack-notifier/config.rb +37 -0
- data/lib/slack-notifier/payload_middleware.rb +21 -0
- data/lib/slack-notifier/payload_middleware/base.rb +35 -0
- data/lib/slack-notifier/payload_middleware/format_attachments.rb +37 -0
- data/lib/slack-notifier/payload_middleware/format_message.rb +19 -0
- data/lib/slack-notifier/payload_middleware/stack.rb +35 -0
- data/lib/slack-notifier/util/escape.rb +15 -0
- data/lib/slack-notifier/util/http_client.rb +53 -0
- data/lib/slack-notifier/util/link_formatter.rb +63 -0
- data/lib/slack-notifier/version.rb +2 -1
- data/spec/end_to_end_spec.rb +84 -0
- data/spec/integration/ping_integration_test.rb +12 -5
- data/spec/lib/slack-notifier/config_spec.rb +71 -0
- data/spec/lib/slack-notifier/payload_middleware/base_spec.rb +75 -0
- data/spec/lib/slack-notifier/payload_middleware/format_attachments_spec.rb +35 -0
- data/spec/lib/slack-notifier/payload_middleware/format_message_spec.rb +26 -0
- data/spec/lib/slack-notifier/payload_middleware/stack_spec.rb +93 -0
- data/spec/lib/slack-notifier/payload_middleware_spec.rb +32 -0
- data/spec/lib/slack-notifier/util/http_client_spec.rb +34 -0
- data/spec/lib/slack-notifier/{link_formatter_spec.rb → util/link_formatter_spec.rb} +30 -19
- data/spec/lib/slack-notifier_spec.rb +62 -128
- data/spec/spec_helper.rb +20 -5
- metadata +30 -9
- data/lib/slack-notifier/default_http_client.rb +0 -51
- data/lib/slack-notifier/link_formatter.rb +0 -62
- data/spec/lib/slack-notifier/default_http_client_spec.rb +0 -37
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
RSpec.describe Slack::Notifier::Util::HTTPClient do
|
3
|
+
describe "::post" do
|
4
|
+
it "initializes Util::HTTPClient with the given uri and params then calls" do
|
5
|
+
http_post_double = instance_double("Slack::Notifier::Util::HTTPClient")
|
6
|
+
|
7
|
+
expect(described_class)
|
8
|
+
.to receive(:new).with("uri", "params")
|
9
|
+
.and_return(http_post_double)
|
10
|
+
expect(http_post_double).to receive(:call)
|
11
|
+
|
12
|
+
described_class.post "uri", "params"
|
13
|
+
end
|
14
|
+
|
15
|
+
# http_post is really tested in the integration spec,
|
16
|
+
# where the internals are run through
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#initialize" do
|
20
|
+
it "allows setting of options for Net::HTTP" do
|
21
|
+
net_http_double = instance_double("Net::HTTP")
|
22
|
+
http_client = described_class.new URI.parse("http://example.com"),
|
23
|
+
http_options: { open_timeout: 5 }
|
24
|
+
|
25
|
+
allow(Net::HTTP).to receive(:new).and_return(net_http_double)
|
26
|
+
allow(net_http_double).to receive(:use_ssl=)
|
27
|
+
allow(net_http_double).to receive(:request)
|
28
|
+
|
29
|
+
expect(net_http_double).to receive(:open_timeout=).with(5)
|
30
|
+
|
31
|
+
http_client.call
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,54 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
describe Slack::Notifier::LinkFormatter do
|
5
|
-
|
3
|
+
# rubocop:disable Metrics/LineLength
|
4
|
+
RSpec.describe Slack::Notifier::Util::LinkFormatter do
|
6
5
|
describe "::format" do
|
7
|
-
|
8
6
|
it "formats html links" do
|
9
7
|
formatted = described_class.format("Hello World, enjoy <a href='http://example.com'>this</a>.")
|
10
|
-
expect(
|
8
|
+
expect(formatted).to include("<http://example.com|this>")
|
11
9
|
end
|
12
10
|
|
13
11
|
it "formats markdown links" do
|
14
12
|
formatted = described_class.format("Hello World, enjoy [this](http://example.com).")
|
15
|
-
expect(
|
13
|
+
expect(formatted).to include("<http://example.com|this>")
|
16
14
|
end
|
17
15
|
|
18
16
|
it "formats markdown links in brackets" do
|
19
17
|
formatted = described_class.format("Hello World, enjoy [[this](http://example.com) in brackets].")
|
20
|
-
expect(
|
18
|
+
expect(formatted).to eq("Hello World, enjoy [<http://example.com|this> in brackets].")
|
21
19
|
end
|
22
20
|
|
23
21
|
it "formats markdown links with no title" do
|
24
22
|
formatted = described_class.format("Hello World, enjoy [](http://example.com).")
|
25
|
-
expect(
|
23
|
+
expect(formatted).to include("<http://example.com>")
|
26
24
|
end
|
27
25
|
|
28
26
|
it "handles multiple html links" do
|
29
27
|
formatted = described_class.format("Hello World, enjoy <a href='http://example.com'>this</a><a href='http://example2.com'>this2</a>.")
|
30
|
-
expect(
|
31
|
-
expect(
|
28
|
+
expect(formatted).to include("<http://example.com|this>")
|
29
|
+
expect(formatted).to include("<http://example2.com|this2>")
|
32
30
|
end
|
33
31
|
|
34
32
|
it "handles multiple markdown links" do
|
35
33
|
formatted = described_class.format("Hello World, enjoy [this](http://example.com)[this2](http://example2.com).")
|
36
|
-
expect(
|
37
|
-
expect(
|
34
|
+
expect(formatted).to include("<http://example.com|this>")
|
35
|
+
expect(formatted).to include("<http://example2.com|this2>")
|
38
36
|
end
|
39
37
|
|
40
38
|
it "handles mixed html & markdown links" do
|
41
39
|
formatted = described_class.format("Hello World, enjoy [this](http://example.com)<a href='http://example2.com'>this2</a>.")
|
42
|
-
expect(
|
43
|
-
expect(
|
40
|
+
expect(formatted).to include("<http://example.com|this>")
|
41
|
+
expect(formatted).to include("<http://example2.com|this2>")
|
44
42
|
end
|
45
43
|
|
46
44
|
if "".respond_to? :scrub
|
47
45
|
context "when on ruby 2.1+ or have string-scrub installed" do
|
48
46
|
it "handles invalid unicode sequences" do
|
49
|
-
expect
|
47
|
+
expect do
|
50
48
|
described_class.format("This sequence is invalid: \255")
|
51
|
-
|
49
|
+
end.not_to raise_error
|
52
50
|
end
|
53
51
|
|
54
52
|
it "replaces invalid unicode sequences with the unicode replacement character" do
|
@@ -58,7 +56,7 @@ describe Slack::Notifier::LinkFormatter do
|
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|
61
|
-
it
|
59
|
+
it 'doesn\'t replace valid Japanese' do
|
62
60
|
formatted = described_class.format("こんにちは")
|
63
61
|
expect(formatted).to eq "こんにちは"
|
64
62
|
end
|
@@ -73,6 +71,19 @@ describe Slack::Notifier::LinkFormatter do
|
|
73
71
|
expect(formatted).to eq "<mailto:john@example.com|John>"
|
74
72
|
end
|
75
73
|
|
74
|
+
context "with a configured stack" do
|
75
|
+
it "only formats html if html is the only item in formats" do
|
76
|
+
formatted = described_class.format("Hello World, enjoy [this](http://example.com)<a href='http://example2.com'>this2</a>.", formats: [:html])
|
77
|
+
expect(formatted).to eq "Hello World, enjoy [this](http://example.com)<http://example2.com|this2>."
|
78
|
+
end
|
79
|
+
it "only formats markdown if markdown is the only item in formats" do
|
80
|
+
formatted = described_class.format("Hello World, enjoy [this](http://example.com)<a href='http://example2.com'>this2</a>.", formats: [:markdown])
|
81
|
+
expect(formatted).to eq "Hello World, enjoy <http://example.com|this><a href='http://example2.com'>this2</a>."
|
82
|
+
end
|
83
|
+
it "doesn't format if formats is empty" do
|
84
|
+
formatted = described_class.format("Hello World, enjoy [this](http://example.com)<a href='http://example2.com'>this2</a>.", formats: [])
|
85
|
+
expect(formatted).to eq "Hello World, enjoy [this](http://example.com)<a href='http://example2.com'>this2</a>."
|
86
|
+
end
|
87
|
+
end
|
76
88
|
end
|
77
|
-
|
78
89
|
end
|
@@ -1,163 +1,97 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
describe Slack::Notifier do
|
4
|
-
|
3
|
+
RSpec.describe Slack::Notifier do
|
4
|
+
let(:mock_http) do
|
5
|
+
class_double("Slack::Notifier::Util::HTTPClient", post: :posted)
|
6
|
+
end
|
7
|
+
|
8
|
+
subject { described_class.new "http://example.com", http_client: mock_http }
|
5
9
|
|
6
10
|
describe "#initialize" do
|
7
11
|
it "sets the given hook_url to the endpoint URI" do
|
8
|
-
expect(
|
12
|
+
expect(subject.endpoint).to eq URI.parse("http://example.com")
|
9
13
|
end
|
10
14
|
|
11
15
|
it "sets the default_payload options" do
|
12
|
-
subject = described_class.new
|
13
|
-
expect(
|
16
|
+
subject = described_class.new "http://example.com", channel: "foo"
|
17
|
+
expect(subject.config.defaults[:channel]).to eq "foo"
|
14
18
|
end
|
15
19
|
|
16
20
|
it "sets a custom http client" do
|
17
|
-
|
18
|
-
subject
|
19
|
-
expect( subject.http_client ).to eq client
|
21
|
+
subject = described_class.new "http://example.com", http_client: mock_http
|
22
|
+
expect(subject.config.http_client).to eq mock_http
|
20
23
|
end
|
21
|
-
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
describe "when given a block" do
|
26
|
+
it "yields the config object" do
|
27
|
+
test_double = double("Slack::Notifier::Config", defaults: {}, middleware: [])
|
28
|
+
allow_any_instance_of(Slack::Notifier).to receive(:config).and_return(test_double)
|
27
29
|
|
28
|
-
|
29
|
-
expect( Slack::Notifier::LinkFormatter ).to receive(:format)
|
30
|
-
.with("the message")
|
30
|
+
expect(test_double).to receive(:test_init_method).with("foo")
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
expect( Slack::Notifier::LinkFormatter ).to receive(:format)
|
37
|
-
.with("the message")
|
38
|
-
expect( Slack::Notifier::LinkFormatter ).to receive(:format)
|
39
|
-
.with("attachment message")
|
40
|
-
|
41
|
-
described_class.new('http://example.com').ping "the message", channel: 'foo',
|
42
|
-
attachments: [{
|
43
|
-
color: "#000",
|
44
|
-
text: "attachment message",
|
45
|
-
fallback: "fallback message"
|
46
|
-
}]
|
32
|
+
described_class.new "http://example.com" do
|
33
|
+
test_init_method "foo"
|
34
|
+
end
|
35
|
+
end
|
47
36
|
end
|
37
|
+
end
|
48
38
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
)
|
54
|
-
|
55
|
-
expect{
|
56
|
-
described_class.new('http://example.com')
|
57
|
-
.ping channel: 'foo',
|
58
|
-
attachments: [{
|
59
|
-
text: 'attachment',
|
60
|
-
fallback: 'fallback'
|
61
|
-
}]
|
62
|
-
}.not_to raise_error
|
63
|
-
end
|
39
|
+
describe "#ping" do
|
40
|
+
it "calls #post with the message as the text key in #post" do
|
41
|
+
subject = described_class.new "http://example.com"
|
42
|
+
expect(subject).to receive(:post).with text: "message"
|
64
43
|
|
65
|
-
|
66
|
-
expect( Slack::Notifier::LinkFormatter ).to receive(:format)
|
67
|
-
.with("a random message")
|
68
|
-
expect( Slack::Notifier::LinkFormatter ).to receive(:format)
|
69
|
-
.with("attachment message")
|
70
|
-
attachment = {
|
71
|
-
color: "#000",
|
72
|
-
text: "attachment message",
|
73
|
-
fallback: "fallback message"
|
74
|
-
}
|
75
|
-
subject.ping "a random message", attachments: attachment
|
44
|
+
subject.ping "message"
|
76
45
|
end
|
46
|
+
end
|
77
47
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
it "does not require a channel to ping" do
|
88
|
-
expect{
|
89
|
-
subject.ping "the message"
|
90
|
-
}.not_to raise_error
|
91
|
-
end
|
92
|
-
|
93
|
-
it "uses default channel" do
|
94
|
-
expect( Slack::Notifier::DefaultHTTPClient ).to receive(:post)
|
95
|
-
.with @endpoint_double,
|
96
|
-
payload: '{"channel":"#default","text":"the message"}'
|
97
|
-
|
98
|
-
subject.ping "the message"
|
48
|
+
describe "#post" do
|
49
|
+
def notifier_with_defaults
|
50
|
+
mock_client = mock_http
|
51
|
+
described_class.new "http://example.com" do
|
52
|
+
defaults channel: "default",
|
53
|
+
user: "rocket"
|
54
|
+
http_client mock_client
|
99
55
|
end
|
56
|
+
end
|
100
57
|
|
101
|
-
|
102
|
-
|
103
|
-
.with @endpoint_double,
|
104
|
-
payload: '{"channel":"new","text":"the message"}'
|
58
|
+
it "uses the defaults set on initialization" do
|
59
|
+
subject = notifier_with_defaults
|
105
60
|
|
106
|
-
|
107
|
-
|
61
|
+
expect(mock_http).to receive(:post).with(
|
62
|
+
URI.parse("http://example.com"),
|
63
|
+
payload: '{"channel":"default","user":"rocket","text":"hello"}'
|
64
|
+
)
|
108
65
|
|
66
|
+
subject.post text: "hello"
|
109
67
|
end
|
110
68
|
|
111
|
-
|
112
|
-
|
113
|
-
@endpoint_double = instance_double "URI::HTTP"
|
114
|
-
allow( URI ).to receive(:parse)
|
115
|
-
.with("http://example.com")
|
116
|
-
.and_return(@endpoint_double)
|
69
|
+
it "allows overriding the set defaults" do
|
70
|
+
subject = notifier_with_defaults
|
117
71
|
|
118
|
-
|
119
|
-
|
120
|
-
|
72
|
+
expect(mock_http).to receive(:post).with(
|
73
|
+
URI.parse("http://example.com"),
|
74
|
+
payload: '{"channel":"new","user":"ship","text":"hello"}'
|
75
|
+
)
|
121
76
|
|
122
|
-
|
123
|
-
end
|
77
|
+
subject.post text: "hello", channel: "new", user: "ship"
|
124
78
|
end
|
125
79
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
.with("http://example.com")
|
131
|
-
.and_return(endpoint_double)
|
132
|
-
client = double("CustomClient")
|
133
|
-
expect( client ).to receive(:post)
|
134
|
-
.with endpoint_double,
|
135
|
-
payload: '{"text":"the message"}'
|
136
|
-
|
137
|
-
described_class.new('http://example.com',http_client: client).ping "the message"
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
80
|
+
it "calls the middleware stack with the payload" do
|
81
|
+
subject = notifier_with_defaults
|
82
|
+
stack = instance_double("Slack::Notifier::PayloadMiddleware::Stack")
|
83
|
+
subject.instance_variable_set(:@middleware, stack)
|
141
84
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
expect( subject.channel ).to eq "#foo"
|
146
|
-
end
|
147
|
-
end
|
85
|
+
expect(stack).to receive(:call)
|
86
|
+
.with(channel: "default", user: "rocket")
|
87
|
+
.and_return(test: "stack")
|
148
88
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
end
|
154
|
-
end
|
89
|
+
expect(mock_http).to receive(:post).with(
|
90
|
+
URI.parse("http://example.com"),
|
91
|
+
payload: '{"test":"stack"}'
|
92
|
+
)
|
155
93
|
|
156
|
-
|
157
|
-
it "escapes sequences of < > &, but not quotes" do
|
158
|
-
message = %q(I've heard "Do > with <" & that sounds ridiculous.)
|
159
|
-
expected = %q(I've heard "Do > with <" & that sounds ridiculous.)
|
160
|
-
expect( subject.escape(message) ).to eq expected
|
94
|
+
subject.post
|
161
95
|
end
|
162
96
|
end
|
163
97
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,28 @@
|
|
1
|
-
|
2
|
-
require 'slack-notifier'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
require "rspec"
|
4
|
+
require "slack-notifier"
|
5
|
+
require "pry" if ENV["DEBUG"]
|
7
6
|
|
8
7
|
RSpec.configure do |config|
|
8
|
+
config.expect_with :rspec do |expectations|
|
9
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
10
|
+
end
|
11
|
+
|
9
12
|
config.mock_with :rspec do |mocks|
|
10
13
|
mocks.verify_doubled_constant_names = true
|
11
14
|
mocks.verify_partial_doubles = true
|
12
15
|
end
|
16
|
+
|
17
|
+
config.filter_run :focus
|
18
|
+
config.run_all_when_everything_filtered = true
|
19
|
+
config.disable_monkey_patching!
|
20
|
+
|
21
|
+
config.example_status_persistence_file_path = "spec/examples.txt"
|
22
|
+
config.warnings = ENV["DEBUG"] ? false : true
|
23
|
+
|
24
|
+
config.default_formatter = "doc" if config.files_to_run.one?
|
25
|
+
|
26
|
+
config.order = :random
|
27
|
+
Kernel.srand config.seed
|
13
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack-notifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Sloan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: " A slim ruby wrapper for posting to slack webhooks "
|
14
14
|
email:
|
@@ -18,12 +18,26 @@ extensions: []
|
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
20
|
- lib/slack-notifier.rb
|
21
|
-
- lib/slack-notifier/
|
22
|
-
- lib/slack-notifier/
|
21
|
+
- lib/slack-notifier/config.rb
|
22
|
+
- lib/slack-notifier/payload_middleware.rb
|
23
|
+
- lib/slack-notifier/payload_middleware/base.rb
|
24
|
+
- lib/slack-notifier/payload_middleware/format_attachments.rb
|
25
|
+
- lib/slack-notifier/payload_middleware/format_message.rb
|
26
|
+
- lib/slack-notifier/payload_middleware/stack.rb
|
27
|
+
- lib/slack-notifier/util/escape.rb
|
28
|
+
- lib/slack-notifier/util/http_client.rb
|
29
|
+
- lib/slack-notifier/util/link_formatter.rb
|
23
30
|
- lib/slack-notifier/version.rb
|
31
|
+
- spec/end_to_end_spec.rb
|
24
32
|
- spec/integration/ping_integration_test.rb
|
25
|
-
- spec/lib/slack-notifier/
|
26
|
-
- spec/lib/slack-notifier/
|
33
|
+
- spec/lib/slack-notifier/config_spec.rb
|
34
|
+
- spec/lib/slack-notifier/payload_middleware/base_spec.rb
|
35
|
+
- spec/lib/slack-notifier/payload_middleware/format_attachments_spec.rb
|
36
|
+
- spec/lib/slack-notifier/payload_middleware/format_message_spec.rb
|
37
|
+
- spec/lib/slack-notifier/payload_middleware/stack_spec.rb
|
38
|
+
- spec/lib/slack-notifier/payload_middleware_spec.rb
|
39
|
+
- spec/lib/slack-notifier/util/http_client_spec.rb
|
40
|
+
- spec/lib/slack-notifier/util/link_formatter_spec.rb
|
27
41
|
- spec/lib/slack-notifier_spec.rb
|
28
42
|
- spec/spec_helper.rb
|
29
43
|
homepage: http://github.com/stevenosloan/slack-notifier
|
@@ -46,13 +60,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
46
60
|
version: '0'
|
47
61
|
requirements: []
|
48
62
|
rubyforge_project:
|
49
|
-
rubygems_version: 2.
|
63
|
+
rubygems_version: 2.5.2
|
50
64
|
signing_key:
|
51
65
|
specification_version: 4
|
52
66
|
summary: A slim ruby wrapper for posting to slack webhooks
|
53
67
|
test_files:
|
68
|
+
- spec/end_to_end_spec.rb
|
54
69
|
- spec/integration/ping_integration_test.rb
|
55
|
-
- spec/lib/slack-notifier/
|
56
|
-
- spec/lib/slack-notifier/
|
70
|
+
- spec/lib/slack-notifier/config_spec.rb
|
71
|
+
- spec/lib/slack-notifier/payload_middleware/base_spec.rb
|
72
|
+
- spec/lib/slack-notifier/payload_middleware/format_attachments_spec.rb
|
73
|
+
- spec/lib/slack-notifier/payload_middleware/format_message_spec.rb
|
74
|
+
- spec/lib/slack-notifier/payload_middleware/stack_spec.rb
|
75
|
+
- spec/lib/slack-notifier/payload_middleware_spec.rb
|
76
|
+
- spec/lib/slack-notifier/util/http_client_spec.rb
|
77
|
+
- spec/lib/slack-notifier/util/link_formatter_spec.rb
|
57
78
|
- spec/lib/slack-notifier_spec.rb
|
58
79
|
- spec/spec_helper.rb
|