state_machines-rspec 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe StateMachinesRspec::Matchers::RejectStateMatcher do
4
+ describe '#matches?' do
5
+ context 'when :on state machines attribute is specified' do
6
+ before { @matcher = described_class.new([:supportive, on: :environment]) }
7
+ context 'but that state machines doesn\'t exist' do
8
+ before { @class = Class.new }
9
+ it 'raises' do
10
+ expect { @matcher.matches? @class.new }.to raise_error
11
+ end
12
+ end
13
+
14
+ context 'and that state machines exists' do
15
+ context 'but it defines states which match one of the specified states' do
16
+ before do
17
+ @class = Class.new do
18
+ state_machine :environment, initial: :supportive
19
+ end
20
+ end
21
+
22
+ it 'sets a failure message' do
23
+ @matcher.matches? @class.new
24
+ expect(@matcher.failure_message).to eq('Did not expect environment to allow states: supportive')
25
+ end
26
+ it 'returns false' do
27
+ expect(@matcher.matches?(@class.new)).to be_falsey
28
+ end
29
+ end
30
+
31
+ context 'and it does not define any of the states specified' do
32
+ before do
33
+ @class = Class.new do
34
+ state_machine :environment, initial: :conducive
35
+ end
36
+ end
37
+
38
+ it 'does not set a failure message' do
39
+ @matcher.matches? @class.new
40
+ expect(@matcher.failure_message).to be_nil
41
+ end
42
+ it 'returns true' do
43
+ expect(@matcher.matches?(@class.new)).to be_truthy
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ context 'when :on state machines is not specified' do
50
+ before { @matcher = described_class.new([:ever_changing]) }
51
+ context 'but the default state machines defines states which match one of the specified states' do
52
+ before do
53
+ @class = Class.new do
54
+ state_machine initial: :ever_changing
55
+ end
56
+ end
57
+
58
+ it 'sets a failure message' do
59
+ @matcher.matches? @class.new
60
+ expect(@matcher.failure_message).to eq('Did not expect state to allow states: ever_changing')
61
+ end
62
+ it 'returns false' do
63
+ expect(@matcher.matches?(@class.new)).to be_falsey
64
+ end
65
+ end
66
+
67
+ context 'and the default state machines does not define any of the states specified' do
68
+ before { @class = Class.new }
69
+ it 'does not set a failure message' do
70
+ @matcher.matches? @class.new
71
+ expect(@matcher.failure_message).to be_nil
72
+ end
73
+ it 'returns true' do
74
+ expect(@matcher.matches?(@class.new)).to be_truthy
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ describe '#description' do
81
+ context 'with no options' do
82
+ let(:matcher) { described_class.new([:mustard, :tomatoes]) }
83
+
84
+ it 'returns a string description' do
85
+ expect(matcher.description).to eq('not have :mustard, :tomatoes')
86
+ end
87
+ end
88
+
89
+ context 'when :on state machines is specified' do
90
+ let(:matcher) { described_class.new([:peanut_butter, on: :toast]) }
91
+
92
+ it 'mentions the state machines variable' do
93
+ expect(matcher.description).to eq('not have :peanut_butter on :toast')
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,177 @@
1
+ require 'spec_helper'
2
+
3
+ describe StateMachinesRspec::Matchers::HandleTransitionFromMatcher do
4
+ describe '#matches?' do
5
+ context 'when :from states and :on_event is specified but the :to_state doesn\'t exist' do
6
+ before do
7
+ matcher_class = Class.new do
8
+ state_machine :state, initial: :mathy do
9
+ event(:mathematize) { transition any => same }
10
+ end
11
+ end
12
+ @matcher_subject = matcher_class.new
13
+ @matcher = described_class.new(:mathy, on_event: :mathematize)
14
+ end
15
+
16
+ it 'raises' do
17
+ expect { @matcher.matches? @matcher_subject }
18
+ .to raise_error StateMachinesIntrospectorError, 'Option :to_state cannot be nil'
19
+ end
20
+ end
21
+
22
+ context 'when :from states and :to_state is specified but the :on_event doesn\'t exist' do
23
+ before do
24
+ matcher_class = Class.new do
25
+ state_machine :state, initial: :mathy do
26
+ state :polynomial
27
+
28
+ event(:mathematize) { transition any => same }
29
+ end
30
+ end
31
+ @matcher_subject = matcher_class.new
32
+ @matcher = described_class.new(:mathy, to_state: :polynomial)
33
+ end
34
+
35
+ it 'raises' do
36
+ expect { @matcher.matches? @matcher_subject }
37
+ .to raise_error StateMachinesIntrospectorError, 'Option :on_event cannot be nil'
38
+ end
39
+ end
40
+
41
+ context 'when :from states, :to_state and :on_event is specified' do
42
+ context 'and :to_state doesn\'t defined' do
43
+ before do
44
+ matcher_class = Class.new do
45
+ state_machine :state, initial: :mathy do
46
+ state :artsy
47
+
48
+ event(:mathematize) { transition any => same }
49
+ end
50
+ end
51
+ @matcher_subject = matcher_class.new
52
+ @matcher = described_class.new(:mathy, to_state: :polynomial, on_event: :mathematize)
53
+ end
54
+
55
+ it 'raise' do
56
+ expect { @matcher.matches? @matcher_subject }
57
+ .to raise_error StateMachinesIntrospectorError, "#{@matcher_subject.class} does not define state: polynomial"
58
+ end
59
+ end
60
+
61
+ context 'and :on_event doesn\'t defined' do
62
+ before do
63
+ matcher_class = Class.new do
64
+ state_machine :state, initial: :mathy do
65
+ state :artsy
66
+
67
+ event(:mathematize) { transition any => same }
68
+ end
69
+ end
70
+ @matcher_subject = matcher_class.new
71
+ @matcher = described_class.new(:mathy, to_state: :arsty, on_event: :algebraify)
72
+ end
73
+
74
+ it 'raise' do
75
+ expect { @matcher.matches? @matcher_subject }
76
+ .to raise_error StateMachinesIntrospectorError, "#{@matcher_subject.class} does not define event :algebraify"
77
+ end
78
+ end
79
+
80
+ context 'and from state doesn\'t defined' do
81
+ before do
82
+ matcher_class = Class.new do
83
+ state_machine :state, initial: :mathy do
84
+ state :artsy
85
+
86
+ event(:mathematize) { transition any => same }
87
+ end
88
+ end
89
+ @matcher_subject = matcher_class.new
90
+ @matcher = described_class.new(:polynomial, to_state: :arsty, on_event: :mathematize)
91
+ end
92
+
93
+ it 'raise' do
94
+ expect { @matcher.matches? @matcher_subject }
95
+ .to raise_error StateMachinesIntrospectorError, "#{@matcher_subject.class} does not define state: polynomial"
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'when subject can perform transition' do
101
+ before do
102
+ matcher_class = Class.new do
103
+ state_machine :mathiness, initial: :mathy do
104
+ state :polynomial
105
+
106
+ event(:algebraify) { transition polynomial: :mathy }
107
+ end
108
+ end
109
+ @matcher_subject = matcher_class.new
110
+ @matcher = described_class.new(:polynomial, to_state: :mathy, on_event: :algebraify, on: :mathiness)
111
+ end
112
+
113
+ it 'does not set a failure message' do
114
+ @matcher.matches? @matcher_subject
115
+ expect(@matcher.failure_message).to be_nil
116
+ end
117
+ it 'returns true' do
118
+ expect(@matcher.matches?(@matcher_subject)).to be_truthy
119
+ end
120
+ end
121
+
122
+ context 'when subject cannot perform events' do
123
+ before do
124
+ matcher_class = Class.new do
125
+ state_machine :state, initial: :mathy do
126
+ state :polynomial
127
+
128
+ event(:algebraify) { transition polynomial: same }
129
+ event(:trigonomalize) { transition trigonomalize: same }
130
+ end
131
+ end
132
+ @matcher_subject = matcher_class.new
133
+ end
134
+
135
+ context 'because it cannot perform the event' do
136
+ before do
137
+ @matcher = described_class.new(:mathy, to_state: :polynomial, on_event: :algebraify)
138
+ end
139
+
140
+ it 'sets a failure message' do
141
+ @matcher.matches? @matcher_subject
142
+ expect(@matcher.failure_message).to eq('Expected to be able to transition state from: ' \
143
+ 'mathy to: polynomial, on_event: algebraify')
144
+ end
145
+ it 'returns false' do
146
+ expect(@matcher.matches?(@matcher_subject)).to be_falsey
147
+ end
148
+ end
149
+ end
150
+
151
+ describe '#description' do
152
+ context 'with one from state' do
153
+ let(:matcher) { described_class.new(:mathy, to_state: :polynomial, on_event: :trigonomalize) }
154
+
155
+ it 'returns a string description' do
156
+ expect(matcher.description).to eq('transition state to :polynomial from :mathy on event :trigonomalize')
157
+ end
158
+ end
159
+
160
+ context 'when multiple from states' do
161
+ let(:matcher) { described_class.new(:mathy, :arsty, to_state: :polynomial, on_event: :trigonomalize) }
162
+
163
+ it 'mentions the requisite state' do
164
+ expect(matcher.description).to eq('transition state to :polynomial from :mathy, :arsty on event :trigonomalize')
165
+ end
166
+ end
167
+
168
+ context 'when :on is specified' do
169
+ let(:matcher) { described_class.new(:mathy, to_state: :polynomial, on_event: :trigonomalize, on: :mathiness) }
170
+
171
+ it 'mentions the state machines variable' do
172
+ expect(matcher.description).to eq('transition state to :polynomial from :mathy on event :trigonomalize on :mathiness')
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,12 @@
1
+ require 'state_machines'
2
+ require 'state_machines_rspec'
3
+ require 'timecop'
4
+ require 'rspec/its'
5
+
6
+ RSpec.configure do |config|
7
+ config.run_all_when_everything_filtered = true
8
+ config.filter_run :focus
9
+ config.order = 'random'
10
+
11
+ config.include StateMachinesRspec::Matchers
12
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'state_machines_rspec/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'state_machines-rspec'
8
+ spec.version = StateMachinesRspec::VERSION
9
+ spec.authors = ['JohnSmall', 'modocache']
10
+ spec.email = ['jds340@gmail.com', 'modocache@gmail.com']
11
+ spec.description = %q{ RSpec matchers for state_machines. Forked from modocache/state_machine_rspec to work with state-machines/state_machines (https://github.com/state-machines/state_machines)}
12
+ spec.summary = %q{ RSpec matchers for state-machines/state_machines. }
13
+ spec.homepage = 'http://github.com/state-machines/state_machines-rspec'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.test_files = spec.files.grep(%r{^(spec)/})
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_dependency 'rspec', '~>3.3'
21
+ spec.add_dependency 'state_machines'
22
+ spec.add_dependency 'activesupport'
23
+
24
+ spec.add_development_dependency 'bundler'
25
+ spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'timecop'
27
+ spec.add_development_dependency 'guard-rspec'
28
+ spec.add_development_dependency 'rb-fsevent'
29
+ spec.add_development_dependency 'terminal-notifier-guard'
30
+ spec.add_development_dependency 'rspec-its'
31
+ spec.add_development_dependency 'awesome_print'
32
+ end
metadata ADDED
@@ -0,0 +1,237 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: state_machines-rspec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - JohnSmall
8
+ - modocache
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-06-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3.3'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3.3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: state_machines
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: activesupport
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: timecop
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: guard-rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rb-fsevent
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: terminal-notifier-guard
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: rspec-its
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: awesome_print
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ description: " RSpec matchers for state_machines. Forked from modocache/state_machine_rspec
169
+ to work with state-machines/state_machines (https://github.com/state-machines/state_machines)"
170
+ email:
171
+ - jds340@gmail.com
172
+ - modocache@gmail.com
173
+ executables: []
174
+ extensions: []
175
+ extra_rdoc_files: []
176
+ files:
177
+ - ".gitignore"
178
+ - ".rspec"
179
+ - ".ruby-version"
180
+ - CHANGELOG.md
181
+ - Gemfile
182
+ - Guardfile
183
+ - LICENSE.txt
184
+ - README.md
185
+ - Rakefile
186
+ - lib/matchers/events/handle_event.rb
187
+ - lib/matchers/events/matcher.rb
188
+ - lib/matchers/events/reject_event.rb
189
+ - lib/matchers/states/have_state.rb
190
+ - lib/matchers/states/matcher.rb
191
+ - lib/matchers/states/reject_state.rb
192
+ - lib/matchers/transitions/transition_from.rb
193
+ - lib/state_machines_rspec.rb
194
+ - lib/state_machines_rspec/state_machines_introspector.rb
195
+ - lib/state_machines_rspec/version.rb
196
+ - spec/integration/integration_spec.rb
197
+ - spec/integration/models/vehicle.rb
198
+ - spec/matchers/events/handle_event_spec.rb
199
+ - spec/matchers/events/reject_event_spec.rb
200
+ - spec/matchers/states/have_state_spec.rb
201
+ - spec/matchers/states/reject_state_spec.rb
202
+ - spec/matchers/transitions/transition_from_spec.rb
203
+ - spec/spec_helper.rb
204
+ - state_machines-rspec.gemspec
205
+ homepage: http://github.com/state-machines/state_machines-rspec
206
+ licenses:
207
+ - MIT
208
+ metadata: {}
209
+ post_install_message:
210
+ rdoc_options: []
211
+ require_paths:
212
+ - lib
213
+ required_ruby_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ required_rubygems_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ requirements: []
224
+ rubyforge_project:
225
+ rubygems_version: 2.6.11
226
+ signing_key:
227
+ specification_version: 4
228
+ summary: RSpec matchers for state-machines/state_machines.
229
+ test_files:
230
+ - spec/integration/integration_spec.rb
231
+ - spec/integration/models/vehicle.rb
232
+ - spec/matchers/events/handle_event_spec.rb
233
+ - spec/matchers/events/reject_event_spec.rb
234
+ - spec/matchers/states/have_state_spec.rb
235
+ - spec/matchers/states/reject_state_spec.rb
236
+ - spec/matchers/transitions/transition_from_spec.rb
237
+ - spec/spec_helper.rb