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 +3 -0
- data/Gemfile.lock +12 -0
- data/Guardfile.minitest +9 -0
- data/VERSION +1 -1
- data/call_center.gemspec +16 -2
- data/lib/call_center/test/minitest/dsl.rb +224 -0
- data/minitest/call_center/test/minitest_test.rb +20 -0
- data/minitest/helper.rb +23 -0
- data/minitest/run.rb +15 -0
- metadata +53 -4
data/Gemfile
CHANGED
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
|
data/Guardfile.minitest
ADDED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
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.
|
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-
|
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&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
|
data/minitest/helper.rb
ADDED
@@ -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:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
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-
|
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
|