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,32 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Mute do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:mute, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let(:stanza) { '<mute xmlns="urn:xmpp:rayo:1"/>' }
12
+
13
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
14
+
15
+ it { is_expected.to be_instance_of described_class }
16
+ end
17
+
18
+ describe "exporting to Rayo" do
19
+ it "should export to XML that can be understood by its parser" do
20
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
21
+ expect(new_instance).to be_instance_of described_class
22
+ end
23
+
24
+ it "should render to a parent node if supplied" do
25
+ doc = Nokogiri::XML::Document.new
26
+ parent = Nokogiri::XML::Node.new 'foo', doc
27
+ doc.root = parent
28
+ rayo_doc = subject.to_rayo(parent)
29
+ expect(rayo_doc).to eq(parent)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Redirect do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:redirect, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "when setting options in initializer" do
11
+ subject { described_class.new to: 'tel:+14045551234', headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
12
+
13
+ describe '#to' do
14
+ subject { super().to }
15
+ it { is_expected.to eq('tel:+14045551234') }
16
+ end
17
+
18
+ describe '#headers' do
19
+ subject { super().headers }
20
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
21
+ end
22
+
23
+ describe "exporting to Rayo" do
24
+ it "should export to XML that can be understood by its parser" do
25
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
26
+ expect(new_instance).to be_instance_of described_class
27
+ expect(new_instance.to).to eq('tel:+14045551234')
28
+ expect(new_instance.headers).to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' })
29
+ end
30
+
31
+ it "should render to a parent node if supplied" do
32
+ doc = Nokogiri::XML::Document.new
33
+ parent = Nokogiri::XML::Node.new 'foo', doc
34
+ doc.root = parent
35
+ rayo_doc = subject.to_rayo(parent)
36
+ expect(rayo_doc).to eq(parent)
37
+ end
38
+
39
+ context "when attributes are not set" do
40
+ subject { described_class.new }
41
+
42
+ it "should not include them in the XML representation" do
43
+ expect(subject.to_rayo['to']).to be_nil
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ describe "from a stanza" do
50
+ let :stanza do
51
+ <<-MESSAGE
52
+ <redirect xmlns='urn:xmpp:rayo:1'
53
+ to='tel:+14045551234'>
54
+ <!-- Signaling (e.g. SIP) Headers -->
55
+ <header name="X-skill" value="agent" />
56
+ <header name="X-customer-id" value="8877" />
57
+ </redirect>
58
+ MESSAGE
59
+ end
60
+
61
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
62
+
63
+ it { is_expected.to be_instance_of described_class }
64
+
65
+ describe '#to' do
66
+ subject { super().to }
67
+ it { is_expected.to eq('tel:+14045551234') }
68
+ end
69
+
70
+ describe '#headers' do
71
+ subject { super().headers }
72
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
73
+ end
74
+
75
+ context "with no headers or to provided" do
76
+ let(:stanza) { '<redirect xmlns="urn:xmpp:rayo:1"/>' }
77
+
78
+ describe '#to' do
79
+ subject { super().to }
80
+ it { is_expected.to be_nil }
81
+ end
82
+
83
+ describe '#headers' do
84
+ subject { super().headers }
85
+ it { is_expected.to eq({}) }
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,117 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Reject do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:reject, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "when setting options in initializer" do
11
+ subject { described_class.new reason: :busy, headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
12
+
13
+ describe '#reason' do
14
+ subject { super().reason }
15
+ it { is_expected.to eq(:busy) }
16
+ end
17
+
18
+ describe '#headers' do
19
+ subject { super().headers }
20
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
21
+ end
22
+
23
+ describe "exporting to Rayo" do
24
+ it "should export to XML that can be understood by its parser" do
25
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
26
+ expect(new_instance).to be_instance_of described_class
27
+ expect(new_instance.reason).to eq(:busy)
28
+ expect(new_instance.headers).to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' })
29
+ end
30
+
31
+ it "should render to a parent node if supplied" do
32
+ doc = Nokogiri::XML::Document.new
33
+ parent = Nokogiri::XML::Node.new 'foo', doc
34
+ doc.root = parent
35
+ rayo_doc = subject.to_rayo(parent)
36
+ expect(rayo_doc).to eq(parent)
37
+ end
38
+
39
+ context "when attributes are not set" do
40
+ subject { described_class.new }
41
+
42
+ it "should not include them in the XML representation" do
43
+ expect(subject.to_rayo.children.count).to eq(0)
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ describe "from a stanza" do
50
+ let :stanza do
51
+ <<-MESSAGE
52
+ <reject xmlns='urn:xmpp:rayo:1'>
53
+ <busy />
54
+ <!-- Sample Headers (optional) -->
55
+ <header name="X-skill" value="agent" />
56
+ <header name="X-customer-id" value="8877" />
57
+ </reject>
58
+ MESSAGE
59
+ end
60
+
61
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
62
+
63
+ it { is_expected.to be_instance_of described_class }
64
+
65
+ describe '#reason' do
66
+ subject { super().reason }
67
+ it { is_expected.to eq(:busy) }
68
+ end
69
+
70
+ describe '#headers' do
71
+ subject { super().headers }
72
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
73
+ end
74
+
75
+ context "with no headers or reason provided" do
76
+ let(:stanza) { '<reject xmlns="urn:xmpp:rayo:1"/>' }
77
+
78
+ describe '#reason' do
79
+ subject { super().reason }
80
+ it { is_expected.to be_nil }
81
+ end
82
+
83
+ describe '#headers' do
84
+ subject { super().headers }
85
+ it { is_expected.to eq({}) }
86
+ end
87
+ end
88
+ end
89
+
90
+ describe "with the reason" do
91
+ [nil, :decline, :busy, :error].each do |reason|
92
+ describe reason.to_s do
93
+ subject { described_class.new :reason => reason }
94
+
95
+ describe '#reason' do
96
+ subject { super().reason }
97
+ it { is_expected.to eq(reason) }
98
+ end
99
+ end
100
+ end
101
+
102
+ describe "no reason" do
103
+ subject { described_class.new }
104
+
105
+ describe '#reason' do
106
+ subject { super().reason }
107
+ it { is_expected.to be_nil }
108
+ end
109
+ end
110
+
111
+ describe "blahblahblah" do
112
+ it "should raise an error" do
113
+ expect { described_class.new(:reason => :blahblahblah) }.to raise_error ArgumentError
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,82 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Unjoin do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:unjoin, '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' }
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
+ context "with old call_id attribute" do
24
+ subject { described_class.new call_id: 'abc123' }
25
+
26
+ describe '#call_uri' do
27
+ subject { super().call_uri }
28
+ it { is_expected.to eq('abc123') }
29
+ end
30
+ end
31
+
32
+ describe "exporting to Rayo" do
33
+ it "should export to XML that can be understood by its parser" do
34
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
35
+ expect(new_instance).to be_instance_of described_class
36
+ expect(new_instance.call_uri).to eq('abc123')
37
+ expect(new_instance.mixer_name).to eq('blah')
38
+ end
39
+
40
+ it "should render to a parent node if supplied" do
41
+ doc = Nokogiri::XML::Document.new
42
+ parent = Nokogiri::XML::Node.new 'foo', doc
43
+ doc.root = parent
44
+ rayo_doc = subject.to_rayo(parent)
45
+ expect(rayo_doc).to eq(parent)
46
+ end
47
+
48
+ context "when attributes are not set" do
49
+ subject { described_class.new call_uri: 'abc123' }
50
+
51
+ it "should not include them in the XML representation" do
52
+ expect(subject.to_rayo['call-uri']).to eq('abc123')
53
+ expect(subject.to_rayo['mixer-name']).to be_nil
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "from a stanza" do
60
+ let :stanza do
61
+ <<-MESSAGE
62
+ <unjoin xmlns="urn:xmpp:rayo:1"
63
+ call-uri="abc123"
64
+ mixer-name="blah" />
65
+ MESSAGE
66
+ end
67
+
68
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
69
+
70
+ it { is_expected.to be_instance_of described_class }
71
+
72
+ describe '#call_uri' do
73
+ subject { super().call_uri }
74
+ it { is_expected.to eq('abc123') }
75
+ end
76
+
77
+ describe '#mixer_name' do
78
+ subject { super().mixer_name }
79
+ it { is_expected.to eq('blah') }
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::Command::Unmute do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:unmute, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let(:stanza) { '<unmute xmlns="urn:xmpp:rayo:1"/>' }
12
+
13
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
14
+
15
+ it { is_expected.to be_instance_of described_class }
16
+ end
17
+
18
+ describe "exporting to Rayo" do
19
+ it "should export to XML that can be understood by its parser" do
20
+ new_instance = Adhearsion::Rayo::RayoNode.from_xml subject.to_rayo
21
+ expect(new_instance).to be_instance_of described_class
22
+ end
23
+
24
+ it "should render to a parent node if supplied" do
25
+ doc = Nokogiri::XML::Document.new
26
+ parent = Nokogiri::XML::Node.new 'foo', doc
27
+ doc.root = parent
28
+ rayo_doc = subject.to_rayo(parent)
29
+ expect(rayo_doc).to eq(parent)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,101 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Rayo::CommandNode do
6
+ let(:args) { [] }
7
+ subject(:command) do
8
+ Class.new(described_class) { register 'foo'}.new(*args)
9
+ end
10
+
11
+ describe '#state_name' do
12
+ subject { super().state_name }
13
+ it { is_expected.to eq(:new) }
14
+ end
15
+
16
+ describe '#request_id' do
17
+ subject { super().request_id }
18
+ it { is_expected.to eq(@uuid) }
19
+ end
20
+
21
+ describe "#new" do
22
+ describe "with a call/component ID" do
23
+ let(:call_id) { 'abc123' }
24
+ let(:component_id) { 'abc123' }
25
+ let(:args) { [{:target_call_id => call_id, :component_id => component_id}] }
26
+
27
+ describe '#target_call_id' do
28
+ subject { super().target_call_id }
29
+ it { is_expected.to eq(call_id) }
30
+ end
31
+
32
+ describe '#component_id' do
33
+ subject { super().component_id }
34
+ it { is_expected.to eq(component_id) }
35
+ end
36
+ end
37
+ end
38
+
39
+ describe "#request!" do
40
+ before { command.request! }
41
+
42
+ describe '#state_name' do
43
+ subject { command.state_name }
44
+ it { is_expected.to eq(:requested) }
45
+ end
46
+
47
+ it "should raise a StateMachine::InvalidTransition when received a second time" do
48
+ expect { command.request! }.to raise_error(StateMachine::InvalidTransition)
49
+ end
50
+ end
51
+
52
+ describe "#execute!" do
53
+ describe "without sending" do
54
+ it "should raise a StateMachine::InvalidTransition" do
55
+ expect { subject.execute! }.to raise_error(StateMachine::InvalidTransition)
56
+ end
57
+ end
58
+
59
+ describe "after sending" do
60
+ before do
61
+ command.request!
62
+ command.execute!
63
+ end
64
+
65
+ describe '#state_name' do
66
+ subject { super().state_name }
67
+ it { is_expected.to eq(:executing) }
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "#complete!" do
73
+ before do
74
+ command.request!
75
+ command.execute!
76
+ command.complete!
77
+ end
78
+
79
+ describe '#state_name' do
80
+ subject { super().state_name }
81
+ it { is_expected.to eq(:complete) }
82
+ end
83
+
84
+ it "should raise a StateMachine::InvalidTransition when received a second time" do
85
+ expect { subject.complete! }.to raise_error(StateMachine::InvalidTransition)
86
+ end
87
+ end # #complete!
88
+
89
+ describe "#response=" do
90
+ it "should set the command to executing status" do
91
+ expect(subject).to receive(:execute!).once
92
+ subject.response = :foo
93
+ end
94
+
95
+ it "should be a no-op if the response has already been set" do
96
+ expect(subject).to receive(:execute!).once
97
+ subject.response = :foo
98
+ expect { subject.response = :bar }.not_to raise_error
99
+ end
100
+ end
101
+ end