wisper-rspec 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +2 -0
- data/README.md +18 -1
- data/lib/wisper/rspec/matchers.rb +41 -7
- data/lib/wisper/rspec/version.rb +1 -1
- data/spec/wisper/rspec/matchers_spec.rb +26 -3
- data/spec/wisper/rspec/old_matcher_spec.rb +9 -0
- data/spec/wisper/rspec/unit/broadcast_matcher_spec.rb +72 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 643aca16e7e08f43376f456256d0cfc5a4cb2621
|
4
|
+
data.tar.gz: aee3c2ee2e11a253f1dae2796340e0e8ed5474de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f0b3ed5f0bbccbd7ab38de8d59985d5f60ade1dad5990fd57886c0e5401ee45ab2b2bcb55d08516b47c8dfe3ed19f039c4e736e56e5f2639d33a3ca87443cd8
|
7
|
+
data.tar.gz: 9d06774d7b55f981b1e908fdb61618fab9af01a006c10864fc9f72afcde01f4c353d1526264ce8bfd25af79da9637f4acf0c2b9436b9b8cadf334319b334f2e1
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -39,9 +39,26 @@ expect { publisher.execute }.to broadcast(:another_event, :arg_1, :arg_2)
|
|
39
39
|
|
40
40
|
With event arguments, it matches only if the event is broadcast with those arguments. This assertion matches `broadcast(:another_event, :arg_1, :arg_2)` but not `broadcast(:another_event)`.
|
41
41
|
|
42
|
+
```ruby
|
43
|
+
# with arguments matcher
|
44
|
+
expect { publisher.execute }.to broadcast(:event, hash_including(a: 2))
|
45
|
+
```
|
42
46
|
|
47
|
+
Rspec values matcher can be used to match arguments. This assertion matches `broadcast(:another_event, a: 2, b: 1)` but not `broadcast(:another_event, a: 3)`
|
48
|
+
|
49
|
+
Matchers can be composed using [compound rspec matchers](http://www.rubydoc.info/gems/rspec-expectations/RSpec/Matchers/Composable):
|
43
50
|
|
44
|
-
|
51
|
+
```ruby
|
52
|
+
expect {
|
53
|
+
publisher.execute(123)
|
54
|
+
publisher.execute(234)
|
55
|
+
}.to broadcast(:event, 123).and broadcast(:event, 234)
|
56
|
+
|
57
|
+
expect {
|
58
|
+
publisher.execute(123)
|
59
|
+
publisher.execute(234)
|
60
|
+
}.to broadcast(:event, 123).or broadcast(:event, 234)
|
61
|
+
```
|
45
62
|
|
46
63
|
### Using message expections
|
47
64
|
|
@@ -1,8 +1,12 @@
|
|
1
1
|
require 'rspec/expectations'
|
2
|
+
require 'rspec/mocks/argument_list_matcher'
|
2
3
|
|
3
4
|
module Wisper
|
4
5
|
module RSpec
|
5
6
|
class EventRecorder
|
7
|
+
include ::RSpec::Mocks::ArgumentMatchers
|
8
|
+
attr_reader :broadcast_events
|
9
|
+
|
6
10
|
def initialize
|
7
11
|
@broadcast_events = []
|
8
12
|
end
|
@@ -16,16 +20,18 @@ module Wisper
|
|
16
20
|
end
|
17
21
|
|
18
22
|
def broadcast?(event_name, *args)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
expected_args = args.size > 0 ? args : [any_args]
|
24
|
+
@broadcast_events.any? do |event_params|
|
25
|
+
matcher = ::RSpec::Mocks::ArgumentListMatcher.new(event_name.to_s, *expected_args)
|
26
|
+
matcher.args_match?(*event_params)
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
31
|
module BroadcastMatcher
|
28
32
|
class Matcher
|
33
|
+
include ::RSpec::Matchers::Composable
|
34
|
+
|
29
35
|
def initialize(event, *args)
|
30
36
|
@event = event
|
31
37
|
@args = args
|
@@ -36,18 +42,19 @@ module Wisper
|
|
36
42
|
end
|
37
43
|
|
38
44
|
def matches?(block)
|
39
|
-
event_recorder = EventRecorder.new
|
45
|
+
@event_recorder = EventRecorder.new
|
40
46
|
|
41
|
-
Wisper.subscribe(event_recorder) do
|
47
|
+
Wisper.subscribe(@event_recorder) do
|
42
48
|
block.call
|
43
49
|
end
|
44
50
|
|
45
|
-
event_recorder.broadcast?(@event, *@args)
|
51
|
+
@event_recorder.broadcast?(@event, *@args)
|
46
52
|
end
|
47
53
|
|
48
54
|
def failure_message
|
49
55
|
msg = "expected publisher to broadcast #{@event} event"
|
50
56
|
msg += " with args: #{@args.inspect}" if @args.size > 0
|
57
|
+
msg << broadcast_events_list
|
51
58
|
msg
|
52
59
|
end
|
53
60
|
|
@@ -56,6 +63,22 @@ module Wisper
|
|
56
63
|
msg += " with args: #{@args.inspect}" if @args.size > 0
|
57
64
|
msg
|
58
65
|
end
|
66
|
+
|
67
|
+
def broadcast_events_list
|
68
|
+
if @event_recorder.broadcast_events.any?
|
69
|
+
" (actual events broadcast: #{event_names.join(', ')})"
|
70
|
+
else
|
71
|
+
" (no events broadcast)"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
private :broadcast_events_list
|
75
|
+
|
76
|
+
def event_names
|
77
|
+
@event_recorder.broadcast_events.map do |event|
|
78
|
+
event.size == 1 ? event[0] : "#{event[0]}(#{event[1..-1].join(", ")})"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
private :event_names
|
59
82
|
end
|
60
83
|
|
61
84
|
def broadcast(event, *args)
|
@@ -63,4 +86,15 @@ module Wisper
|
|
63
86
|
end
|
64
87
|
end
|
65
88
|
end
|
89
|
+
|
90
|
+
# Prior to being extracted from Wisper the matcher was namespaced as Rspec,
|
91
|
+
# it is now RSpec. This will raise a helpful message for those upgrading to
|
92
|
+
# Wisper 2.0
|
93
|
+
module Rspec
|
94
|
+
module BroadcastMatcher
|
95
|
+
def self.included(base)
|
96
|
+
raise 'Please include Wisper::RSpec::BroadcastMatcher instead of Wisper::Rspec::BroadcastMatcher (notice the capitalization of RSpec)'
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
66
100
|
end
|
data/lib/wisper/rspec/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../../../lib/wisper/rspec/matchers'
|
2
2
|
|
3
3
|
RSpec::configure do |config|
|
4
4
|
config.include(Wisper::RSpec::BroadcastMatcher)
|
@@ -6,13 +6,13 @@ end
|
|
6
6
|
|
7
7
|
describe 'broadcast matcher' do
|
8
8
|
let(:publisher_class) { Class.new { include Wisper::Publisher } }
|
9
|
-
let(:publisher)
|
9
|
+
let(:publisher) { publisher_class.new }
|
10
10
|
|
11
11
|
it 'passes when publisher broadcasts inside block' do
|
12
12
|
expect { publisher.send(:broadcast, :foobar) }.to broadcast(:foobar)
|
13
13
|
end
|
14
14
|
|
15
|
-
context
|
15
|
+
context 'with arguments' do
|
16
16
|
it 'passes when publisher broadcasts inside block' do
|
17
17
|
expect { publisher.send(:broadcast, :fizzbuzz, 12345) }.to broadcast(:fizzbuzz, 12345)
|
18
18
|
end
|
@@ -21,11 +21,34 @@ describe 'broadcast matcher' do
|
|
21
21
|
expect { publisher.send(:broadcast, :fizzbuzz, 12345) }.to broadcast(:fizzbuzz)
|
22
22
|
end
|
23
23
|
|
24
|
+
it 'passes with rspect arguments matchers' do
|
25
|
+
expect { publisher.send(:broadcast, :fizzbuzz, 12345) }.to broadcast(:fizzbuzz, kind_of(Numeric))
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'fails with rspec arguments matchers' do
|
29
|
+
expect { publisher.send(:broadcast, :fizzbuzz, 12345) }.to_not broadcast(:fizzbuzz, kind_of(Hash))
|
30
|
+
end
|
31
|
+
|
24
32
|
it 'fails with incorrect arguments when publisher broadcasts inside block' do
|
25
33
|
expect { publisher.send(:broadcast, :fizzbuzz, 12345) }.not_to broadcast(:fizzbuzz, 98765)
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
37
|
+
context 'with compound assertions' do
|
38
|
+
it 'passes when both values are expected' do
|
39
|
+
expect {
|
40
|
+
publisher.send(:broadcast, :fizzbuzz, 12345)
|
41
|
+
publisher.send(:broadcast, :fizzbuzz, 54321)
|
42
|
+
}.to broadcast(:fizzbuzz, 12345).and broadcast(:fizzbuzz, 54321)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'passes when either value is expected' do
|
46
|
+
expect {
|
47
|
+
publisher.send(:broadcast, :fizzbuzz, 54321)
|
48
|
+
}.to broadcast(:fizzbuzz, 12345).or broadcast(:fizzbuzz, 54321)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
29
52
|
it 'passes with not_to when publisher does not broadcast inside block' do
|
30
53
|
expect { publisher }.not_to broadcast(:foobar)
|
31
54
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require_relative '../../../lib/wisper/rspec/matchers'
|
2
|
+
|
3
|
+
describe 'including mis-capitalized matcher' do
|
4
|
+
it 'raises an exception' do
|
5
|
+
expect do
|
6
|
+
Class.new.send(:include, Wisper::Rspec::BroadcastMatcher)
|
7
|
+
end.to raise_error(/include Wisper::RSpec::BroadcastMatcher instead of/)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'wisper'
|
2
|
+
require_relative '../../../../lib/wisper/rspec/matchers'
|
3
|
+
|
4
|
+
describe Wisper::RSpec::BroadcastMatcher::Matcher do
|
5
|
+
let(:event_name) { 'it_happened' }
|
6
|
+
let(:matcher) { described_class.new(event_name) }
|
7
|
+
|
8
|
+
let(:broadcaster) do
|
9
|
+
Class.new do
|
10
|
+
include Wisper.publisher
|
11
|
+
|
12
|
+
public :broadcast
|
13
|
+
end.new
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'matching event broadcast' do
|
17
|
+
let(:block) do
|
18
|
+
Proc.new do
|
19
|
+
broadcaster.broadcast(event_name)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#matches?' do
|
24
|
+
it 'returns true' do
|
25
|
+
expect(matcher.matches?(block)).to be_truthy
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'no events broadcast' do
|
31
|
+
let(:block) { Proc.new {} }
|
32
|
+
|
33
|
+
describe '#matches?' do
|
34
|
+
it 'returns false' do
|
35
|
+
expect(matcher.matches?(block)).to be_falsey
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#failure_message' do
|
40
|
+
before { matcher.matches?(block) }
|
41
|
+
|
42
|
+
it 'has descriptive failure message' do
|
43
|
+
expect(matcher.failure_message).to eq "expected publisher to broadcast #{event_name} event (no events broadcast)"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'non-matching event broadcast' do
|
49
|
+
let(:block) do
|
50
|
+
Proc.new do
|
51
|
+
broadcaster.broadcast('event1')
|
52
|
+
broadcaster.send(:broadcast, 'event2', 12345, :foo)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#matches?' do
|
57
|
+
it 'returns false' do
|
58
|
+
expect(matcher.matches?(block)).to be_falsey
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#failure_message' do
|
63
|
+
before { matcher.matches?(block) }
|
64
|
+
|
65
|
+
it 'has descriptive failure message' do
|
66
|
+
message = "expected publisher to broadcast it_happened event "\
|
67
|
+
"(actual events broadcast: event1, event2(12345, foo))"
|
68
|
+
expect(matcher.failure_message).to eq(message)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wisper-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kris Leech
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: wisper
|
@@ -75,6 +75,7 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- ".gitignore"
|
77
77
|
- ".rspec"
|
78
|
+
- ".ruby-version"
|
78
79
|
- ".travis.yml"
|
79
80
|
- CHANGELOG.md
|
80
81
|
- Gemfile
|
@@ -87,7 +88,9 @@ files:
|
|
87
88
|
- lib/wisper/rspec/version.rb
|
88
89
|
- spec/spec_helper.rb
|
89
90
|
- spec/wisper/rspec/matchers_spec.rb
|
91
|
+
- spec/wisper/rspec/old_matcher_spec.rb
|
90
92
|
- spec/wisper/rspec/stub_wisper_publisher_spec.rb
|
93
|
+
- spec/wisper/rspec/unit/broadcast_matcher_spec.rb
|
91
94
|
- wisper-rspec.gemspec
|
92
95
|
homepage: https://github.com/krisleech/wisper-rspec
|
93
96
|
licenses:
|
@@ -109,11 +112,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
112
|
version: '0'
|
110
113
|
requirements: []
|
111
114
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.
|
115
|
+
rubygems_version: 2.5.1
|
113
116
|
signing_key:
|
114
117
|
specification_version: 4
|
115
118
|
summary: Rspec matchers and stubbing for Wisper
|
116
119
|
test_files:
|
117
120
|
- spec/spec_helper.rb
|
118
121
|
- spec/wisper/rspec/matchers_spec.rb
|
122
|
+
- spec/wisper/rspec/old_matcher_spec.rb
|
119
123
|
- spec/wisper/rspec/stub_wisper_publisher_spec.rb
|
124
|
+
- spec/wisper/rspec/unit/broadcast_matcher_spec.rb
|