slack_message 1.8.0 → 1.8.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 455886af2c6e775c37db510da7d5003abd131711107e9a18af2e10a714f9c154
4
- data.tar.gz: '029d322491f3e63df60cd61eb2c6528132cce722a4ca0fa2db47fd790702fa04'
3
+ metadata.gz: 94e7433c5374c318cd955ad43f6a02705b62876498253c4e7587a7ba5ae5277f
4
+ data.tar.gz: 0ca96c1266c9dc55af30c6df7f07e2ea86a64bc5fad99258a10efe10e4127e9b
5
5
  SHA512:
6
- metadata.gz: dd4bc35189956140e5409d1d2e325e2cb6b9423e23fbcb6f81399281b10e4447b8c1bed8e8447f7dac59b5282e9c39b4907231225f0858abe6116fe9419b9269
7
- data.tar.gz: d91718d74c17d0b1c79485de6311a70a579b1f80916c4328afa813800735b12d29e1069cfdc1721f1954839a6b55d25c0fa292ed41d02350ac0c1665a3475aa2
6
+ metadata.gz: 2f4c15c91c6a7741c1f387b820cc36689cd7530233e9582fb3db73407d9f39eb69656a071b65789cd33ec359d5fa1478efe212336a3834202c30f96269885895
7
+ data.tar.gz: ed86a645c481c0c91510acedc5b0abd2bf3923f9ea33e9a23671db0e107005c07f64a1dfc52f4f5f47f826630712756bd5ce43ddfd06622a10ed24afa7731465
data/CHANGELOG.md CHANGED
@@ -2,8 +2,11 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.8.1] - 2021-10-08
6
+ - Cleaned that rspec code a bit, added more matchers for real world use.
7
+
5
8
  ## [1.8.0] - 2021-10-07
6
- - Added the ability to test in RSpec
9
+ - Added the ability to test in RSpec.
7
10
 
8
11
  ## [1.7.1] - 2021-10-06
9
12
  - Fixed literally a syntax issue.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- slack_message (1.7.1)
4
+ slack_message (1.8.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -4,6 +4,15 @@ require 'rspec/mocks'
4
4
  # Honestly, this code is what happens when you do not understand the RSpec
5
5
  # custom expectation API really at all, but you really want to create your
6
6
  # matcher. This code is soo baaad.
7
+ #
8
+ # We override API calls by entirely replacing the low-level API method. Then we
9
+ # use our overridden version to capture and record calls. When someone creates
10
+ # a new expectation, an object is created, so we allow that object to register
11
+ # itself to receive notification when a slack message _would have_ been posted.
12
+ #
13
+ # Then once the expectation is fulfilled, that class unregisters itself so that
14
+ # it can be cleaned up properly.
15
+ #
7
16
 
8
17
  module SlackMessage::RSpec
9
18
  extend RSpec::Matchers::DSL
@@ -31,6 +40,7 @@ module SlackMessage::RSpec
31
40
  end
32
41
  end
33
42
 
43
+ # w/ channel
34
44
  matcher :post_slack_message_to do |expected|
35
45
  match do |actual|
36
46
  @instance ||= PostTo.new
@@ -40,9 +50,50 @@ module SlackMessage::RSpec
40
50
  @instance.enforce_expectations
41
51
  end
42
52
 
43
- chain :with_content_matching do |content_expectation|
53
+ chain :with_content_matching do |content|
44
54
  @instance ||= PostTo.new
45
- @instance.with_content_matching(content_expectation)
55
+ @instance.with_content_matching(content)
56
+ end
57
+
58
+ failure_message { @instance.failure_message }
59
+ failure_message_when_negated { @instance.failure_message_when_negated }
60
+
61
+ supports_block_expectations
62
+ end
63
+
64
+ # no channel
65
+ matcher :post_to_slack do |expected|
66
+ match do |actual|
67
+ @instance ||= PostTo.new
68
+
69
+ actual.call
70
+ @instance.enforce_expectations
71
+ end
72
+
73
+ chain :with_content_matching do |content|
74
+ @instance ||= PostTo.new
75
+ @instance.with_content_matching(content)
76
+ end
77
+
78
+ failure_message { @instance.failure_message }
79
+ failure_message_when_negated { @instance.failure_message_when_negated }
80
+
81
+ supports_block_expectations
82
+ end
83
+
84
+ # name / profile matcher
85
+ matcher :post_slack_message_as do |expected|
86
+ match do |actual|
87
+ @instance ||= PostTo.new
88
+ @instance.with_profile(expected)
89
+
90
+ actual.call
91
+ @instance.enforce_expectations
92
+ end
93
+
94
+ chain :with_content_matching do |content|
95
+ @instance ||= PostTo.new
96
+ @instance.with_content_matching(content)
46
97
  end
47
98
 
48
99
  failure_message { @instance.failure_message }
@@ -54,8 +105,9 @@ module SlackMessage::RSpec
54
105
  class PostTo
55
106
  def initialize
56
107
  @captured_calls = []
57
- @content_expectation = nil
108
+ @content = nil
58
109
  @channel = nil
110
+ @profile = nil
59
111
 
60
112
  SlackMessage::RSpec.register_expectation_listener(self)
61
113
  end
@@ -68,41 +120,49 @@ module SlackMessage::RSpec
68
120
  @channel = channel
69
121
  end
70
122
 
71
- def with_content_matching(content_expectation)
72
- raise ArgumentError unless content_expectation.is_a? Regexp
73
- @content_expectation = content_expectation
123
+ def with_content_matching(content)
124
+ raise ArgumentError unless content.is_a? Regexp
125
+ @content = content
126
+ end
127
+
128
+ def with_profile(profile)
129
+ @profile = profile
74
130
  end
75
131
 
76
132
  def enforce_expectations
77
133
  SlackMessage::RSpec.unregister_expectation_listener(self)
78
- matching_messages.any? { |msg| body_matches_expectation?(msg.fetch(:blocks)) }
79
- end
80
134
 
81
- def matching_messages
82
- @captured_calls.select { |c| c[:channel] == @channel }
135
+ @captured_calls
136
+ .filter { |call| !@channel || call[:channel] == @channel }
137
+ .filter { |call| !@profile || [call[:profile], call[:username]].include?(@profile) }
138
+ .filter { |call| !@content || call.fetch(:blocks).to_s =~ @content }
139
+ .any?
83
140
  end
84
141
 
85
- def body_matches_expectation?(sent)
86
- return true unless @content_expectation
142
+ def failure_message
143
+ "expected block to #{failure_expression}"
144
+ end
87
145
 
88
- sent.to_s =~ @content_expectation
146
+ def failure_message_when_negated
147
+ "expected block not to #{failure_expression}"
89
148
  end
90
149
 
91
- def failure_message
92
- if @content_expectation
93
- "expected block to post slack message to '#{@channel}' with content matching #{@content_expectation.inspect}"
150
+ def failure_expression
151
+ concat = []
152
+
153
+ if @channel
154
+ concat << "post a slack message to '#{@channel}'"
155
+ elsif @profile
156
+ concat << "post a slack message as '#{@profile}'"
94
157
  else
95
- "expected block to post slack message to '#{@channel}'"
158
+ concat << "post a slack message"
96
159
  end
97
- end
98
160
 
99
- # TODO: does content_matching even make sense for negated test?
100
- def failure_message_when_negated
101
- if @content_expectation
102
- "expected block not to post slack message to '#{@channel}' with content matching #{@content_expectation.inspect}"
103
- else
104
- "expected block not to post slack message to '#{@channel}'"
161
+ if @content
162
+ concat << "with content matching #{@content.inspect}"
105
163
  end
164
+
165
+ concat.join " "
106
166
  end
107
167
  end
108
168
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'slack_message'
3
- gem.version = "1.8.0"
3
+ gem.version = "1.8.1"
4
4
  gem.summary = "A nice DSL for composing rich messages in Slack"
5
5
  gem.authors = ["Joe Mastey"]
6
6
  gem.email = 'hello@joemastey.com'
@@ -46,7 +46,7 @@ RSpec.describe SlackMessage do
46
46
 
47
47
  it "raises errors for missing configuration" do
48
48
  SlackMessage.configure do |config|
49
- #config.api_token = "abc123"
49
+ config.api_token = nil
50
50
  end
51
51
 
52
52
  expect {
@@ -87,12 +87,36 @@ RSpec.describe SlackMessage do
87
87
  }.to post_slack_message_to('#general').with_content_matching(/foo/)
88
88
  end
89
89
 
90
- it "is not stateful" do
90
+ it "resets state properly" do
91
91
  expect {
92
92
  SlackMessage.post_to('#general') { text "foo" }
93
93
  }.to post_slack_message_to('#general')
94
94
 
95
95
  expect { }.not_to post_slack_message_to('#general')
96
96
  end
97
+
98
+ it "lets you assert by profile name" do
99
+ SlackMessage.configure do |config|
100
+ config.add_profile(:schmoebot, name: 'Schmoe', url: 'http://hooks.slack.com/1234/', default_channel: '#schmoes')
101
+ end
102
+
103
+ expect {
104
+ SlackMessage.post_as(:schmoebot) { text "foo" }
105
+ }.to post_slack_message_to('#schmoes')
106
+
107
+ expect {
108
+ SlackMessage.post_as(:schmoebot) { text "foo" }
109
+ }.to post_slack_message_as(:schmoebot)
110
+
111
+ expect {
112
+ SlackMessage.post_as(:schmoebot) { text "foo" }
113
+ }.to post_slack_message_as('Schmoe').with_content_matching(/foo/)
114
+ end
115
+
116
+ it "can assert more generally too tbh" do
117
+ expect {
118
+ SlackMessage.post_to('#general') { text "foo" }
119
+ }.to post_to_slack.with_content_matching(/foo/)
120
+ end
97
121
  end
98
122
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack_message
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Mastey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-07 00:00:00.000000000 Z
11
+ date: 2021-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec