call_center 0.0.4 → 0.0.5

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.
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