adhearsion 2.6.4 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -9
  3. data/CHANGELOG.md +22 -7
  4. data/Gemfile +2 -0
  5. data/README.markdown +4 -5
  6. data/Rakefile +1 -2
  7. data/adhearsion.gemspec +19 -8
  8. data/features/cli_create.feature +19 -3
  9. data/features/step_definitions/cli_steps.rb +0 -11
  10. data/features/support/env.rb +3 -4
  11. data/lib/adhearsion.rb +48 -27
  12. data/lib/adhearsion/call.rb +34 -50
  13. data/lib/adhearsion/call_controller.rb +6 -12
  14. data/lib/adhearsion/call_controller/dial.rb +15 -53
  15. data/lib/adhearsion/call_controller/input.rb +39 -162
  16. data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
  17. data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
  18. data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
  19. data/lib/adhearsion/call_controller/input/result.rb +46 -0
  20. data/lib/adhearsion/call_controller/output.rb +48 -67
  21. data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
  22. data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
  23. data/lib/adhearsion/call_controller/output/player.rb +1 -1
  24. data/lib/adhearsion/call_controller/record.rb +23 -8
  25. data/lib/adhearsion/calls.rb +1 -1
  26. data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
  27. data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
  28. data/lib/adhearsion/configuration.rb +91 -39
  29. data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
  30. data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
  31. data/lib/adhearsion/error.rb +5 -0
  32. data/lib/adhearsion/event.rb +21 -0
  33. data/lib/adhearsion/event/active_speaker.rb +11 -0
  34. data/lib/adhearsion/event/answered.rb +11 -0
  35. data/lib/adhearsion/event/asterisk.rb +10 -0
  36. data/lib/adhearsion/event/asterisk/ami.rb +34 -0
  37. data/lib/adhearsion/event/complete.rb +75 -0
  38. data/lib/adhearsion/event/dtmf.rb +11 -0
  39. data/lib/adhearsion/event/end.rb +22 -0
  40. data/lib/adhearsion/event/input_timers_started.rb +9 -0
  41. data/lib/adhearsion/event/joined.rb +17 -0
  42. data/lib/adhearsion/event/offer.rb +14 -0
  43. data/lib/adhearsion/event/ringing.rb +11 -0
  44. data/lib/adhearsion/event/started_speaking.rb +13 -0
  45. data/lib/adhearsion/event/stopped_speaking.rb +13 -0
  46. data/lib/adhearsion/event/unjoined.rb +17 -0
  47. data/lib/adhearsion/events.rb +47 -66
  48. data/lib/adhearsion/foundation.rb +0 -1
  49. data/lib/adhearsion/foundation/object.rb +0 -5
  50. data/lib/adhearsion/generators/app/app_generator.rb +4 -1
  51. data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
  52. data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
  53. data/lib/adhearsion/generators/app/templates/config.ru +7 -0
  54. data/lib/adhearsion/generators/app/templates/en.yml +4 -0
  55. data/lib/adhearsion/generators/app/templates/events.erb +2 -2
  56. data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
  57. data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
  58. data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
  59. data/lib/adhearsion/has_headers.rb +34 -0
  60. data/lib/adhearsion/http_server.rb +37 -0
  61. data/lib/adhearsion/initializer.rb +19 -153
  62. data/lib/adhearsion/logging.rb +6 -25
  63. data/lib/adhearsion/outbound_call.rb +5 -5
  64. data/lib/adhearsion/plugin.rb +1 -0
  65. data/lib/adhearsion/protocol_error.rb +26 -0
  66. data/lib/adhearsion/rayo.rb +30 -0
  67. data/lib/adhearsion/rayo/client.rb +62 -0
  68. data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
  69. data/lib/adhearsion/rayo/command.rb +21 -0
  70. data/lib/adhearsion/rayo/command/accept.rb +16 -0
  71. data/lib/adhearsion/rayo/command/answer.rb +16 -0
  72. data/lib/adhearsion/rayo/command/dial.rb +57 -0
  73. data/lib/adhearsion/rayo/command/hangup.rb +16 -0
  74. data/lib/adhearsion/rayo/command/join.rb +43 -0
  75. data/lib/adhearsion/rayo/command/mute.rb +13 -0
  76. data/lib/adhearsion/rayo/command/redirect.rb +23 -0
  77. data/lib/adhearsion/rayo/command/reject.rb +40 -0
  78. data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
  79. data/lib/adhearsion/rayo/command/unmute.rb +13 -0
  80. data/lib/adhearsion/rayo/command_node.rb +47 -0
  81. data/lib/adhearsion/rayo/component.rb +21 -0
  82. data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
  83. data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
  84. data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
  85. data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
  86. data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
  87. data/lib/adhearsion/rayo/component/component_node.rb +90 -0
  88. data/lib/adhearsion/rayo/component/input.rb +186 -0
  89. data/lib/adhearsion/rayo/component/output.rb +471 -0
  90. data/lib/adhearsion/rayo/component/prompt.rb +53 -0
  91. data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
  92. data/lib/adhearsion/rayo/component/record.rb +165 -0
  93. data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
  94. data/lib/adhearsion/rayo/component/stop.rb +11 -0
  95. data/lib/adhearsion/rayo/connection.rb +12 -0
  96. data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
  97. data/lib/adhearsion/rayo/connection/connected.rb +22 -0
  98. data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
  99. data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
  100. data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
  101. data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
  102. data/lib/adhearsion/rayo/rayo_node.rb +127 -0
  103. data/lib/adhearsion/rayo/ref.rb +57 -0
  104. data/lib/adhearsion/statistics.rb +1 -1
  105. data/lib/adhearsion/tasks.rb +1 -2
  106. data/lib/adhearsion/tasks/configuration.rb +1 -1
  107. data/lib/adhearsion/tasks/environment.rb +0 -2
  108. data/lib/adhearsion/tasks/i18n.rb +49 -0
  109. data/lib/adhearsion/translator.rb +11 -0
  110. data/lib/adhearsion/translator/asterisk.rb +234 -0
  111. data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
  112. data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
  113. data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
  114. data/lib/adhearsion/translator/asterisk/call.rb +416 -0
  115. data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
  116. data/lib/adhearsion/translator/asterisk/component.rb +88 -0
  117. data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
  118. data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
  119. data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
  120. data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
  121. data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
  122. data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
  123. data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
  124. data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
  125. data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
  126. data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
  127. data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
  128. data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
  129. data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
  130. data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
  131. data/lib/adhearsion/uri_list.rb +21 -0
  132. data/lib/adhearsion/version.rb +1 -1
  133. data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
  134. data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
  135. data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
  136. data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
  137. data/spec/adhearsion/call_controller/output_spec.rb +162 -215
  138. data/spec/adhearsion/call_controller/record_spec.rb +15 -16
  139. data/spec/adhearsion/call_controller_spec.rb +23 -40
  140. data/spec/adhearsion/call_spec.rb +123 -129
  141. data/spec/adhearsion/calls_spec.rb +3 -3
  142. data/spec/adhearsion/configuration_spec.rb +94 -108
  143. data/spec/adhearsion/event/answered_spec.rb +50 -0
  144. data/spec/adhearsion/event/asterisk/Find Results +402 -0
  145. data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
  146. data/spec/adhearsion/event/complete_spec.rb +176 -0
  147. data/spec/adhearsion/event/dtmf_spec.rb +35 -0
  148. data/spec/adhearsion/event/end_spec.rb +85 -0
  149. data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
  150. data/spec/adhearsion/event/joined_spec.rb +53 -0
  151. data/spec/adhearsion/event/offer_spec.rb +106 -0
  152. data/spec/adhearsion/event/ringing_spec.rb +50 -0
  153. data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
  154. data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
  155. data/spec/adhearsion/event/unjoined_spec.rb +48 -0
  156. data/spec/adhearsion/event/untitled +0 -0
  157. data/spec/adhearsion/events_spec.rb +19 -45
  158. data/spec/adhearsion/initializer_spec.rb +12 -184
  159. data/spec/adhearsion/logging_spec.rb +5 -20
  160. data/spec/adhearsion/outbound_call_spec.rb +13 -13
  161. data/spec/adhearsion/plugin_spec.rb +3 -4
  162. data/spec/adhearsion/protocol_error_spec.rb +91 -0
  163. data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
  164. data/spec/adhearsion/rayo/client_spec.rb +134 -0
  165. data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
  166. data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
  167. data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
  168. data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
  169. data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
  170. data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
  171. data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
  172. data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
  173. data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
  174. data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
  175. data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
  176. data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
  177. data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
  178. data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
  179. data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
  180. data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
  181. data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
  182. data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
  183. data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
  184. data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
  185. data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
  186. data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
  187. data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
  188. data/spec/adhearsion/rayo/ref_spec.rb +168 -0
  189. data/spec/adhearsion/rayo_spec.rb +7 -0
  190. data/spec/adhearsion/router/route_spec.rb +1 -1
  191. data/spec/adhearsion/statistics_spec.rb +2 -5
  192. data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
  193. data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
  194. data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
  195. data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
  196. data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
  197. data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
  198. data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
  199. data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
  200. data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
  201. data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
  202. data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
  203. data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
  204. data/spec/adhearsion/uri_list_spec.rb +88 -0
  205. data/spec/adhearsion_spec.rb +89 -14
  206. data/spec/fixtures/locale/en.yml +13 -0
  207. data/spec/fixtures/locale/it.yml +13 -0
  208. data/spec/spec_helper.rb +18 -5
  209. data/spec/support/call_controller_test_helpers.rb +3 -2
  210. data/spec/support/initializer_stubs.rb +3 -1
  211. data/spec/support/punchblock_examples.rb +65 -0
  212. data/spec/support/punchblock_mocks.rb +12 -0
  213. metadata +412 -70
  214. data/features/cli_daemon.feature +0 -20
  215. data/features/cli_restart.feature +0 -52
  216. data/features/cli_stop.feature +0 -50
  217. data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
  218. data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
  219. data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
  220. data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
  221. data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
  222. data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
  223. data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
  224. data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
  225. data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
  226. data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
  227. data/lib/adhearsion/call_controller/utility.rb +0 -77
  228. data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
  229. data/lib/adhearsion/punchblock_plugin.rb +0 -63
  230. data/scripts/cloc-1.64.pl +0 -10483
  231. data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
  232. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
  233. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
  234. data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
  235. data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
  236. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
  237. data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
  238. data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
  239. data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
  240. data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
  241. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
  242. data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
@@ -57,18 +57,8 @@ describe Adhearsion::Logging do
57
57
  expect(::Logging.logger.root.appenders.select{|a| a.is_a?(::Logging::Appenders::Stdout)}.length).to eql(1)
58
58
  end
59
59
 
60
- it "initializes properly a Logging object with appenders as parameter" do
61
- Adhearsion::Logging.start([::Logging.appenders.stdout, ::Logging.appenders.file('example.log')])
62
- expect(::Logging.logger.root.appenders.length).to eql(2)
63
- expect(::Logging.logger.root.appenders.select{|a| a.is_a?(::Logging::Appenders::Stdout)}.length).to eql(1)
64
- expect(::Logging.logger.root.appenders.select{|a| a.is_a?(::Logging::Appenders::File)}.length).to eql(1)
65
- end
66
-
67
- it "initializes properly a Logging object with appenders and log level as parameter" do
68
- Adhearsion::Logging.start([::Logging.appenders.stdout, ::Logging.appenders.file('example.log')], :debug)
69
- expect(::Logging.logger.root.appenders.length).to eql(2)
70
- expect(::Logging.logger.root.appenders.select{|a| a.is_a?(::Logging::Appenders::Stdout)}.length).to eql(1)
71
- expect(::Logging.logger.root.appenders.select{|a| a.is_a?(::Logging::Appenders::File)}.length).to eql(1)
60
+ it "initializes properly a Logging object with log level as parameter" do
61
+ Adhearsion::Logging.start(:debug)
72
62
  expect(::Logging.logger.root.level).to eql(::Logging::LEVELS["debug"])
73
63
  end
74
64
 
@@ -85,20 +75,15 @@ describe Adhearsion::Logging do
85
75
  expect(_foo_logger.object_id).not_to eql(_bar_logger)
86
76
  end
87
77
 
88
- it 'should reopen logfiles' do
89
- expect(::Logging).to receive(:reopen).once
90
- Adhearsion::Logging.reopen_logs
91
- end
92
-
93
78
  it 'should toggle between :trace and the configured log level' do
94
- orig_level = Adhearsion.config.platform.logging['level']
95
- Adhearsion.config.platform.logging['level'] = :warn
79
+ orig_level = Adhearsion.config.core.logging['level']
80
+ Adhearsion.config.core.logging['level'] = :warn
96
81
  Adhearsion::Logging.level = :warn
97
82
  Adhearsion::Logging.toggle_trace!
98
83
  expect(Adhearsion::Logging.level).to eq(0)
99
84
  Adhearsion::Logging.toggle_trace!
100
85
  expect(Adhearsion::Logging.level).to eq(3)
101
- Adhearsion.config.platform.logging['level'] = orig_level
86
+ Adhearsion.config.core.logging['level'] = orig_level
102
87
  end
103
88
 
104
89
  describe 'level changing' do
@@ -16,10 +16,10 @@ module Adhearsion
16
16
  it { is_expected.to eq({}) }
17
17
  end
18
18
 
19
- let(:mock_client) { double 'Punchblock Client', execute_command: true, new_call_uri: call_uri }
19
+ let(:mock_client) { double 'Rayo Client', execute_command: true, new_call_uri: call_uri }
20
20
 
21
21
  before do
22
- PunchblockPlugin::Initializer.client = mock_client
22
+ Adhearsion::Rayo::Initializer.client = mock_client
23
23
  Adhearsion.active_calls.clear
24
24
  end
25
25
 
@@ -67,7 +67,7 @@ module Adhearsion
67
67
 
68
68
  expect(Adhearsion.router).to receive(:handle).once.with(mock_call)
69
69
 
70
- OutboundCall.originate(to) << Punchblock::Event::Answered.new
70
+ OutboundCall.originate(to) << Adhearsion::Event::Answered.new
71
71
  end
72
72
 
73
73
  context "when a controller class is specified for the call" do
@@ -77,7 +77,7 @@ module Adhearsion
77
77
  expect(mock_call).to receive(:dial).once.with(to, {})
78
78
  expect(mock_call).to receive(:execute_controller).once.with kind_of(controller), kind_of(Proc)
79
79
  call = OutboundCall.originate to, :controller => controller
80
- call << Punchblock::Event::Answered.new
80
+ call << Adhearsion::Event::Answered.new
81
81
  end
82
82
 
83
83
  it "should hangup the call after all controllers have executed" do
@@ -85,7 +85,7 @@ module Adhearsion
85
85
  expect(mock_call).to receive(:hangup).once
86
86
 
87
87
  call = OutboundCall.originate to, :controller => controller
88
- call << Punchblock::Event::Answered.new
88
+ call << Adhearsion::Event::Answered.new
89
89
  sleep 0.5
90
90
  end
91
91
 
@@ -95,7 +95,7 @@ module Adhearsion
95
95
  expected_controller = controller.new mock_call, foo: 'bar'
96
96
  expect(mock_call).to receive(:execute_controller).with(expected_controller, kind_of(Proc)).once
97
97
  call = OutboundCall.originate to, :controller => controller, :controller_metadata => {:foo => 'bar'}
98
- call << Punchblock::Event::Answered.new
98
+ call << Adhearsion::Event::Answered.new
99
99
  end
100
100
  end
101
101
  end
@@ -110,14 +110,14 @@ module Adhearsion
110
110
  call = OutboundCall.originate to do
111
111
  :foobar
112
112
  end
113
- call << Punchblock::Event::Answered.new
113
+ call << Adhearsion::Event::Answered.new
114
114
  end
115
115
  end
116
116
 
117
117
  context "when the dial fails" do
118
118
  before do
119
119
  expect(subject.wrapped_object).to receive(:write_command)
120
- expect_any_instance_of(Punchblock::Command::Dial).to receive(:response).and_return StandardError.new("User not registered")
120
+ expect_any_instance_of(Adhearsion::Rayo::Command::Dial).to receive(:response).and_return StandardError.new("User not registered")
121
121
  end
122
122
 
123
123
  after do
@@ -140,7 +140,7 @@ module Adhearsion
140
140
  let(:response) { double 'Response' }
141
141
 
142
142
  describe "for answered events" do
143
- let(:event) { Punchblock::Event::Answered.new }
143
+ let(:event) { Adhearsion::Event::Answered.new }
144
144
 
145
145
  it "should trigger any on_answer callbacks set" do
146
146
  expect(response).to receive(:call).once.with(event)
@@ -173,12 +173,12 @@ module Adhearsion
173
173
  def expect_message_waiting_for_response(message, uri = call_uri)
174
174
  expect(subject.wrapped_object).to receive(:write_and_await_response).once.with(message, 60, true) do |real_message|
175
175
  real_message.request!
176
- real_message.response = Punchblock::Ref.new(uri: uri)
176
+ real_message.response = Adhearsion::Rayo::Ref.new(uri: uri)
177
177
  real_message
178
178
  end
179
179
  end
180
180
 
181
- let(:expected_dial_command) { Punchblock::Command::Dial.new(:to => to, :from => from, :uri => call_uri) }
181
+ let(:expected_dial_command) { Adhearsion::Rayo::Command::Dial.new(:to => to, :from => from, :uri => call_uri) }
182
182
 
183
183
  context "while waiting for a response" do
184
184
  before do
@@ -221,7 +221,7 @@ module Adhearsion
221
221
 
222
222
  it "should set the dial command" do
223
223
  subject.dial to, :from => from
224
- expect(subject.dial_command).to eq(Punchblock::Command::Dial.new(:to => to, :from => from, :uri => call_uri, target_call_id: call_id, domain: domain, transport: transport))
224
+ expect(subject.dial_command).to eq(Adhearsion::Rayo::Command::Dial.new(:to => to, :from => from, :uri => call_uri, target_call_id: call_id, domain: domain, transport: transport))
225
225
  end
226
226
 
227
227
  it "should set the URI from the reference" do
@@ -296,7 +296,7 @@ module Adhearsion
296
296
  context "when the dial fails" do
297
297
  before do
298
298
  expect(subject.wrapped_object).to receive(:write_command)
299
- expect_any_instance_of(Punchblock::Command::Dial).to receive(:response).and_return StandardError.new("User not registered")
299
+ expect_any_instance_of(Adhearsion::Rayo::Command::Dial).to receive(:response).and_return StandardError.new("User not registered")
300
300
  end
301
301
 
302
302
  after do
@@ -12,7 +12,7 @@ describe Adhearsion::Plugin do
12
12
  end
13
13
 
14
14
  before do
15
- allow(Adhearsion::PunchblockPlugin::Initializer).to receive_messages :start => true
15
+ allow(Adhearsion::Rayo::Initializer).to receive_messages :start => true
16
16
  end
17
17
 
18
18
  describe "inheritance" do
@@ -147,8 +147,7 @@ describe Adhearsion::Plugin do
147
147
  it "should do nothing with a Plugin that has no init method call" do
148
148
  FooBar = Class.new Adhearsion::Plugin
149
149
 
150
- # 1 => Punchblock. Must be empty once punchblock initializer is an external Plugin
151
- expect(Adhearsion::Plugin.initializers.size).to eq(1)
150
+ expect(Adhearsion::Plugin.initializers.size).to eq(0)
152
151
  Adhearsion::Plugin.init_plugins
153
152
  end
154
153
 
@@ -243,7 +242,7 @@ describe Adhearsion::Plugin do
243
242
  it "should do nothing with a Plugin that has no run method call" do
244
243
  FooBar = Class.new Adhearsion::Plugin
245
244
 
246
- # May become 1 if Punchblock defines a runner.
245
+ # May become 1 if Rayo defines a runner.
247
246
  expect(Adhearsion::Plugin.runners.size).to eq(0)
248
247
  Adhearsion::Plugin.run_plugins
249
248
  end
@@ -0,0 +1,91 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::ProtocolError do
6
+ let(:name) { :item_not_found }
7
+ let(:text) { 'Could not find call [id=f6d437f4-1e18-457b-99f8-b5d853f50347]' }
8
+ let(:call_id) { 'f6d437f4-1e18-457b-99f8-b5d853f50347' }
9
+ let(:component_id) { 'abc123' }
10
+ subject { described_class.new.setup name, text, call_id, component_id }
11
+
12
+ describe '#inspect' do
13
+ subject { super().inspect }
14
+ it { is_expected.to eq('#<Adhearsion::ProtocolError: name=:item_not_found text="Could not find call [id=f6d437f4-1e18-457b-99f8-b5d853f50347]" call_id="f6d437f4-1e18-457b-99f8-b5d853f50347" component_id="abc123">') }
15
+ end
16
+
17
+ describe ".exception" do
18
+ context "with no arguments" do
19
+ it "returns the original object" do
20
+ expect(described_class.exception).to eq(described_class.new)
21
+ end
22
+ end
23
+
24
+ context "with self as the argument" do
25
+ it "returns the original object" do
26
+ expect(described_class.exception(subject)).to eq(described_class.new(subject.to_s))
27
+ end
28
+ end
29
+
30
+ context "with other values" do
31
+ it "returns a new object with the appropriate values" do
32
+ e = described_class.exception 'FooBar'
33
+ expect(e.name).to eq(nil)
34
+ expect(e.text).to eq(nil)
35
+ expect(e.call_id).to eq(nil)
36
+ expect(e.component_id).to eq(nil)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "#exception" do
42
+ context "with no arguments" do
43
+ it "returns the original object" do
44
+ expect(subject.exception).to be subject
45
+ end
46
+ end
47
+
48
+ context "with self as the argument" do
49
+ it "returns the original object" do
50
+ expect(subject.exception(subject)).to be subject
51
+ end
52
+ end
53
+
54
+ context "with other values" do
55
+ it "returns a new object with the appropriate values" do
56
+ e = subject.exception("Boo")
57
+ expect(e.name).to eq(name)
58
+ expect(e.text).to eq(text)
59
+ expect(e.call_id).to eq(call_id)
60
+ expect(e.component_id).to eq(component_id)
61
+ end
62
+ end
63
+ end
64
+
65
+ describe "comparison" do
66
+ context "with the same name, text, call ID and component ID" do
67
+ let(:comparison) { described_class.new.setup name, text, call_id, component_id }
68
+ it { is_expected.to eq(comparison) }
69
+ end
70
+
71
+ context "with a different name" do
72
+ let(:comparison) { described_class.new.setup :foo, text, call_id, component_id }
73
+ it { is_expected.not_to eq(comparison) }
74
+ end
75
+
76
+ context "with a different text" do
77
+ let(:comparison) { described_class.new.setup name, 'foo', call_id, component_id }
78
+ it { is_expected.not_to eq(comparison) }
79
+ end
80
+
81
+ context "with a different call ID" do
82
+ let(:comparison) { described_class.new.setup name, text, 'foo', component_id }
83
+ it { is_expected.not_to eq(comparison) }
84
+ end
85
+
86
+ context "with a different component ID" do
87
+ let(:comparison) { described_class.new.setup name, text, call_id, 'foo' }
88
+ it { is_expected.not_to eq(comparison) }
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Adhearsion
6
+ module Rayo
7
+ class Client
8
+ describe ComponentRegistry do
9
+ let(:uri) { 'abc123' }
10
+ let(:component) { double 'Component', source_uri: uri }
11
+
12
+ it 'should store components and allow lookup by ID' do
13
+ subject << component
14
+ expect(subject.find_by_uri(uri)).to be component
15
+ end
16
+
17
+ it 'should allow deletion of components' do
18
+ subject << component
19
+ expect(subject.find_by_uri(uri)).to be component
20
+ subject.delete component
21
+ expect(subject.find_by_uri(uri)).to be_nil
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,134 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Client do
6
+ let(:connection) { Adhearsion::Rayo::Connection::XMPP.new :username => '1@call.rayo.net', :password => 1 }
7
+
8
+ subject { described_class.new :connection => connection }
9
+
10
+ describe '#connection' do
11
+ subject { super().connection }
12
+ it { is_expected.to be connection }
13
+ end
14
+
15
+ describe '#component_registry' do
16
+ subject { super().component_registry }
17
+ it { is_expected.to be_a described_class::ComponentRegistry }
18
+ end
19
+
20
+ let(:call_id) { 'abc123' }
21
+ let(:mock_event) { double('Event').as_null_object }
22
+ let(:component_id) { 'abc123' }
23
+ let(:component_uri) { 'callid@server/abc123' }
24
+ let(:mock_component) { double 'Component', source_uri: component_uri }
25
+ let(:mock_command) { double 'Command' }
26
+
27
+ describe '#run' do
28
+ it 'should start up the connection' do
29
+ expect(connection).to receive(:run).once
30
+ subject.run
31
+ end
32
+ end
33
+
34
+ describe '#stop' do
35
+ it 'should stop the connection' do
36
+ expect(connection).to receive(:stop).once
37
+ subject.stop
38
+ end
39
+ end
40
+
41
+ describe '#send_message' do
42
+ it 'should send a message' do
43
+ args = [ "someone", "example.org", "Hello World!" ]
44
+ expect(connection).to receive(:send_message).with(*args).once
45
+ subject.send_message *args
46
+ end
47
+ end
48
+
49
+ describe '#new_call_uri' do
50
+ it 'should return the connection-specific fresh call ID' do
51
+ stub_uuids 'foobar'
52
+ expect(subject.new_call_uri).to eq('xmpp:foobar@call.rayo.net')
53
+ end
54
+ end
55
+
56
+ it 'should handle connection events' do
57
+ expect(subject).to receive(:handle_event).with(mock_event).once
58
+ connection.event_handler.call mock_event
59
+ end
60
+
61
+ describe '#handle_event' do
62
+ it "sets the event's client" do
63
+ event = Adhearsion::Event::Offer.new
64
+ subject.handle_event event
65
+ expect(event.client).to be subject
66
+ end
67
+
68
+ context 'if the event can be associated with a source component' do
69
+ before do
70
+ allow(mock_event).to receive_messages :source => mock_component
71
+ expect(mock_component).to receive(:add_event).with mock_event
72
+ end
73
+
74
+ it 'should not call event handlers' do
75
+ handler = double 'handler'
76
+ expect(handler).to receive(:call).never
77
+ subject.register_event_handler do |event|
78
+ handler.call event
79
+ end
80
+ subject.handle_event mock_event
81
+ end
82
+ end
83
+
84
+ context 'if the event cannot be associated with a source component' do
85
+ before do
86
+ allow(mock_event).to receive_messages :source => nil
87
+ end
88
+
89
+ it 'should call registered event handlers' do
90
+ handler = double 'handler'
91
+ expect(handler).to receive(:call).once.with mock_event
92
+ subject.register_event_handler do |event|
93
+ handler.call event
94
+ end
95
+ subject.handle_event mock_event
96
+ end
97
+ end
98
+ end
99
+
100
+ it 'should be able to register and retrieve components' do
101
+ subject.register_component mock_component
102
+ expect(subject.find_component_by_uri(component_uri)).to be mock_component
103
+ end
104
+
105
+ describe '#execute_command' do
106
+ let(:component) { Adhearsion::Rayo::Component::Output.new }
107
+ let(:event) { Adhearsion::Event::Complete.new }
108
+
109
+ before do
110
+ expect(connection).to receive(:write).once.with component, :call_id => call_id
111
+ end
112
+
113
+ let :execute_command do
114
+ subject.execute_command component, :call_id => call_id
115
+ end
116
+
117
+ it 'should write the command to the connection' do
118
+ execute_command
119
+ end
120
+
121
+ it "should set the command's client" do
122
+ execute_command
123
+ expect(component.client).to be subject
124
+ end
125
+
126
+ it "should handle a component's events" do
127
+ expect(subject).to receive(:trigger_handler).with(:event, event).once
128
+ execute_command
129
+ component.request!
130
+ component.execute!
131
+ component.add_event event
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Accept do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:accept, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let(:stanza) do
12
+ <<-STANZA
13
+ <accept xmlns="urn:xmpp:rayo:1">
14
+ <header name="X-skill" value="agent" />
15
+ <header name="X-customer-id" value="8877" />
16
+ </accept>
17
+ STANZA
18
+ end
19
+
20
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
21
+
22
+ it { is_expected.to be_instance_of described_class }
23
+
24
+ describe '#headers' do
25
+ subject { super().headers }
26
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
27
+ end
28
+
29
+ context "with no headers provided" do
30
+ let(:stanza) { '<accept xmlns="urn:xmpp:rayo:1"/>' }
31
+
32
+ describe '#headers' do
33
+ subject { super().headers }
34
+ it { is_expected.to eq({}) }
35
+ end
36
+ end
37
+ end
38
+
39
+ describe "when setting options in initializer" do
40
+ subject { described_class.new headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
41
+
42
+ describe '#headers' do
43
+ subject { super().headers }
44
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
45
+ end
46
+
47
+ describe "exporting to Rayo" do
48
+ it "should export to XML that can be understood by its parser" do
49
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
50
+ expect(new_instance).to be_instance_of described_class
51
+ expect(new_instance.headers).to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' })
52
+ end
53
+
54
+ it "should render to a parent node if supplied" do
55
+ doc = Nokogiri::XML::Document.new
56
+ parent = Nokogiri::XML::Node.new 'foo', doc
57
+ doc.root = parent
58
+ rayo_doc = subject.to_rayo(parent)
59
+ expect(rayo_doc).to eq(parent)
60
+ end
61
+ end
62
+ end
63
+ end