call_center 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -12,6 +12,9 @@ group :development do
12
12
  gem 'mocha'
13
13
  gem 'bourne'
14
14
  gem 'pre-commit'
15
+ gem 'minitest', '2.6.1'
16
+ gem 'minitest-reporters', :require => 'minitest/reporters'
17
+ gem 'guard-shell'
15
18
  end
16
19
 
17
20
  gem 'builder'
data/Gemfile.lock CHANGED
@@ -5,6 +5,7 @@ GEM
5
5
  activesupport (= 2.3.12)
6
6
  rack (~> 1.1.0)
7
7
  activesupport (2.3.12)
8
+ ansi (1.3.0)
8
9
  bourne (1.0)
9
10
  mocha (= 0.9.8)
10
11
  builder (3.0.0)
@@ -13,6 +14,8 @@ GEM
13
14
  git (1.2.5)
14
15
  guard (0.7.0)
15
16
  thor (~> 0.14.6)
17
+ guard-shell (0.1.1)
18
+ guard (>= 0.2.0)
16
19
  guard-test (0.3.0)
17
20
  guard (>= 0.2.2)
18
21
  test-unit (~> 2.2)
@@ -21,6 +24,11 @@ GEM
21
24
  bundler (~> 1.0)
22
25
  git (>= 1.2.5)
23
26
  rake
27
+ minitest (2.6.1)
28
+ minitest-reporters (0.4.0)
29
+ ansi
30
+ minitest (~> 2.0)
31
+ ruby-progressbar
24
32
  mocha (0.9.8)
25
33
  rake
26
34
  multi_json (1.0.3)
@@ -29,6 +37,7 @@ GEM
29
37
  rack (1.1.2)
30
38
  rake (0.9.2)
31
39
  rcov (0.9.9)
40
+ ruby-progressbar (0.0.10)
32
41
  shoulda (2.11.3)
33
42
  test-unit (2.3.0)
34
43
  thor (0.14.6)
@@ -42,9 +51,12 @@ DEPENDENCIES
42
51
  builder
43
52
  bundler (~> 1.0.0)
44
53
  guard
54
+ guard-shell
45
55
  guard-test
46
56
  hsume2-state_machine (~> 1.0.5)
47
57
  jeweler (~> 1.6.4)
58
+ minitest (= 2.6.1)
59
+ minitest-reporters
48
60
  mocha
49
61
  pre-commit
50
62
  rcov
@@ -0,0 +1,9 @@
1
+ def run_tests
2
+ system("ruby minitest/run.rb")
3
+ end
4
+
5
+ guard 'shell' do
6
+ watch(%r{^lib/(.+)\.rb$}) { run_tests }
7
+ watch(%r{^minitest/.+_test\.rb$}) { run_tests }
8
+ watch('minitest/helper.rb') { run_tests }
9
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
data/call_center.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{call_center}
8
- s.version = "0.0.4"
8
+ s.version = "0.0.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Henry Hsu"]
12
- s.date = %q{2011-10-23}
12
+ s.date = %q{2011-10-24}
13
13
  s.description = %q{Support for describing call center workflows}
14
14
  s.email = %q{hhsu@zendesk.com}
15
15
  s.extra_rdoc_files = [
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  "Gemfile",
23
23
  "Gemfile.lock",
24
24
  "Guardfile",
25
+ "Guardfile.minitest",
25
26
  "LICENSE.txt",
26
27
  "README.md",
27
28
  "Rakefile",
@@ -33,6 +34,10 @@ Gem::Specification.new do |s|
33
34
  "lib/call_center/flow_callback.rb",
34
35
  "lib/call_center/state_machine_ext.rb",
35
36
  "lib/call_center/test/dsl.rb",
37
+ "lib/call_center/test/minitest/dsl.rb",
38
+ "minitest/call_center/test/minitest_test.rb",
39
+ "minitest/helper.rb",
40
+ "minitest/run.rb",
36
41
  "test/call_center_test.rb",
37
42
  "test/core_ext_test.rb",
38
43
  "test/examples/call.rb",
@@ -64,6 +69,9 @@ Gem::Specification.new do |s|
64
69
  s.add_development_dependency(%q<mocha>, [">= 0"])
65
70
  s.add_development_dependency(%q<bourne>, [">= 0"])
66
71
  s.add_development_dependency(%q<pre-commit>, [">= 0"])
72
+ s.add_development_dependency(%q<minitest>, ["= 2.6.1"])
73
+ s.add_development_dependency(%q<minitest-reporters>, [">= 0"])
74
+ s.add_development_dependency(%q<guard-shell>, [">= 0"])
67
75
  else
68
76
  s.add_dependency(%q<builder>, [">= 0"])
69
77
  s.add_dependency(%q<hsume2-state_machine>, ["~> 1.0.5"])
@@ -78,6 +86,9 @@ Gem::Specification.new do |s|
78
86
  s.add_dependency(%q<mocha>, [">= 0"])
79
87
  s.add_dependency(%q<bourne>, [">= 0"])
80
88
  s.add_dependency(%q<pre-commit>, [">= 0"])
89
+ s.add_dependency(%q<minitest>, ["= 2.6.1"])
90
+ s.add_dependency(%q<minitest-reporters>, [">= 0"])
91
+ s.add_dependency(%q<guard-shell>, [">= 0"])
81
92
  end
82
93
  else
83
94
  s.add_dependency(%q<builder>, [">= 0"])
@@ -93,6 +104,9 @@ Gem::Specification.new do |s|
93
104
  s.add_dependency(%q<mocha>, [">= 0"])
94
105
  s.add_dependency(%q<bourne>, [">= 0"])
95
106
  s.add_dependency(%q<pre-commit>, [">= 0"])
107
+ s.add_dependency(%q<minitest>, ["= 2.6.1"])
108
+ s.add_dependency(%q<minitest-reporters>, [">= 0"])
109
+ s.add_dependency(%q<guard-shell>, [">= 0"])
96
110
  end
97
111
  end
98
112
 
@@ -0,0 +1,224 @@
1
+ require 'action_controller/vendor/html-scanner'
2
+ require 'action_controller/assertions/selector_assertions'
3
+ require 'test/unit/assertions'
4
+
5
+ module CallCenter
6
+ module Test
7
+ module MiniTest
8
+ module DSL
9
+ class ItShouldFlow
10
+ def initialize(context, &block)
11
+ @context = context
12
+ self.instance_eval(&block)
13
+ verify
14
+ end
15
+
16
+ def on(event)
17
+ @event = event
18
+ self
19
+ end
20
+
21
+ def from(from_state)
22
+ @from = from_state.to_s
23
+ self
24
+ end
25
+
26
+ def to(to_state)
27
+ @to = to_state.to_s
28
+ self
29
+ end
30
+
31
+ class Expectation
32
+ attr_reader :name
33
+
34
+ def initialize(name)
35
+ @name = name
36
+ end
37
+
38
+ def setup(object)
39
+ raise 'Implement in subclass'
40
+ end
41
+ end
42
+
43
+ class Expects < Expectation
44
+ def initialize(name, &blk)
45
+ super(name)
46
+ @expectation_block = blk
47
+ end
48
+
49
+ def setup(object)
50
+ mocka = object.expects(name)
51
+ @expectation_block.call(mocka) if @expectation_block
52
+ end
53
+ end
54
+
55
+ class Stubs < Expects
56
+ def setup(object)
57
+ mocka = object.stubs(name)
58
+ @expectation_block.call(mocka) if @expectation_block
59
+ end
60
+ end
61
+
62
+ class Condition < Expectation
63
+
64
+ end
65
+
66
+ class IfCondition < Expectation
67
+ def setup(object)
68
+ object.stubs(name).returns(true)
69
+ end
70
+ end
71
+
72
+ class UnlessCondition < Expectation
73
+ def setup(object)
74
+ object.stubs(name).returns(false)
75
+ end
76
+ end
77
+
78
+ def expects(method_name, &blk)
79
+ @expectations ||= []
80
+ @expectations << Expects.new(method_name, &blk)
81
+ self
82
+ end
83
+
84
+ def stubs(method_name, &blk)
85
+ @expectations ||= []
86
+ @expectations << Stubs.new(method_name, &blk)
87
+ self
88
+ end
89
+
90
+ def if(condition)
91
+ @expectations ||= []
92
+ @expectations << IfCondition.new(condition)
93
+ self
94
+ end
95
+
96
+ def unless(condition)
97
+ @expectations ||= []
98
+ @expectations << UnlessCondition.new(condition)
99
+ self
100
+ end
101
+
102
+ def restubs(object, *without)
103
+ without = [without].flatten
104
+ s_m = object.class.current_state_machine
105
+ stub_methods = (after_transition_methods(s_m) | if_and_unless_conditions(s_m)).uniq - without
106
+ object.reset_mocha
107
+ stub_methods.each do |m|
108
+ object.stubs(m)
109
+ end
110
+ end
111
+
112
+ def after_transition_methods(s_m)
113
+ s_m.callbacks.values.flatten.map { |c| c.instance_variable_get(:@methods) }.flatten.select { |m| m.is_a?(Symbol) }
114
+ end
115
+
116
+ def if_and_unless_conditions(s_m)
117
+ branches = s_m.events.map(&:branches).flatten
118
+ branches.map(&:if_condition).compact | branches.map(&:unless_condition).compact
119
+ end
120
+
121
+ def verify
122
+ event, from, to = @event, @from, @to
123
+ expectations = @expectations || []
124
+ helper = self
125
+ @context.it(description) do
126
+ helper.restubs(subject, expectations.map(&:name))
127
+ expectations.each do |expectation|
128
+ expectation.setup(subject)
129
+ end
130
+ state_field = defined?(call_center_state_field) ? call_center_state_field.to_sym : :state
131
+ subject.send(:"#{state_field}=", from)
132
+ subject.send(:"#{event}!")
133
+ subject.send(state_field).must_equal(to)
134
+ end
135
+ end
136
+
137
+ private
138
+
139
+ def description
140
+ "should flow on ##{@event}! from :#{@from} to :#{@to}"
141
+ end
142
+ end
143
+
144
+ class ItShouldRender < ItShouldFlow
145
+ def is(state)
146
+ @state = state
147
+ self
148
+ end
149
+
150
+ class Assertion
151
+ def initialize(*args)
152
+ @args = args
153
+ end
154
+
155
+ def setup(context)
156
+ context.assert_select(*@args)
157
+ end
158
+ end
159
+
160
+ def selects(selector, matcher = nil)
161
+ @assertions ||= []
162
+ @assertions << Assertion.new(selector, matcher)
163
+ self
164
+ end
165
+
166
+ def verify
167
+ state = @state
168
+ expectations = @expectations || []
169
+ assertions = @assertions || []
170
+ helper = self
171
+ @context.it(description) do
172
+ helper.restubs(subject, expectations.map(&:name))
173
+ expectations.each do |expectation|
174
+ expectation.setup(subject)
175
+ end
176
+ state_field = defined?(call_center_state_field) ? call_center_state_field.to_sym : :state
177
+ subject.send(:"#{state_field}=", state)
178
+ body(subject.render)
179
+ assertions.each do |assertion|
180
+ assertion.setup(self)
181
+ end
182
+ end
183
+ end
184
+
185
+ private
186
+
187
+ def description
188
+ "should render when :#{@state}"
189
+ end
190
+ end
191
+
192
+ if defined?(::MiniTest::Spec)
193
+ ::MiniTest::Spec.class_eval do
194
+ include ActionController::Assertions::SelectorAssertions
195
+
196
+ def self.it_should_flow(&block)
197
+ CallCenter::Test::MiniTest::DSL::ItShouldFlow.new(self, &block)
198
+ end
199
+
200
+ def self.it_should_render(&block)
201
+ CallCenter::Test::MiniTest::DSL::ItShouldRender.new(self, &block)
202
+ end
203
+
204
+ def response_from_page_or_rjs
205
+ HTML::Document.new(@_body).root
206
+ end
207
+
208
+ def body(text, debug = false)
209
+ puts text if debug
210
+ @_body = text
211
+ end
212
+
213
+ private
214
+
215
+ def build_message(head, template=nil, *arguments)
216
+ template &&= template.chomp
217
+ return ::Test::Unit::Assertions::AssertionMessage.new(head, template, arguments)
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,20 @@
1
+ require 'minitest/helper'
2
+ require 'call_center/test/minitest/dsl'
3
+
4
+ require 'test/examples/call'
5
+
6
+ describe CallCenter::Test::MiniTest::DSL do
7
+ subject { Call.new }
8
+ let(:call_center_state_field) { :state }
9
+
10
+ it_should_flow { on(:incoming_call).from(:initial).to(:routing).if(:agents_available?) }
11
+ it_should_flow { on(:incoming_call).from(:initial).to(:voicemail).unless(:agents_available?) }
12
+ it_should_render { is(:initial).expects(:notify).selects("Response>Say", "Hello World") }
13
+
14
+ it_should_flow { on(:customer_hangs_up).from(:voicemail).to(:voicemail_completed) }
15
+ it_should_render { is(:voicemail).expects(:notify).selects("Response>Say", "Hello World").selects("Response>Record[action=/voice/calls/flow?event=voicemail_complete&amp;actor=customer]") }
16
+
17
+ it_should_flow { on(:something_crazy_happens).from(:initial).to(:uh_oh) }
18
+
19
+ it_should_flow { on(:customer_hangs_up).from(:cancelled).to(:cancelled).expects(:cancelled) { |e| e.never } }
20
+ end
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'minitest/autorun'
11
+ require 'mocha'
12
+ require 'active_support'
13
+
14
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
16
+ require 'call_center'
17
+
18
+ module CommonCallMethods
19
+ def agents_available?; end
20
+ def voicemail; end
21
+ def voicemail_completed; end
22
+ def routing; end
23
+ end
data/minitest/run.rb ADDED
@@ -0,0 +1,15 @@
1
+ project_root = File.expand_path('..', File.dirname(__FILE__))
2
+ lib_dir = File.join(project_root, 'lib')
3
+ test_dir = File.join(project_root, 'minitest')
4
+
5
+ begin
6
+ require 'minitest/reporters'
7
+ MiniTest::Unit.runner = MiniTest::SuiteRunner.new
8
+ MiniTest::Unit.runner.reporters << MiniTest::Reporters::ProgressReporter.new
9
+ rescue LoadError
10
+ puts "MiniTest::Reporters not available."
11
+ end
12
+
13
+ puts "\n\n"
14
+ test_files = File.join(test_dir, '**/*_test.rb')
15
+ Dir[test_files].each { |file| require file }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: call_center
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Henry Hsu
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-23 00:00:00 -07:00
18
+ date: 2011-10-24 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -208,6 +208,50 @@ dependencies:
208
208
  version: "0"
209
209
  type: :development
210
210
  version_requirements: *id013
211
+ - !ruby/object:Gem::Dependency
212
+ name: minitest
213
+ prerelease: false
214
+ requirement: &id014 !ruby/object:Gem::Requirement
215
+ none: false
216
+ requirements:
217
+ - - "="
218
+ - !ruby/object:Gem::Version
219
+ hash: 21
220
+ segments:
221
+ - 2
222
+ - 6
223
+ - 1
224
+ version: 2.6.1
225
+ type: :development
226
+ version_requirements: *id014
227
+ - !ruby/object:Gem::Dependency
228
+ name: minitest-reporters
229
+ prerelease: false
230
+ requirement: &id015 !ruby/object:Gem::Requirement
231
+ none: false
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ hash: 3
236
+ segments:
237
+ - 0
238
+ version: "0"
239
+ type: :development
240
+ version_requirements: *id015
241
+ - !ruby/object:Gem::Dependency
242
+ name: guard-shell
243
+ prerelease: false
244
+ requirement: &id016 !ruby/object:Gem::Requirement
245
+ none: false
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ hash: 3
250
+ segments:
251
+ - 0
252
+ version: "0"
253
+ type: :development
254
+ version_requirements: *id016
211
255
  description: Support for describing call center workflows
212
256
  email: hhsu@zendesk.com
213
257
  executables: []
@@ -223,6 +267,7 @@ files:
223
267
  - Gemfile
224
268
  - Gemfile.lock
225
269
  - Guardfile
270
+ - Guardfile.minitest
226
271
  - LICENSE.txt
227
272
  - README.md
228
273
  - Rakefile
@@ -234,6 +279,10 @@ files:
234
279
  - lib/call_center/flow_callback.rb
235
280
  - lib/call_center/state_machine_ext.rb
236
281
  - lib/call_center/test/dsl.rb
282
+ - lib/call_center/test/minitest/dsl.rb
283
+ - minitest/call_center/test/minitest_test.rb
284
+ - minitest/helper.rb
285
+ - minitest/run.rb
237
286
  - test/call_center_test.rb
238
287
  - test/core_ext_test.rb
239
288
  - test/examples/call.rb