adhearsion 1.2.6 → 2.0.0.alpha1

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.
Files changed (236) hide show
  1. data/.gitignore +17 -10
  2. data/CHANGELOG.md +273 -0
  3. data/Gemfile +1 -1
  4. data/Guardfile +17 -0
  5. data/README.markdown +61 -9
  6. data/Rakefile +16 -48
  7. data/adhearsion.gemspec +21 -7
  8. data/bin/ahn +3 -1
  9. data/cucumber.yml +4 -0
  10. data/features/app_generator.feature +42 -0
  11. data/features/cli.feature +108 -0
  12. data/features/step_definitions/app_generator_steps.rb +6 -0
  13. data/features/step_definitions/cli_steps.rb +74 -0
  14. data/features/support/aruba_helper.rb +22 -0
  15. data/features/support/env.rb +37 -0
  16. data/features/support/utils.rb +8 -0
  17. data/lib/adhearsion.rb +85 -41
  18. data/lib/adhearsion/call.rb +176 -0
  19. data/lib/adhearsion/call_controller.rb +134 -0
  20. data/lib/adhearsion/call_controller/dial.rb +70 -0
  21. data/lib/adhearsion/call_controller/input.rb +173 -0
  22. data/lib/adhearsion/call_controller/menu.rb +124 -0
  23. data/lib/adhearsion/call_controller/output.rb +267 -0
  24. data/lib/adhearsion/call_controller/record.rb +42 -0
  25. data/lib/adhearsion/call_controller/utility.rb +60 -0
  26. data/lib/adhearsion/calls.rb +81 -0
  27. data/lib/adhearsion/cli.rb +1 -3
  28. data/lib/adhearsion/cli_commands.rb +142 -0
  29. data/lib/adhearsion/configuration.rb +149 -0
  30. data/lib/adhearsion/console.rb +19 -8
  31. data/lib/adhearsion/dialplan_controller.rb +9 -0
  32. data/lib/adhearsion/events.rb +84 -0
  33. data/lib/adhearsion/foundation/all.rb +0 -7
  34. data/lib/adhearsion/foundation/custom_daemonizer.rb +4 -6
  35. data/lib/adhearsion/foundation/exception_handler.rb +9 -0
  36. data/lib/adhearsion/foundation/object.rb +26 -8
  37. data/lib/adhearsion/foundation/synchronized_hash.rb +3 -6
  38. data/lib/adhearsion/foundation/thread_safety.rb +17 -1
  39. data/lib/adhearsion/generators/app/app_generator.rb +4 -13
  40. data/lib/adhearsion/generators/app/templates/Gemfile +10 -5
  41. data/lib/adhearsion/generators/app/templates/Procfile +1 -0
  42. data/lib/adhearsion/generators/app/templates/README.md +28 -0
  43. data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +41 -0
  44. data/lib/adhearsion/generators/app/templates/{components/simon_game → lib}/simon_game.rb +6 -18
  45. data/lib/adhearsion/generators/app/templates/script/ahn +2 -2
  46. data/lib/adhearsion/initializer.rb +151 -293
  47. data/lib/adhearsion/initializer/logging.rb +33 -0
  48. data/lib/adhearsion/logging.rb +65 -69
  49. data/lib/adhearsion/menu_dsl.rb +15 -0
  50. data/lib/adhearsion/menu_dsl/calculated_match.rb +39 -0
  51. data/lib/adhearsion/menu_dsl/calculated_match_collection.rb +41 -0
  52. data/lib/adhearsion/menu_dsl/fixnum_match_calculator.rb +18 -0
  53. data/lib/adhearsion/menu_dsl/match_calculator.rb +36 -0
  54. data/lib/adhearsion/{voip/menu_state_machine/menu_class.rb → menu_dsl/menu.rb} +38 -40
  55. data/lib/adhearsion/menu_dsl/menu_builder.rb +69 -0
  56. data/lib/adhearsion/menu_dsl/range_match_calculator.rb +55 -0
  57. data/lib/adhearsion/menu_dsl/string_match_calculator.rb +21 -0
  58. data/lib/adhearsion/outbound_call.rb +64 -0
  59. data/lib/adhearsion/plugin.rb +319 -0
  60. data/lib/adhearsion/plugin/collection.rb +19 -0
  61. data/lib/adhearsion/plugin/initializer.rb +37 -0
  62. data/lib/adhearsion/plugin/methods_container.rb +6 -0
  63. data/lib/adhearsion/process.rb +94 -0
  64. data/lib/adhearsion/punchblock_plugin.rb +29 -0
  65. data/lib/adhearsion/punchblock_plugin/initializer.rb +137 -0
  66. data/lib/adhearsion/router.rb +30 -0
  67. data/lib/adhearsion/router/route.rb +42 -0
  68. data/lib/adhearsion/script_ahn_loader.rb +2 -2
  69. data/lib/adhearsion/tasks.rb +14 -9
  70. data/lib/adhearsion/tasks/configuration.rb +26 -0
  71. data/lib/adhearsion/tasks/plugins.rb +17 -0
  72. data/lib/adhearsion/version.rb +8 -14
  73. data/spec/adhearsion/call_controller/dial_spec.rb +138 -0
  74. data/spec/adhearsion/call_controller/input_spec.rb +278 -0
  75. data/spec/adhearsion/call_controller/menu_spec.rb +120 -0
  76. data/spec/adhearsion/call_controller/output_spec.rb +466 -0
  77. data/spec/adhearsion/call_controller/record_spec.rb +125 -0
  78. data/spec/adhearsion/call_controller_spec.rb +395 -0
  79. data/spec/adhearsion/call_spec.rb +438 -0
  80. data/spec/adhearsion/calls_spec.rb +47 -0
  81. data/spec/adhearsion/configuration_spec.rb +308 -0
  82. data/spec/adhearsion/dialplan_controller_spec.rb +26 -0
  83. data/spec/adhearsion/events_spec.rb +112 -0
  84. data/spec/adhearsion/initializer/logging_spec.rb +58 -0
  85. data/spec/adhearsion/initializer_spec.rb +209 -122
  86. data/spec/adhearsion/logging_spec.rb +58 -47
  87. data/spec/adhearsion/menu_dsl/calculated_match_collection_spec.rb +56 -0
  88. data/spec/adhearsion/menu_dsl/calculated_match_spec.rb +57 -0
  89. data/spec/adhearsion/menu_dsl/fixnum_match_calculator_spec.rb +33 -0
  90. data/spec/adhearsion/menu_dsl/match_calculator_spec.rb +13 -0
  91. data/spec/adhearsion/menu_dsl/menu_builder_spec.rb +118 -0
  92. data/spec/adhearsion/menu_dsl/menu_spec.rb +210 -0
  93. data/spec/adhearsion/menu_dsl/range_match_calculator_spec.rb +28 -0
  94. data/spec/adhearsion/menu_dsl/string_match_calculator_spec.rb +36 -0
  95. data/spec/adhearsion/menu_dsl_spec.rb +12 -0
  96. data/spec/adhearsion/outbound_call_spec.rb +174 -0
  97. data/spec/adhearsion/plugin_spec.rb +489 -0
  98. data/spec/adhearsion/process_spec.rb +34 -0
  99. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +294 -0
  100. data/spec/adhearsion/router/route_spec.rb +99 -0
  101. data/spec/adhearsion/router_spec.rb +106 -0
  102. data/spec/adhearsion_spec.rb +46 -0
  103. data/spec/spec_helper.rb +14 -14
  104. data/spec/support/call_controller_test_helpers.rb +48 -0
  105. data/spec/support/initializer_stubs.rb +8 -13
  106. data/spec/support/punchblock_mocks.rb +6 -0
  107. metadata +255 -253
  108. data/CHANGELOG +0 -174
  109. data/bin/ahnctl +0 -68
  110. data/bin/jahn +0 -43
  111. data/examples/asterisk_manager_interface/standalone.rb +0 -51
  112. data/lib/adhearsion/commands.rb +0 -302
  113. data/lib/adhearsion/component_manager.rb +0 -278
  114. data/lib/adhearsion/component_manager/component_tester.rb +0 -54
  115. data/lib/adhearsion/component_manager/spec_framework.rb +0 -18
  116. data/lib/adhearsion/events_support.rb +0 -65
  117. data/lib/adhearsion/foundation/blank_slate.rb +0 -3
  118. data/lib/adhearsion/foundation/event_socket.rb +0 -205
  119. data/lib/adhearsion/foundation/future_resource.rb +0 -36
  120. data/lib/adhearsion/foundation/metaprogramming.rb +0 -17
  121. data/lib/adhearsion/foundation/numeric.rb +0 -13
  122. data/lib/adhearsion/foundation/pseudo_guid.rb +0 -10
  123. data/lib/adhearsion/foundation/relationship_properties.rb +0 -42
  124. data/lib/adhearsion/foundation/string.rb +0 -26
  125. data/lib/adhearsion/generators/app/templates/.ahnrc +0 -34
  126. data/lib/adhearsion/generators/app/templates/README +0 -8
  127. data/lib/adhearsion/generators/app/templates/components/ami_remote/ami_remote.rb +0 -15
  128. data/lib/adhearsion/generators/app/templates/components/disabled/HOW_TO_ENABLE +0 -7
  129. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/README.markdown +0 -47
  130. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/stomp_gateway.rb +0 -34
  131. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/stomp_gateway.yml +0 -12
  132. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/README.markdown +0 -3
  133. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/xmpp_gateway.rb +0 -11
  134. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/xmpp_gateway.yml +0 -0
  135. data/lib/adhearsion/generators/app/templates/config/startup.rb +0 -81
  136. data/lib/adhearsion/generators/app/templates/dialplan.rb +0 -3
  137. data/lib/adhearsion/generators/app/templates/events.rb +0 -33
  138. data/lib/adhearsion/host_definitions.rb +0 -67
  139. data/lib/adhearsion/initializer/asterisk.rb +0 -86
  140. data/lib/adhearsion/initializer/configuration.rb +0 -324
  141. data/lib/adhearsion/initializer/database.rb +0 -60
  142. data/lib/adhearsion/initializer/drb.rb +0 -31
  143. data/lib/adhearsion/initializer/freeswitch.rb +0 -22
  144. data/lib/adhearsion/initializer/ldap.rb +0 -57
  145. data/lib/adhearsion/initializer/rails.rb +0 -41
  146. data/lib/adhearsion/initializer/xmpp.rb +0 -42
  147. data/lib/adhearsion/tasks/components.rb +0 -32
  148. data/lib/adhearsion/tasks/database.rb +0 -5
  149. data/lib/adhearsion/tasks/deprecations.rb +0 -59
  150. data/lib/adhearsion/tasks/generating.rb +0 -20
  151. data/lib/adhearsion/tasks/lint.rb +0 -4
  152. data/lib/adhearsion/voip/asterisk.rb +0 -4
  153. data/lib/adhearsion/voip/asterisk/agi_server.rb +0 -121
  154. data/lib/adhearsion/voip/asterisk/commands.rb +0 -1966
  155. data/lib/adhearsion/voip/asterisk/config_generators/agents.conf.rb +0 -140
  156. data/lib/adhearsion/voip/asterisk/config_generators/config_generator.rb +0 -102
  157. data/lib/adhearsion/voip/asterisk/config_generators/queues.conf.rb +0 -250
  158. data/lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb +0 -240
  159. data/lib/adhearsion/voip/asterisk/config_manager.rb +0 -64
  160. data/lib/adhearsion/voip/asterisk/manager_interface.rb +0 -697
  161. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb +0 -1681
  162. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb +0 -341
  163. data/lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb +0 -78
  164. data/lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl +0 -87
  165. data/lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb +0 -80
  166. data/lib/adhearsion/voip/call.rb +0 -521
  167. data/lib/adhearsion/voip/call_routing.rb +0 -64
  168. data/lib/adhearsion/voip/commands.rb +0 -17
  169. data/lib/adhearsion/voip/constants.rb +0 -39
  170. data/lib/adhearsion/voip/conveniences.rb +0 -18
  171. data/lib/adhearsion/voip/dial_plan.rb +0 -252
  172. data/lib/adhearsion/voip/dsl/dialing_dsl.rb +0 -151
  173. data/lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb +0 -37
  174. data/lib/adhearsion/voip/dsl/dialplan/control_passing_exception.rb +0 -27
  175. data/lib/adhearsion/voip/dsl/dialplan/dispatcher.rb +0 -124
  176. data/lib/adhearsion/voip/dsl/dialplan/parser.rb +0 -69
  177. data/lib/adhearsion/voip/dsl/dialplan/thread_mixin.rb +0 -16
  178. data/lib/adhearsion/voip/dsl/numerical_string.rb +0 -128
  179. data/lib/adhearsion/voip/freeswitch/basic_connection_manager.rb +0 -48
  180. data/lib/adhearsion/voip/freeswitch/event_handler.rb +0 -58
  181. data/lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb +0 -129
  182. data/lib/adhearsion/voip/freeswitch/inbound_connection_manager.rb +0 -38
  183. data/lib/adhearsion/voip/freeswitch/oes_server.rb +0 -195
  184. data/lib/adhearsion/voip/menu_state_machine/calculated_match.rb +0 -80
  185. data/lib/adhearsion/voip/menu_state_machine/matchers.rb +0 -123
  186. data/lib/adhearsion/voip/menu_state_machine/menu_builder.rb +0 -57
  187. data/lib/adhearsion/xmpp/connection.rb +0 -61
  188. data/lib/theatre.rb +0 -147
  189. data/lib/theatre/README.markdown +0 -64
  190. data/lib/theatre/callback_definition_loader.rb +0 -86
  191. data/lib/theatre/guid.rb +0 -23
  192. data/lib/theatre/invocation.rb +0 -131
  193. data/lib/theatre/namespace_manager.rb +0 -153
  194. data/lib/theatre/version.rb +0 -2
  195. data/spec/adhearsion/cli_spec.rb +0 -306
  196. data/spec/adhearsion/component_manager_spec.rb +0 -292
  197. data/spec/adhearsion/constants_spec.rb +0 -8
  198. data/spec/adhearsion/drb_spec.rb +0 -65
  199. data/spec/adhearsion/fixtures/dialplan.rb +0 -3
  200. data/spec/adhearsion/foundation/event_socket_spec.rb +0 -168
  201. data/spec/adhearsion/host_definitions_spec.rb +0 -79
  202. data/spec/adhearsion/initializer/configuration_spec.rb +0 -291
  203. data/spec/adhearsion/initializer/loading_spec.rb +0 -154
  204. data/spec/adhearsion/initializer/paths_spec.rb +0 -74
  205. data/spec/adhearsion/relationship_properties_spec.rb +0 -54
  206. data/spec/adhearsion/voip/asterisk/agi_server_spec.rb +0 -473
  207. data/spec/adhearsion/voip/asterisk/ami/ami_spec.rb +0 -550
  208. data/spec/adhearsion/voip/asterisk/ami/lexer/ami_fixtures.yml +0 -30
  209. data/spec/adhearsion/voip/asterisk/ami/lexer/lexer_story +0 -291
  210. data/spec/adhearsion/voip/asterisk/ami/lexer/lexer_story.rb +0 -241
  211. data/spec/adhearsion/voip/asterisk/ami/lexer/story_helper.rb +0 -124
  212. data/spec/adhearsion/voip/asterisk/commands_spec.rb +0 -3241
  213. data/spec/adhearsion/voip/asterisk/config_file_generators/agents_spec.rb +0 -251
  214. data/spec/adhearsion/voip/asterisk/config_file_generators/queues_spec.rb +0 -323
  215. data/spec/adhearsion/voip/asterisk/config_file_generators/voicemail_spec.rb +0 -306
  216. data/spec/adhearsion/voip/asterisk/config_manager_spec.rb +0 -127
  217. data/spec/adhearsion/voip/asterisk/menu_command/calculated_match_spec.rb +0 -109
  218. data/spec/adhearsion/voip/asterisk/menu_command/matchers_spec.rb +0 -97
  219. data/spec/adhearsion/voip/call_routing_spec.rb +0 -125
  220. data/spec/adhearsion/voip/dialplan_manager_spec.rb +0 -468
  221. data/spec/adhearsion/voip/dsl/dialing_dsl_spec.rb +0 -270
  222. data/spec/adhearsion/voip/dsl/dispatcher_spec.rb +0 -82
  223. data/spec/adhearsion/voip/dsl/dispatcher_spec_helper.rb +0 -45
  224. data/spec/adhearsion/voip/dsl/parser_spec.rb +0 -69
  225. data/spec/adhearsion/voip/freeswitch/basic_connection_manager_spec.rb +0 -39
  226. data/spec/adhearsion/voip/freeswitch/inbound_connection_manager_spec.rb +0 -39
  227. data/spec/adhearsion/voip/freeswitch/oes_server_spec.rb +0 -9
  228. data/spec/adhearsion/voip/numerical_string_spec.rb +0 -61
  229. data/spec/adhearsion/voip/phone_number_spec.rb +0 -45
  230. data/spec/support/the_following_code.rb +0 -3
  231. data/spec/theatre/dsl_examples/simple_before_call.rb +0 -7
  232. data/spec/theatre/dsl_spec.rb +0 -69
  233. data/spec/theatre/invocation_spec.rb +0 -182
  234. data/spec/theatre/namespace_spec.rb +0 -125
  235. data/spec/theatre/spec_helper_spec.rb +0 -28
  236. data/spec/theatre/theatre_class_spec.rb +0 -148
@@ -1,292 +0,0 @@
1
- require 'spec_helper'
2
- require 'adhearsion/component_manager/component_tester'
3
-
4
- module ComponentManagerTestHelper
5
-
6
- def mock_component_config(component_name, yaml)
7
- yaml = YAML.load(yaml) if yaml.kind_of?(String)
8
- flexmock(@component_manager.lazy_config_loader).should_receive(component_name).and_return yaml
9
- end
10
-
11
- def run_component_code(code)
12
- @component_manager.load_code(code)
13
- end
14
-
15
- def new_object_with_scope(scope)
16
- @component_manager.extend_object_with(Object.new, scope)
17
- end
18
- end
19
-
20
- describe "Adhearsion's component system" do
21
-
22
- include ComponentManagerTestHelper
23
-
24
- before :each do
25
- @component_manager = Adhearsion::Components::ComponentManager.new "/filesystem/access/should/be/mocked/out"
26
- Object.send :remove_const, :COMPONENTS if Object.const_defined?(:COMPONENTS)
27
- Object.send :const_set, :COMPONENTS, @component_manager.lazy_config_loader
28
- end
29
-
30
- it "constants should be available in the main namespace" do
31
- constant_name = "FOO_#{rand(10000000000)}"
32
- begin
33
- run_component_code <<-RUBY
34
- #{constant_name} = 123
35
- RUBY
36
- Module.const_get(constant_name).should be 123
37
- ensure
38
- Object.send(:remove_const, constant_name) rescue nil
39
- end
40
- end
41
-
42
- it "defined constants should be available within the methods_for block" do
43
- constant_name = "I_HAVE_#{rand(100000000000000)}_GUMMY_BEARS"
44
- code = <<-RUBY
45
- #{constant_name} = :its_true!
46
- methods_for :dialplan do
47
- throw #{constant_name}
48
- end
49
- RUBY
50
- the_following_code {
51
- run_component_code code
52
- }.should throw_symbol :its_true!
53
- end
54
-
55
- it "initialization block should be called after the methods_for() blocks"
56
-
57
- it "defined methods should be recognized once defined" do
58
- run_component_code <<-RUBY
59
- methods_for :events do
60
- def foo
61
- :inside_foo!
62
- end
63
- end
64
- RUBY
65
- container_object = new_object_with_scope :events
66
- container_object.foo.should be :inside_foo!
67
- end
68
-
69
- it "a method defined in one scope should not be available in another" do
70
- code = <<-RUBY
71
- methods_for :events do
72
- def in_events
73
- in_dialplan
74
- end
75
- end
76
- methods_for :dialplan do
77
- def in_dialplan
78
- in_events
79
- end
80
- end
81
- RUBY
82
-
83
- end
84
-
85
- it "methods defined in separate blocks should be available if they share a scope" do
86
- run_component_code <<-RUBY
87
- methods_for :dialplan do
88
- def get_symbol
89
- :i_am_the_best_symbol_in_the_world
90
- end
91
- end
92
- methods_for :dialplan do
93
- def throw_best_symbol_in_the_world
94
- throw get_symbol
95
- end
96
- end
97
- RUBY
98
- obj = new_object_with_scope :dialplan
99
- the_following_code {
100
- obj.throw_best_symbol_in_the_world
101
- }.should throw_symbol :i_am_the_best_symbol_in_the_world
102
- end
103
-
104
- it "privately defined methods should remain private" do
105
- return_value = "hear! hear! i'm private, indeed!"
106
- run_component_code <<-RUBY
107
- methods_for :generators do
108
- def i_am_public
109
- i_am_private.reverse
110
- end
111
-
112
- private
113
-
114
- def i_am_private
115
- "#{return_value}"
116
- end
117
- end
118
- RUBY
119
- object = new_object_with_scope(:generators)
120
- object.i_am_public.should == return_value.reverse
121
- the_following_code {
122
- object.i_am_private
123
- }.should raise_error NoMethodError
124
- end
125
-
126
- it "load_components should load code with the proper filenames" do
127
- components_dir_path = "/path/to/somewhere/components"
128
- component_names = %w[fooo barr qazz]
129
- component_paths = component_names.map { |name| "#{components_dir_path}/#{name}" }
130
-
131
- flexmock(Dir).should_receive(:glob).once.with(components_dir_path + "/*").
132
- and_return(component_paths + ["disabled"])
133
- flexstub(File).should_receive(:exists?).and_return true
134
- flexstub(File).should_receive(:directory?).and_return true
135
-
136
- manager = Adhearsion::Components::ComponentManager.new(components_dir_path)
137
- component_paths.each do |path|
138
- flexmock(manager).should_receive(:load_file).once.with "#{path}/lib/#{File.basename(path)}.rb"
139
- end
140
-
141
- manager.load_components
142
- end
143
-
144
- it "the :global scope" do
145
- run_component_code <<-RUBY
146
- methods_for :global do
147
- def i_should_be_globally_available
148
- :found!
149
- end
150
- end
151
- RUBY
152
- @component_manager.globalize_global_scope!
153
- i_should_be_globally_available.should be :found!
154
- end
155
-
156
- it "methods defined in outside of any scope should not be globally available" do
157
- run_component_code <<-RUBY
158
- def i_should_not_be_globally_available
159
- :found!
160
- end
161
- RUBY
162
- the_following_code {
163
- i_should_not_be_globally_available
164
- }.should raise_error NameError
165
- end
166
-
167
- it "should have access to the COMPONENTS constant" do
168
- component_name = "am_not_for_kokoa"
169
- mock_component_config(component_name, <<-YAML)
170
- host: localhost
171
- port: 7007
172
- array:
173
- - 1
174
- - 2
175
- - 3
176
- YAML
177
- run_component_code <<-RUBY
178
- methods_for(:dialplan) do
179
- def host
180
- COMPONENTS.#{component_name}["host"]
181
- end
182
- def port
183
- COMPONENTS.#{component_name}["port"]
184
- end
185
- def array
186
- COMPONENTS.#{component_name}["array"]
187
- end
188
- end
189
- RUBY
190
- obj = new_object_with_scope :dialplan
191
- obj.host.should =="localhost"
192
- obj.port.should ==7007
193
- obj.array.should ==[1,2,3]
194
- end
195
-
196
- it "the delegate method should properly delegate arguments and a block to a specified object" do
197
- component_name = "writing_this_at_peets_coffee"
198
- mock_component_config(component_name, "{jay: phillips}")
199
- run_component_code <<-RUBY
200
-
201
- initialization do
202
- obj = Object.new
203
- def obj.foo
204
- :foo
205
- end
206
- def obj.bar
207
- :bar
208
- end
209
- COMPONENTS.#{component_name}[:foobar] = obj
210
- end
211
-
212
- methods_for :dialplan do
213
- delegate :#{component_name}, :to => :COMPONENTS
214
- end
215
- RUBY
216
- obj = new_object_with_scope :dialplan
217
- obj.send(component_name)[:foobar].foo.should be :foo
218
- end
219
-
220
- it "an initialized component should not have an 'initialize' private method since it's confusing"
221
-
222
- it "should find components in a project properly"
223
- it "should run the initialization block" do
224
- code = <<-RUBY
225
- initialization do
226
- throw :got_here!
227
- end
228
- RUBY
229
- the_following_code {
230
- run_component_code code
231
- }.should throw_symbol :got_here!
232
-
233
- end
234
-
235
- it "should alias the initialization method to initialisation" do
236
- code = <<-RUBY
237
- initialisation do
238
- throw :BRITISH!
239
- end
240
- RUBY
241
- the_following_code {
242
- run_component_code code
243
- }.should throw_symbol :BRITISH!
244
- end
245
-
246
- it "should properly expose any defined constants" do
247
- container = run_component_code <<-RUBY
248
- TEST_ONE = 1
249
- TEST_TWO = 2
250
- TEST_THREE = 3
251
- RUBY
252
- container.constants.sort.map{|s| s.to_sym}.should == [:TEST_ONE, :TEST_THREE, :TEST_TWO]
253
- container.constants.map do |constant|
254
- container.const_get(constant)
255
- end.sort.should ==[1,2,3]
256
- end
257
-
258
- end
259
-
260
- describe "ComponentTester" do
261
- it "should allow the scope-resolution operator to access a component's constants" do
262
- component_name = "my_awesomeness"
263
- flexmock(File).should_receive(:read).once.with(/#{component_name}\.rb$/).and_return "AWESOME = :YES!"
264
- tester = ComponentTester.new(component_name, "/path/shouldnt/matter")
265
- tester::AWESOME.should be :YES!
266
- end
267
-
268
- it "should return an executable helper method properly" do
269
- component_name = "one_two_three"
270
- flexmock(File).should_receive(:read).once.with(/#{component_name}\.rb$/).and_return "def hair() :long end"
271
- tester = ComponentTester.new(component_name, "/path/shouldnt/matter")
272
- tester.helper_method(:hair).call.should be :long
273
- end
274
-
275
- it "should load the configuration for the given helper properly" do
276
- component_name = "i_like_configurations"
277
- config = {:german => {1 => :eins, 2 => :zwei, 3 => :drei}}
278
- flexmock(File).should_receive(:read).once.with(/#{component_name}\.rb$/).and_return ""
279
- component_manager = flexmock "ComponentManager"
280
- component_manager.should_receive(:configuration_for_component_named).once.with(component_name).and_return config
281
- flexmock(Adhearsion::Components::ComponentManager).should_receive(:new).once.and_return component_manager
282
- ComponentTester.new(component_name, "/path/shouldnt/matter").config[:german][1].should be :eins
283
- end
284
-
285
- it "should execute the initialize block when calling ComponentTester#initialize!()" do
286
- component_name = "morrissey"
287
- flexmock(File).should_receive(:read).once.with(/#{component_name}\.rb$/).and_return "initialization { $YES_I_WAS_CALLED = TRUE }"
288
- ComponentTester.new(component_name, "/path/shouldnt/matter").initialize!
289
- $YES_I_WAS_CALLED.should == true
290
- end
291
-
292
- end
@@ -1,8 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "The Adhearsion module" do
4
- # This it is of questionable benefit
5
- it "should have a VERSION constant" do
6
- Adhearsion.const_defined?(:VERSION).should be true
7
- end
8
- end
@@ -1,65 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module DRbTestHelper
4
-
5
- def new_drb_rpc_object
6
- Object.new.tap do |obj|
7
- @component_manager.extend_object_with(obj, :rpc)
8
- end
9
- end
10
-
11
- def add_rpc_methods(code)
12
- @component_manager.load_code "methods_for(:rpc) do; #{code}; end"
13
- end
14
-
15
- end
16
-
17
- describe "Invoking an interface method via DRb" do
18
- include DRbTestHelper
19
-
20
- it "should raise an exception if the method is not found" do
21
- the_following_code do
22
- new_drb_rpc_object.this_method_doesnt_exist
23
- end.should raise_error NoMethodError
24
- end
25
-
26
- before(:all) { require 'drb' }
27
-
28
- before :each do
29
- @component_manager = Adhearsion::Components::ComponentManager.new("/path/doesnt/matter")
30
- @door = DRb.start_service "druby://127.0.0.1:#{37832 + rand(1500)}", new_drb_rpc_object
31
- end
32
-
33
- after :each do
34
- @door.stop_service
35
- @door.thread.kill
36
- end
37
-
38
- it "should return normal Ruby data structures properly over DRb" do
39
- add_rpc_methods <<-RUBY
40
- def bar
41
- [3,2,1]
42
- end
43
- RUBY
44
- client = DRbObject.new nil, DRb.uri
45
- client.bar.should == [3, 2, 1]
46
- end
47
-
48
- it "should raise an exception for a non-existent interface" do
49
- client = DRbObject.new nil, DRb.uri
50
- the_following_code do
51
- client.interface.bad_interface.should be [3, 2, 1]
52
- end.should raise_error NoMethodError
53
- end
54
-
55
- it "should raise an exception for a non-existent method" do
56
- client = DRbObject.new nil, DRb.uri
57
- the_following_code do
58
- client.interface.interface.foobar.equal [3, 2, 1]
59
- end.should raise_error NoMethodError
60
- end
61
-
62
- after do
63
- DRb.stop_service
64
- end
65
- end
@@ -1,3 +0,0 @@
1
- sample_context {
2
- raise 'the body of this context should not have been evaluated'
3
- }
@@ -1,168 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module EventSocketTestHelper
4
- def mock_handler_object
5
- flexmock.tap do |handler|
6
- flexstub(handler).should_receive(:connected)
7
- flexstub(handler).should_receive(:receive_data)
8
- flexstub(handler).should_receive(:disconnected)
9
- end
10
- end
11
- end
12
-
13
- describe "a new EventSocket" do
14
-
15
- include EventSocketTestHelper
16
-
17
- it "instantiating a new EventSocket should not instantiate a TCPSocket yet" do
18
- flexmock(TCPSocket).should_receive(:new).never
19
- EventSocket.new("localhost", 1234, mock_handler_object)
20
- end
21
-
22
- it "instantiating a new EventSocket with both a block and a handler object" do
23
- the_following_code {
24
- EventSocket.new("localhost", 1234, mock_handler_object) {}
25
- }.should raise_error ArgumentError
26
- end
27
-
28
- it "instantiating a new EventSocket with neither a block nor handler object" do
29
- the_following_code {
30
- EventSocket.new("localhost", 1234)
31
- }.should raise_error ArgumentError
32
- end
33
-
34
- it "should have an initial state of :new" do
35
- EventSocket.new("localhost", 1234, mock_handler_object).state.should be :new
36
- end
37
-
38
- it "the handler created when instantiating the EventSocket with a block" do
39
- event_socket = EventSocket.new("foo", 123) do |handler|
40
- handler.receive_data { throw :inside_receive_data }
41
- handler.disconnected { throw :inside_disconnected}
42
- handler.connected { throw :inside_connected }
43
- end
44
- handler = event_socket.send(:instance_variable_get, :@handler)
45
- the_following_code {
46
- handler.send :receive_data, ''
47
- }.should throw_symbol :inside_receive_data
48
-
49
- %w[disconnected connected].each do |callback|
50
- the_following_code {
51
- handler.send callback
52
- }.should throw_symbol "inside_#{callback}".to_sym
53
- end
54
- end
55
-
56
- it 'the handler created when instantiating the EventSocket with a block in which "def" is used to define callbacks' do
57
- event_socket = EventSocket.new("foo", 123) do |handler|
58
- def handler.receive_data
59
- throw :inside_receive_data
60
- end
61
- def handler.disconnected
62
- throw :inside_disconnected
63
- end
64
- def handler.connected
65
- throw :inside_connected
66
- end
67
- end
68
- handler = event_socket.send(:instance_variable_get, :@handler)
69
- %w[receive_data disconnected connected].each do |callback|
70
- the_following_code {
71
- handler.send callback
72
- }.should throw_symbol "inside_#{callback}".to_sym
73
- end
74
- end
75
-
76
- end
77
-
78
- describe "connecting an EventSocket" do
79
-
80
- include EventSocketTestHelper
81
-
82
- before :each do
83
- flexmock(Mutex).new_instances.should_receive(:synchronize).zero_or_more_times.and_yield
84
- end
85
-
86
- it "should instantiate a new TCPSocket with the correct host and port" do
87
- host, port = "google.com", 80
88
- mock_socket = flexmock "TCPSocket"
89
- flexmock(TCPSocket).should_receive(:new).once.with(host, port)
90
- EventSocket.new(host, port, mock_handler_object).connect!
91
- end
92
-
93
- it "should have a state of :connected if TCPSocket instantiates without error" do
94
- host, port = "google.com", 80
95
- mock_socket = flexmock "TCPSocket"
96
- flexmock(TCPSocket).should_receive(:new).once.with(host, port)
97
- event_socket = EventSocket.new(host, port, mock_handler_object)
98
- event_socket.connect!
99
- # Avoid race condition in JRuby where state may return nil
100
- sleep(0.1)
101
- event_socket.state.should be :connected
102
- end
103
-
104
- it "should have a state of :failed after ECONNREFUSED is raised" do
105
- host, port = "google.com", 80
106
- flexmock(TCPSocket).should_receive(:new).once.with(host, port).and_raise(Errno::ECONNREFUSED)
107
- event_socket = EventSocket.new(host, port, mock_handler_object)
108
-
109
- the_following_code {
110
- event_socket.connect!
111
- }.should raise_error Errno::ECONNREFUSED
112
-
113
- event_socket.state.should be :failed
114
- end
115
-
116
- it "should instantiate a new Thread which calls EventSocket#reader_loop" do
117
- flexmock(TCPSocket).should_receive(:new).once
118
- flexmock(Thread).should_receive(:new).and_yield
119
- the_following_code {
120
- event_socket = EventSocket.new("foo", 123, mock_handler_object)
121
- flexmock(event_socket).should_receive(:reader_loop).once.and_throw :in_thread_loop
122
- event_socket.connect!
123
- }.should throw_symbol :in_thread_loop
124
- end
125
-
126
- end
127
-
128
- describe "the reader_loop method" do
129
-
130
- include EventSocketTestHelper
131
-
132
- it "should call readpartial() on the TCPSocket and pass that to the receive_data method of handler" do
133
- mock_handler = flexmock "mock handler object"
134
- mock_socket = flexmock "TCPSocket"
135
- data = "Jay Phillips " * 25
136
-
137
- mock_handler.should_receive(:connected).and_return
138
- mock_handler.should_receive(:disconnected).and_return
139
- mock_handler.should_receive(:receive_data).once.with(data).and_throw :done_testing
140
-
141
- mock_socket.should_receive(:readpartial).once.with(EventSocket::MAX_CHUNK_SIZE).and_return data
142
-
143
- flexmock(TCPSocket).should_receive(:new).once.and_return mock_socket
144
- flexmock(Thread).should_receive(:new).and_yield
145
-
146
- the_following_code {
147
- EventSocket.new("foo", 123, mock_handler).connect!
148
- }.should throw_symbol :done_testing
149
- end
150
-
151
- it "should set the state to :connection_dropped when an EOFError is raised by readpartial" do
152
- mock_socket = flexmock "TCPSocket"
153
- mock_socket.should_receive(:readpartial).once.and_raise EOFError
154
- flexmock(TCPSocket).should_receive(:new).once.and_return mock_socket
155
-
156
- flexmock(Thread).should_receive(:new).and_yield
157
-
158
- event_socket = EventSocket.new("foo", 123, mock_handler_object)
159
-
160
- event_socket.connect!
161
- event_socket.state.should be :connection_dropped
162
- end
163
-
164
- end
165
-
166
- describe "the writer_loop method" do
167
-
168
- end