adhearsion 2.6.4 → 3.0.0.beta1

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 (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
@@ -0,0 +1,73 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Answer do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:answer, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let(:stanza) do
12
+ <<-STANZA
13
+ <answer xmlns="urn:xmpp:rayo:1">
14
+ <header name="X-skill" value="agent" />
15
+ <header name="X-customer-id" value="8877" />
16
+ </answer>
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) { '<answer 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
+
62
+ context "with multiple headers of the same name" do
63
+ subject { described_class.new headers: { 'X-skill' => ['sales', 'complaints'] } }
64
+
65
+ it "should export to XML that can be understood by its parser" do
66
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
67
+ expect(new_instance).to be_instance_of described_class
68
+ expect(new_instance.headers).to eq({ 'X-skill' => ['sales', 'complaints'] })
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,156 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Dial do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:dial, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ let(:join_params) { {:call_uri => 'abc123'} }
11
+
12
+ describe "when setting options in initializer" do
13
+ subject { described_class.new to: 'tel:+14155551212', from: 'tel:+13035551212', uri: 'xmpp:foo@bar.com', timeout: 30000, headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' }, join: join_params }
14
+
15
+ describe '#to' do
16
+ subject { super().to }
17
+ it { is_expected.to eq('tel:+14155551212') }
18
+ end
19
+
20
+ describe '#from' do
21
+ subject { super().from }
22
+ it { is_expected.to eq('tel:+13035551212') }
23
+ end
24
+
25
+ describe '#uri' do
26
+ subject { super().uri }
27
+ it { is_expected.to eq('xmpp:foo@bar.com') }
28
+ end
29
+
30
+ describe '#timeout' do
31
+ subject { super().timeout }
32
+ it { is_expected.to eq(30000) }
33
+ end
34
+
35
+ describe '#join' do
36
+ subject { super().join }
37
+ it { is_expected.to eq(Adhearsion::Rayo::Command::Join.new(join_params)) }
38
+ end
39
+
40
+ describe '#headers' do
41
+ subject { super().headers }
42
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
43
+ end
44
+
45
+ describe "exporting to Rayo" do
46
+ it "should export to XML that can be understood by its parser" do
47
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
48
+ expect(new_instance).to be_instance_of described_class
49
+ expect(new_instance.to).to eq('tel:+14155551212')
50
+ expect(new_instance.from).to eq('tel:+13035551212')
51
+ expect(new_instance.uri).to eq('xmpp:foo@bar.com')
52
+ expect(new_instance.timeout).to eq(30000)
53
+ expect(new_instance.join).to eq(Adhearsion::Rayo::Command::Join.new(join_params))
54
+ expect(new_instance.headers).to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' })
55
+ end
56
+
57
+ it "should render to a parent node if supplied" do
58
+ doc = Nokogiri::XML::Document.new
59
+ parent = Nokogiri::XML::Node.new 'foo', doc
60
+ doc.root = parent
61
+ rayo_doc = subject.to_rayo(parent)
62
+ expect(rayo_doc).to eq(parent)
63
+ end
64
+
65
+ context "when attributes are not set" do
66
+ subject { described_class.new to: 'abc123' }
67
+
68
+ it "should not include them in the XML representation" do
69
+ expect(subject.to_rayo['to']).to eq('abc123')
70
+ expect(subject.to_rayo['from']).to be_nil
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ describe "from a stanza" do
77
+ let :stanza do
78
+ <<-MESSAGE
79
+ <dial to='tel:+14155551212' from='tel:+13035551212' uri='xmpp:foo@bar.com' timeout='30000' xmlns='urn:xmpp:rayo:1'>
80
+ <join call-uri="abc123" />
81
+ <header name="X-skill" value="agent" />
82
+ <header name="X-customer-id" value="8877" />
83
+ </dial>
84
+ MESSAGE
85
+ end
86
+
87
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
88
+
89
+ it { is_expected.to be_instance_of described_class }
90
+
91
+ describe '#to' do
92
+ subject { super().to }
93
+ it { is_expected.to eq('tel:+14155551212') }
94
+ end
95
+
96
+ describe '#from' do
97
+ subject { super().from }
98
+ it { is_expected.to eq('tel:+13035551212') }
99
+ end
100
+
101
+ describe '#uri' do
102
+ subject { super().uri }
103
+ it { is_expected.to eq('xmpp:foo@bar.com') }
104
+ end
105
+
106
+ describe '#timeout' do
107
+ subject { super().timeout }
108
+ it { is_expected.to eq(30000) }
109
+ end
110
+
111
+ describe '#join' do
112
+ subject { super().join }
113
+ it { is_expected.to eq(Adhearsion::Rayo::Command::Join.new(join_params)) }
114
+ end
115
+
116
+ describe '#headers' do
117
+ subject { super().headers }
118
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
119
+ end
120
+
121
+ context "with no headers provided" do
122
+ let(:stanza) { '<dial xmlns="urn:xmpp:rayo:1"/>' }
123
+
124
+ describe '#headers' do
125
+ subject { super().headers }
126
+ it { is_expected.to eq({}) }
127
+ end
128
+ end
129
+ end
130
+
131
+ describe "#response=" do
132
+ before { subject.request! }
133
+
134
+ let(:call_id) { 'abc123' }
135
+ let(:domain) { 'rayo.net' }
136
+
137
+ let :ref do
138
+ Adhearsion::Rayo::Ref.new uri: "xmpp:#{call_id}@#{domain}"
139
+ end
140
+
141
+ it "should set the transport from the ref" do
142
+ subject.response = ref
143
+ expect(subject.transport).to eq('xmpp')
144
+ end
145
+
146
+ it "should set the call ID from the ref" do
147
+ subject.response = ref
148
+ expect(subject.target_call_id).to eq(call_id)
149
+ end
150
+
151
+ it "should set the domain from the ref" do
152
+ subject.response = ref
153
+ expect(subject.domain).to eq(domain)
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Hangup do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:hangup, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let(:stanza) do
12
+ <<-STANZA
13
+ <hangup xmlns="urn:xmpp:rayo:1">
14
+ <header name="X-skill" value="agent" />
15
+ <header name="X-customer-id" value="8877" />
16
+ </hangup>
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) { '<hangup 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
@@ -0,0 +1,158 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Join do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:join, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "when setting options in initializer" do
11
+ subject { described_class.new :call_uri => 'abc123', :mixer_name => 'blah', :direction => :duplex, :media => :bridge }
12
+
13
+ describe '#call_uri' do
14
+ subject { super().call_uri }
15
+ it { is_expected.to eq('abc123') }
16
+ end
17
+
18
+ describe '#mixer_name' do
19
+ subject { super().mixer_name }
20
+ it { is_expected.to eq('blah') }
21
+ end
22
+
23
+ describe '#direction' do
24
+ subject { super().direction }
25
+ it { is_expected.to eq(:duplex) }
26
+ end
27
+
28
+ describe '#media' do
29
+ subject { super().media }
30
+ it { is_expected.to eq(:bridge) }
31
+ end
32
+
33
+ context "with old call_id attribute" do
34
+ subject { described_class.new call_id: 'abc123' }
35
+
36
+ describe '#call_uri' do
37
+ subject { super().call_uri }
38
+ it { is_expected.to eq('abc123') }
39
+ end
40
+ end
41
+
42
+ describe "exporting to Rayo" do
43
+ it "should export to XML that can be understood by its parser" do
44
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
45
+ expect(new_instance).to be_instance_of described_class
46
+ expect(new_instance.call_uri).to eq('abc123')
47
+ expect(new_instance.mixer_name).to eq('blah')
48
+ expect(new_instance.direction).to eq(:duplex)
49
+ expect(new_instance.media).to eq(:bridge)
50
+ end
51
+
52
+ it "should render to a parent node if supplied" do
53
+ doc = Nokogiri::XML::Document.new
54
+ parent = Nokogiri::XML::Node.new 'foo', doc
55
+ doc.root = parent
56
+ rayo_doc = subject.to_rayo(parent)
57
+ expect(rayo_doc).to eq(parent)
58
+ end
59
+
60
+ context "when attributes are not set" do
61
+ subject { described_class.new call_uri: 'abc123' }
62
+
63
+ it "should not include them in the XML representation" do
64
+ expect(subject.to_rayo['call-uri']).to eq('abc123')
65
+ expect(subject.to_rayo['mixer-name']).to be_nil
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "from a stanza" do
72
+ let :stanza do
73
+ <<-MESSAGE
74
+ <join xmlns="urn:xmpp:rayo:1"
75
+ call-uri="abc123"
76
+ mixer-name="blah"
77
+ direction="duplex"
78
+ media="bridge" />
79
+ MESSAGE
80
+ end
81
+
82
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
83
+
84
+ it { is_expected.to be_instance_of described_class }
85
+
86
+ describe '#call_uri' do
87
+ subject { super().call_uri }
88
+ it { is_expected.to eq('abc123') }
89
+ end
90
+
91
+ describe '#mixer_name' do
92
+ subject { super().mixer_name }
93
+ it { is_expected.to eq('blah') }
94
+ end
95
+
96
+ describe '#direction' do
97
+ subject { super().direction }
98
+ it { is_expected.to eq(:duplex) }
99
+ end
100
+
101
+ describe '#media' do
102
+ subject { super().media }
103
+ it { is_expected.to eq(:bridge) }
104
+ end
105
+
106
+ context "when no attributes are set" do
107
+ let(:stanza) { '<join xmlns="urn:xmpp:rayo:1" />' }
108
+
109
+ describe '#call_uri' do
110
+ subject { super().call_uri }
111
+ it { is_expected.to be_nil }
112
+ end
113
+
114
+ describe '#mixer_name' do
115
+ subject { super().mixer_name }
116
+ it { is_expected.to be_nil }
117
+ end
118
+
119
+ describe '#direction' do
120
+ subject { super().direction }
121
+ it { is_expected.to be_nil }
122
+ end
123
+
124
+ describe '#media' do
125
+ subject { super().media }
126
+ it { is_expected.to be_nil }
127
+ end
128
+ end
129
+ end
130
+
131
+ describe "with a direction" do
132
+ [nil, :duplex, :send, :recv].each do |direction|
133
+ describe direction.to_s do
134
+ subject { described_class.new :direction => direction }
135
+
136
+ describe '#direction' do
137
+ subject { super().direction }
138
+ it { is_expected.to eq(direction) }
139
+ end
140
+ end
141
+ end
142
+
143
+ describe "no direction" do
144
+ subject { described_class.new }
145
+
146
+ describe '#direction' do
147
+ subject { super().direction }
148
+ it { is_expected.to be_nil }
149
+ end
150
+ end
151
+
152
+ describe "blahblahblah" do
153
+ it "should raise an error" do
154
+ expect { described_class.new(:direction => :blahblahblah) }.to raise_error ArgumentError
155
+ end
156
+ end
157
+ end
158
+ end