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,106 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Event::Offer do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:offer, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let :stanza do
12
+ <<-MESSAGE
13
+ <offer xmlns='urn:xmpp:rayo:1'
14
+ to='tel:+18003211212'
15
+ from='tel:+13058881212'>
16
+ <!-- Signaling (e.g. SIP) Headers -->
17
+ <header name="X-skill" value="agent" />
18
+ <header name="X-customer-id" value="8877" />
19
+ </offer>
20
+ MESSAGE
21
+ end
22
+
23
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
24
+
25
+ it { is_expected.to be_instance_of described_class }
26
+
27
+ it_should_behave_like 'event'
28
+
29
+ describe '#to' do
30
+ subject { super().to }
31
+ it { is_expected.to eq('tel:+18003211212') }
32
+ end
33
+
34
+ describe '#from' do
35
+ subject { super().from }
36
+ it { is_expected.to eq('tel:+13058881212') }
37
+ end
38
+
39
+ describe '#headers' do
40
+ subject { super().headers }
41
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
42
+ end
43
+
44
+ context "with no headers provided" do
45
+ let(:stanza) { '<offer xmlns="urn:xmpp:rayo:1"/>' }
46
+
47
+ describe '#headers' do
48
+ subject { super().headers }
49
+ it { is_expected.to eq({}) }
50
+ end
51
+ end
52
+
53
+ context "with multiple headers of the same name" do
54
+ let :stanza do
55
+ <<-MESSAGE
56
+ <offer xmlns='urn:xmpp:rayo:1'
57
+ to='tel:+18003211212'
58
+ from='tel:+13058881212'>
59
+ <!-- Signaling (e.g. SIP) Headers -->
60
+ <header name="X-skill" value="sales" />
61
+ <header name="X-skill" value="complaints" />
62
+ </offer>
63
+ MESSAGE
64
+ end
65
+
66
+ describe '#headers' do
67
+ subject { super().headers }
68
+ it { is_expected.to eq({'X-skill' => ['sales', 'complaints']}) }
69
+ end
70
+ end
71
+ end
72
+
73
+ describe "when setting options in initializer" do
74
+ subject do
75
+ described_class.new to: 'tel:+18003211212',
76
+ from: 'tel:+13058881212',
77
+ headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' }
78
+ end
79
+
80
+ describe '#to' do
81
+ subject { super().to }
82
+ it { is_expected.to eq('tel:+18003211212') }
83
+ end
84
+
85
+ describe '#from' do
86
+ subject { super().from }
87
+ it { is_expected.to eq('tel:+13058881212') }
88
+ end
89
+
90
+ describe '#headers' do
91
+ subject { super().headers }
92
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
93
+ end
94
+
95
+ context "with headers set to nil" do
96
+ subject do
97
+ described_class.new headers: nil
98
+ end
99
+
100
+ describe '#headers' do
101
+ subject { super().headers }
102
+ it { is_expected.to eq({}) }
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Event::Ringing do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:ringing, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let :stanza do
12
+ <<-MESSAGE
13
+ <ringing xmlns='urn:xmpp:rayo:1'>
14
+ <!-- Signaling (e.g. SIP) Headers -->
15
+ <header name="X-skill" value="agent" />
16
+ <header name="X-customer-id" value="8877" />
17
+ </ringing>
18
+ MESSAGE
19
+ end
20
+
21
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
22
+
23
+ it { is_expected.to be_instance_of described_class }
24
+
25
+ it_should_behave_like 'event'
26
+
27
+ describe '#headers' do
28
+ subject { super().headers }
29
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
30
+ end
31
+
32
+ context "with no headers provided" do
33
+ let(:stanza) { '<ringing xmlns="urn:xmpp:rayo:1"/>' }
34
+
35
+ describe '#headers' do
36
+ subject { super().headers }
37
+ it { is_expected.to eq({}) }
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "when setting options in initializer" do
43
+ subject { described_class.new headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
44
+
45
+ describe '#headers' do
46
+ subject { super().headers }
47
+ it { is_expected.to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' }) }
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Event::StartedSpeaking do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:'started-speaking', 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let :stanza do
12
+ '<started-speaking xmlns="urn:xmpp:rayo:1" call-id="x0yz4ye-lx7-6ai9njwvw8nsb"/>'
13
+ end
14
+
15
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
16
+
17
+ it { is_expected.to be_instance_of described_class }
18
+
19
+ it_should_behave_like 'event'
20
+
21
+ describe '#call_id' do
22
+ subject { super().call_id }
23
+ it { is_expected.to eq("x0yz4ye-lx7-6ai9njwvw8nsb") }
24
+ end
25
+ end
26
+
27
+ describe "when setting options in initializer" do
28
+ subject do
29
+ described_class.new :call_id => 'abc123'
30
+ end
31
+
32
+ describe '#call_id' do
33
+ subject { super().call_id }
34
+ it { is_expected.to eq('abc123') }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Event::StoppedSpeaking do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:'stopped-speaking', 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let :stanza do
12
+ '<stopped-speaking xmlns="urn:xmpp:rayo:1" call-id="x0yz4ye-lx7-6ai9njwvw8nsb"/>'
13
+ end
14
+
15
+ subject { Adhearsion::Rayo::RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
16
+
17
+ it { is_expected.to be_instance_of described_class }
18
+
19
+ it_should_behave_like 'event'
20
+
21
+ describe '#call_id' do
22
+ subject { super().call_id }
23
+ it { is_expected.to eq("x0yz4ye-lx7-6ai9njwvw8nsb") }
24
+ end
25
+ end
26
+
27
+ describe "when setting options in initializer" do
28
+ subject do
29
+ described_class.new :call_id => 'abc123'
30
+ end
31
+
32
+ describe '#call_id' do
33
+ subject { super().call_id }
34
+ it { is_expected.to eq('abc123') }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Adhearsion::Event::Unjoined do
6
+ it 'registers itself' do
7
+ expect(Adhearsion::Rayo::RayoNode.class_from_registration(:unjoined, 'urn:xmpp:rayo:1')).to eq(described_class)
8
+ end
9
+
10
+ describe "from a stanza" do
11
+ let(:stanza) { '<unjoined xmlns="urn:xmpp:rayo:1" call-uri="b" mixer-name="m" />' }
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
+
17
+ it_should_behave_like 'event'
18
+
19
+ describe '#call_uri' do
20
+ subject { super().call_uri }
21
+ it { is_expected.to eq('b') }
22
+ end
23
+
24
+ describe '#call_id' do
25
+ subject { super().call_id }
26
+ it { is_expected.to eq('b') }
27
+ end
28
+
29
+ describe '#mixer_name' do
30
+ subject { super().mixer_name }
31
+ it { is_expected.to eq('m') }
32
+ end
33
+ end
34
+
35
+ describe "when setting options in initializer" do
36
+ subject { described_class.new :call_uri => 'abc123', :mixer_name => 'blah' }
37
+
38
+ describe '#call_id' do
39
+ subject { super().call_id }
40
+ it { is_expected.to eq('abc123') }
41
+ end
42
+
43
+ describe '#mixer_name' do
44
+ subject { super().mixer_name }
45
+ it { is_expected.to eq('blah') }
46
+ end
47
+ end
48
+ end
File without changes
@@ -12,67 +12,52 @@ module Adhearsion
12
12
  Events.refresh!
13
13
  end
14
14
 
15
- it "should have a GirlFriday::Queue to handle events" do
16
- expect(Events.queue).to be_a GirlFriday::WorkQueue
17
- end
18
-
19
15
  it "should allow adding events to the queue and handle them appropriately" do
20
- t = nil
21
- o = nil
16
+ e = nil
22
17
  latch = CountDownLatch.new 1
23
18
 
24
- expect(Events.instance).to receive(:handle_message) do |message|
25
- t = message.type
26
- o = message.object
19
+ Events.register_handler :event do |event|
20
+ logger.info "Received an event!"
21
+ e = event
27
22
  latch.countdown!
28
23
  end
29
24
 
30
25
  Events.trigger :event, :foo
31
26
 
32
27
  expect(latch.wait(2)).to be_truthy
33
- expect(t).to eq(:event)
34
- expect(o).to eq(:foo)
28
+ expect(e).to eq(:foo)
35
29
  end
36
30
 
37
31
  it "should allow executing events immediately" do
38
- t = nil
39
- o = nil
32
+ e = nil
40
33
 
41
- expect(Events.instance).to receive(:handle_message) do |message|
34
+ Events.register_handler :event do |event|
42
35
  sleep 0.25
43
- t = message.type
44
- o = message.object
36
+ e = event
45
37
  end
46
38
 
47
39
  Events.trigger_immediately :event, :foo
48
40
 
49
- expect(t).to eq(:event)
50
- expect(o).to eq(:foo)
41
+ expect(e).to eq(:foo)
51
42
  end
52
43
 
53
- it "should handle events using registered guarded handlers" do
54
- result = nil
44
+ it "should handle exceptions in event processing by raising the exception as an event" do
45
+ e = nil
46
+ latch = CountDownLatch.new 1
55
47
 
56
- Events.register_handler :event, EventClass do |event|
57
- result = :foo
48
+ Events.register_handler :exception do |event|
49
+ e = event
50
+ latch.countdown!
58
51
  end
59
52
 
60
- Events.trigger_immediately :event, EventClass.new
61
-
62
- expect(result).to eq(:foo)
63
-
64
- Events.clear_handlers :event, EventClass
65
- end
66
-
67
- it "should handle exceptions in event processing by raising the exception as an event" do
68
- expect(Events.instance).to receive(:trigger).with(:exception, kind_of(ExceptionClass)).once
69
-
70
53
  Events.register_handler :event, EventClass do |event|
71
54
  raise ExceptionClass
72
55
  end
73
56
 
74
57
  Events.trigger_immediately :event, EventClass.new
75
- Events.clear_handlers :event, EventClass
58
+
59
+ expect(latch.wait(2)).to be_truthy
60
+ expect(e).to be_a(ExceptionClass)
76
61
  end
77
62
 
78
63
  it "should implicitly pass on all handlers" do
@@ -89,16 +74,6 @@ module Adhearsion
89
74
  Events.trigger_immediately :event, EventClass.new
90
75
 
91
76
  expect(result).to eq(:bar)
92
-
93
- Events.clear_handlers :event, EventClass
94
- end
95
-
96
- it "should respond_to? any methods corresponding to classes for which handlers are defined" do
97
- Events.register_handler :event_type_1 do |event|
98
- end
99
-
100
- expect(Events).to respond_to(:event_type_1)
101
- expect(Events).not_to respond_to(:event_type_2)
102
77
  end
103
78
 
104
79
  describe '#draw' do
@@ -106,6 +81,7 @@ module Adhearsion
106
81
  result = nil
107
82
  Events.draw do
108
83
  event do
84
+ logger.info "Got an event!"
109
85
  result = :foo
110
86
  end
111
87
  end
@@ -113,8 +89,6 @@ module Adhearsion
113
89
  Events.trigger_immediately :event
114
90
 
115
91
  expect(result).to eq(:foo)
116
-
117
- Events.clear_handlers :event
118
92
  end
119
93
  end
120
94
 
@@ -18,7 +18,7 @@ describe Adhearsion::Initializer do
18
18
  end
19
19
 
20
20
  after do
21
- Adhearsion::Events.reinitialize_queue!
21
+ Adhearsion::Events.refresh!
22
22
  end
23
23
 
24
24
  after :all do
@@ -40,115 +40,24 @@ describe Adhearsion::Initializer do
40
40
  end
41
41
  end
42
42
 
43
- it "should create a pid file in the app's path when given 'true' as the pid_file hash key argument" do
44
- stub_behavior_for_initializer_with_no_path_changing_behavior do
45
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
46
- ahn = Adhearsion::Initializer.start :pid_file => true
47
- expect(ahn.pid_file[0, path.length]).to eq(path)
48
- end
49
- end
50
-
51
- it "should NOT create a pid file in the app's path when given 'false' as the pid_file hash key argument" do
52
- stub_behavior_for_initializer_with_no_path_changing_behavior do
53
- ahn = Adhearsion::Initializer.start :pid_file => false
54
- expect(ahn.pid_file).to be nil
55
- end
56
- end
57
-
58
- it "should create a pid file in the app's path by default when daemonizing" do
59
- stub_behavior_for_initializer_with_no_path_changing_behavior do
60
- expect(Adhearsion::CustomDaemonizer).to receive(:daemonize).and_yield '123'
61
- expect(File).to receive(:open).once.with(File.join(path, 'adhearsion.pid'), 'w')
62
- ahn = Adhearsion::Initializer.start :mode => :daemon
63
- expect(ahn.pid_file[0, path.size]).to eq(path)
64
- end
65
- end
66
-
67
- it "should NOT create a pid file in the app's path when daemonizing and :pid_file is given as false" do
68
- stub_behavior_for_initializer_with_no_path_changing_behavior do
69
- expect(Adhearsion::CustomDaemonizer).to receive(:daemonize).and_yield '123'
70
- ahn = Adhearsion::Initializer.start :mode => :daemon, :pid_file => false
71
- expect(ahn.pid_file).to be nil
72
- end
73
- end
74
-
75
- it "should create a designated pid file when supplied a String path as :pid_file" do
76
- random_file = "/tmp/AHN_TEST_#{rand 100000}.pid"
77
- stub_behavior_for_initializer_with_no_path_changing_behavior do
78
- ahn = Adhearsion::Initializer.start :pid_file => random_file
79
- expect(ahn.pid_file).to eq(random_file)
80
- expect(File.exists?(random_file)).to be true
81
- File.delete random_file
82
- end
83
- end
84
-
85
- it "should resolve the log file path to daemonize" do
86
- stub_behavior_for_initializer_with_no_path_changing_behavior do
87
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
88
- ahn = Adhearsion::Initializer.start :pid_file => true
89
- expect(ahn.resolve_log_file_path).to eq(path + Adhearsion.config.platform.logging.outputters[0])
90
- end
91
- end
92
-
93
- it "should resolve the log file path to daemonize when outputters is an Array" do
94
- Adhearsion.config.platform.logging.outputters = ["log/my_application.log", "log/adhearsion.log"]
95
- stub_behavior_for_initializer_with_no_path_changing_behavior do
96
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
97
- ahn = Adhearsion::Initializer.start :pid_file => true
98
- expect(ahn.resolve_log_file_path).to eq(path + Adhearsion.config.platform.logging.outputters[0])
99
- end
100
- end
101
-
102
- it "should return a valid appenders array" do
103
- stub_behavior_for_initializer_with_no_path_changing_behavior do
104
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
105
- ahn = Adhearsion::Initializer.start :pid_file => true
106
- appenders = ahn.init_get_logging_appenders
107
- expect(appenders.size).to eq(2)
108
- expect(appenders[1]).to be_instance_of Logging::Appenders::Stdout
109
- end
110
- end
111
-
112
- it "should initialize properly the log paths" do
113
- ahn = stub_behavior_for_initializer_with_no_path_changing_behavior do
114
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
115
- Adhearsion::Initializer.start :pid_file => true
116
- end
117
- expect(Dir).to receive(:mkdir).with("log/")
118
- ahn.initialize_log_paths
119
- end
120
-
121
- it "should initialize properly the log paths when outputters is an array" do
122
- Adhearsion.config.platform.logging.outputters = ["log/my_application.log", "log/test/adhearsion.log"]
123
- ahn = stub_behavior_for_initializer_with_no_path_changing_behavior do
124
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
125
- Adhearsion::Initializer.start :pid_file => true
126
- end
127
- expect(Dir).to receive(:mkdir).with("log/").twice
128
- expect(Dir).to receive(:mkdir).with("log/test/").once
129
- ahn.initialize_log_paths
130
- end
131
-
132
43
  it "should set the adhearsion proc name" do
133
44
  stub_behavior_for_initializer_with_no_path_changing_behavior do
134
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
135
- expect(Adhearsion::LinuxProcName).to receive(:set_proc_name).with(Adhearsion.config.platform.process_name)
136
- Adhearsion::Initializer.start :pid_file => true
45
+ expect(Adhearsion::LinuxProcName).to receive(:set_proc_name).with(Adhearsion.config.core.process_name)
46
+ Adhearsion::Initializer.start
137
47
  end
138
48
  end
139
49
 
140
50
  it "should update the adhearsion proc name" do
141
51
  stub_behavior_for_initializer_with_no_path_changing_behavior do
142
- Adhearsion::Initializer.start :pid_file => true
52
+ Adhearsion::Initializer.start
143
53
  end
144
- expect($0).to eq(Adhearsion.config.platform.process_name)
54
+ expect($0).to eq(Adhearsion.config.core.process_name)
145
55
  end
146
56
  end
147
57
 
148
58
  describe "Initializing logger" do
149
59
  before do
150
60
  ::Logging.reset
151
- expect(::Logging::Appenders).to receive(:file).and_return(nil)
152
61
  Adhearsion.config = nil
153
62
  end
154
63
 
@@ -156,21 +65,20 @@ describe Adhearsion::Initializer do
156
65
  ::Logging.reset
157
66
  Adhearsion::Logging.start
158
67
  Adhearsion::Logging.silence!
159
- Adhearsion::Events.reinitialize_queue!
68
+ Adhearsion::Events.refresh!
160
69
  end
161
70
 
162
71
  it "should start logging with valid parameters" do
163
72
  stub_behavior_for_initializer_with_no_path_changing_behavior do
164
- expect(File).to receive(:open).with(File.join(path, 'adhearsion.pid'), 'w').at_least(:once)
165
- expect(Adhearsion::Logging).to receive(:start).once.with(kind_of(Array), :info, nil).and_return('')
166
- Adhearsion::Initializer.start :pid_file => true
73
+ expect(Adhearsion::Logging).to receive(:start).once.with(:info, nil).and_return('')
74
+ Adhearsion::Initializer.start
167
75
  end
168
76
  end
169
77
  end
170
78
 
171
79
  describe "#load_lib_folder" do
172
80
  before do
173
- Adhearsion.ahn_root = path
81
+ Adhearsion.root = path
174
82
  end
175
83
 
176
84
  it "should load the contents of lib directory" do
@@ -179,100 +87,20 @@ describe Adhearsion::Initializer do
179
87
  end
180
88
 
181
89
  it "should return false if folder does not exist" do
182
- Adhearsion.config.platform.lib = "my_random_lib_directory"
90
+ Adhearsion.config.core.lib = "my_random_lib_directory"
183
91
  expect(Adhearsion::Initializer.new.load_lib_folder).to eq(false)
184
92
  end
185
93
 
186
94
  it "should return false and not load any file if config folder is set to nil" do
187
- Adhearsion.config.platform.lib = nil
95
+ Adhearsion.config.core.lib = nil
188
96
  expect(Adhearsion::Initializer.new.load_lib_folder).to eq(false)
189
97
  end
190
98
 
191
99
  it "should load the contents of the preconfigured directory" do
192
- Adhearsion.config.platform.lib = "foo"
100
+ Adhearsion.config.core.lib = "foo"
193
101
  allow(File).to receive_messages directory?: true
194
102
  expect(Dir).to receive(:chdir).with(File.join(path, "foo")).and_return []
195
103
  Adhearsion::Initializer.new.load_lib_folder
196
104
  end
197
105
  end
198
106
  end
199
-
200
- describe "Updating RAILS_ENV variable" do
201
- include InitializerStubs
202
-
203
- before do
204
- ::Logging.reset
205
- expect(Adhearsion::Logging).to receive(:start).once.and_return('')
206
- expect(::Logging::Appenders).to receive(:file).and_return(nil)
207
- Adhearsion.config = nil
208
- end
209
-
210
- before do
211
- ENV['RAILS_ENV'] = nil
212
- ENV['AHN_ENV'] = nil
213
- end
214
-
215
- after :all do
216
- ENV['RAILS_ENV'] = nil
217
- ENV['AHN_ENV'] = nil
218
- end
219
-
220
- describe "when neither RAILS_ENV nor AHN_ENV are set" do
221
- [:development, :production, :staging, :test].each do |env|
222
- it "should set the RAILS_ENV to #{env.to_s} when Adhearsion environment is set to #{env.to_s}" do
223
- ahn = nil
224
- stub_behavior_for_initializer_with_no_path_changing_behavior do
225
- Adhearsion.config.platform.environment = env
226
- ahn = Adhearsion::Initializer.start
227
- end
228
- ahn.update_rails_env_var
229
- expect(ENV['RAILS_ENV']).to eq(env.to_s)
230
- end
231
- end
232
- end
233
-
234
- context "when RAILS_ENV is set" do
235
- before do
236
- ENV['RAILS_ENV'] = "test"
237
- end
238
-
239
- context "if AHN_ENV is set" do
240
- it "should preserve the RAILS_ENV value" do
241
- ENV['AHN_ENV'] = "production"
242
- ahn = nil
243
- stub_behavior_for_initializer_with_no_path_changing_behavior do
244
- ahn = Adhearsion::Initializer.start
245
- end
246
- ahn.update_rails_env_var
247
- expect(ENV['RAILS_ENV']).to eq("test")
248
- end
249
- end
250
-
251
- context "if AHN_ENV is unset" do
252
- it "should preserve the RAILS_ENV value" do
253
- ahn = nil
254
- stub_behavior_for_initializer_with_no_path_changing_behavior do
255
- ahn = Adhearsion::Initializer.start
256
- end
257
- ahn.update_rails_env_var
258
- expect(ENV['RAILS_ENV']).to eq("test")
259
- end
260
- end
261
- end
262
-
263
- context "when RAILS_ENV is unset and AHN_ENV is set" do
264
- before do
265
- ENV['AHN_ENV'] = "production"
266
- end
267
-
268
- it "should define the RAILS_ENV value with the AHN_ENV value" do
269
- ahn = nil
270
- stub_behavior_for_initializer_with_no_path_changing_behavior do
271
- ahn = Adhearsion::Initializer.start
272
- end
273
- ahn.update_rails_env_var
274
- expect(ENV['RAILS_ENV']).to eq("production")
275
- end
276
- end
277
-
278
- end