sipgate_controller_test.rb 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. # encoding: utf-8
  2. require 'test_helper'
  3. require 'rexml/document'
  4. class SipgateControllerTest < ActionDispatch::IntegrationTest
  5. setup do
  6. Cti::Log.destroy_all
  7. Setting.set('sipgate_integration', true)
  8. Setting.set('sipgate_config', {
  9. outbound: {
  10. routing_table: [
  11. {
  12. dest: '41*',
  13. caller_id: '41715880339000',
  14. },
  15. {
  16. dest: '491714000000',
  17. caller_id: '41715880339000',
  18. },
  19. ],
  20. default_caller_id: '4930777000000',
  21. },
  22. inbound: {
  23. block_caller_ids: [
  24. {
  25. caller_id: '491715000000',
  26. note: 'some note',
  27. }
  28. ],
  29. notify_user_ids: {
  30. 2 => true,
  31. 4 => false,
  32. },
  33. }
  34. },)
  35. groups = Group.where(name: 'Users')
  36. roles = Role.where(name: %w(Agent))
  37. agent = User.create_or_update(
  38. login: 'cti-agent@example.com',
  39. firstname: 'E',
  40. lastname: 'S',
  41. email: 'cti-agent@example.com',
  42. password: 'agentpw',
  43. active: true,
  44. roles: roles,
  45. groups: groups,
  46. updated_by_id: 1,
  47. created_by_id: 1,
  48. )
  49. customer1 = User.create_or_update(
  50. login: 'ticket-caller_id_sipgate-customer1@example.com',
  51. firstname: 'CallerId',
  52. lastname: 'Customer1',
  53. email: 'ticket-caller_id_sipgate-customer1@example.com',
  54. password: 'customerpw',
  55. active: true,
  56. phone: '+49 99999 222222',
  57. fax: '+49 99999 222223',
  58. mobile: '+4912347114711',
  59. note: 'Phone at home: +49 99999 222224',
  60. updated_by_id: 1,
  61. created_by_id: 1,
  62. )
  63. customer2 = User.create_or_update(
  64. login: 'ticket-caller_id_sipgate-customer2@example.com',
  65. firstname: 'CallerId',
  66. lastname: 'Customer2',
  67. email: 'ticket-caller_id_sipgate-customer2@example.com',
  68. password: 'customerpw',
  69. active: true,
  70. phone: '+49 99999 222222 2',
  71. updated_by_id: 1,
  72. created_by_id: 1,
  73. )
  74. customer3 = User.create_or_update(
  75. login: 'ticket-caller_id_sipgate-customer3@example.com',
  76. firstname: 'CallerId',
  77. lastname: 'Customer3',
  78. email: 'ticket-caller_id_sipgate-customer3@example.com',
  79. password: 'customerpw',
  80. active: true,
  81. phone: '+49 99999 222222 2',
  82. updated_by_id: 1,
  83. created_by_id: 1,
  84. )
  85. Cti::CallerId.rebuild
  86. end
  87. test 'basic call' do
  88. # inbound - I
  89. params = 'event=newCall&direction=in&from=4912347114711&to=4930600000000&callId=4991155921769858278-1&user%5B%5D=user+1&user%5B%5D=user+2'
  90. post '/api/v1/sipgate/in', params
  91. assert_response(200)
  92. on_hangup = nil
  93. on_answer = nil
  94. content = @response.body
  95. response = REXML::Document.new(content)
  96. response.elements.each('Response') do |element|
  97. on_hangup = element.attributes['onHangup']
  98. on_answer = element.attributes['onAnswer']
  99. end
  100. assert_equal('http://zammad.example.com/api/v1/sipgate/in', on_hangup)
  101. assert_equal('http://zammad.example.com/api/v1/sipgate/in', on_answer)
  102. # inbound - II - block caller
  103. params = 'event=newCall&direction=in&from=491715000000&to=4930600000000&callId=4991155921769858278-2&user%5B%5D=user+1&user%5B%5D=user+2'
  104. post '/api/v1/sipgate/in', params
  105. assert_response(200)
  106. on_hangup = nil
  107. on_answer = nil
  108. content = @response.body
  109. response = REXML::Document.new(content)
  110. response.elements.each('Response') do |element|
  111. on_hangup = element.attributes['onHangup']
  112. on_answer = element.attributes['onAnswer']
  113. end
  114. assert_equal('http://zammad.example.com/api/v1/sipgate/in', on_hangup)
  115. assert_equal('http://zammad.example.com/api/v1/sipgate/in', on_answer)
  116. reason = nil
  117. response.elements.each('Response/Reject') do |element|
  118. reason = element.attributes['reason']
  119. end
  120. assert_equal('busy', reason)
  121. # outbound - I - set default_caller_id
  122. params = 'event=newCall&direction=out&from=4930600000000&to=4912347114711&callId=8621106404543334274-3&user%5B%5D=user+1'
  123. post '/api/v1/sipgate/out', params
  124. assert_response(200)
  125. on_hangup = nil
  126. on_answer = nil
  127. caller_id = nil
  128. number_to_dail = nil
  129. content = @response.body
  130. response = REXML::Document.new(content)
  131. response.elements.each('Response') do |element|
  132. on_hangup = element.attributes['onHangup']
  133. on_answer = element.attributes['onAnswer']
  134. end
  135. response.elements.each('Response/Dial') do |element|
  136. caller_id = element.attributes['callerId']
  137. end
  138. response.elements.each('Response/Dial/Number') do |element|
  139. number_to_dail = element.text
  140. end
  141. assert_equal('4930777000000', caller_id)
  142. assert_equal('4912347114711', number_to_dail)
  143. assert_equal('http://zammad.example.com/api/v1/sipgate/out', on_hangup)
  144. assert_equal('http://zammad.example.com/api/v1/sipgate/out', on_answer)
  145. # outbound - II - set caller_id based on routing_table by explicite number
  146. params = 'event=newCall&direction=out&from=4930600000000&to=491714000000&callId=8621106404543334274-4&user%5B%5D=user+1'
  147. post '/api/v1/sipgate/out', params
  148. assert_response(200)
  149. on_hangup = nil
  150. on_answer = nil
  151. caller_id = nil
  152. number_to_dail = nil
  153. content = @response.body
  154. response = REXML::Document.new(content)
  155. response.elements.each('Response') do |element|
  156. on_hangup = element.attributes['onHangup']
  157. on_answer = element.attributes['onAnswer']
  158. end
  159. response.elements.each('Response/Dial') do |element|
  160. caller_id = element.attributes['callerId']
  161. end
  162. response.elements.each('Response/Dial/Number') do |element|
  163. number_to_dail = element.text
  164. end
  165. assert_equal('41715880339000', caller_id)
  166. assert_equal('491714000000', number_to_dail)
  167. assert_equal('http://zammad.example.com/api/v1/sipgate/out', on_hangup)
  168. assert_equal('http://zammad.example.com/api/v1/sipgate/out', on_answer)
  169. # outbound - III - set caller_id based on routing_table by 41*
  170. params = 'event=newCall&direction=out&from=4930600000000&to=4147110000000&callId=8621106404543334274-5&user%5B%5D=user+1'
  171. post '/api/v1/sipgate/out', params
  172. assert_response(200)
  173. on_hangup = nil
  174. on_answer = nil
  175. caller_id = nil
  176. number_to_dail = nil
  177. content = @response.body
  178. response = REXML::Document.new(content)
  179. response.elements.each('Response') do |element|
  180. on_hangup = element.attributes['onHangup']
  181. on_answer = element.attributes['onAnswer']
  182. end
  183. response.elements.each('Response/Dial') do |element|
  184. caller_id = element.attributes['callerId']
  185. end
  186. response.elements.each('Response/Dial/Number') do |element|
  187. number_to_dail = element.text
  188. end
  189. assert_equal('41715880339000', caller_id)
  190. assert_equal('4147110000000', number_to_dail)
  191. assert_equal('http://zammad.example.com/api/v1/sipgate/out', on_hangup)
  192. assert_equal('http://zammad.example.com/api/v1/sipgate/out', on_answer)
  193. # no config
  194. Setting.set('sipgate_config', {})
  195. params = 'event=newCall&direction=in&from=4912347114711&to=4930600000000&callId=4991155921769858278-6&user%5B%5D=user+1&user%5B%5D=user+2'
  196. post '/api/v1/sipgate/in', params
  197. assert_response(422)
  198. error = nil
  199. content = @response.body
  200. response = REXML::Document.new(content)
  201. response.elements.each('Response/Error') do |element|
  202. error = element.text
  203. end
  204. assert_equal('Feature not configured, please contact your admin!', error)
  205. end
  206. test 'log call' do
  207. # outbound - I - new call
  208. params = 'event=newCall&direction=out&from=4930600000000&to=4912347114711&callId=1234567890-1&user%5B%5D=user+1'
  209. post '/api/v1/sipgate/out', params
  210. assert_response(200)
  211. log = Cti::Log.find_by(call_id: '1234567890-1')
  212. assert(log)
  213. assert_equal('4930777000000', log.from)
  214. assert_equal('4912347114711', log.to)
  215. assert_equal('out', log.direction)
  216. assert_equal('user 1', log.from_comment)
  217. assert_equal('CallerId Customer1', log.to_comment)
  218. assert_nil(log.comment)
  219. assert_equal('newCall', log.state)
  220. assert_equal(true, log.done)
  221. # outbound - I - hangup by agent
  222. params = 'event=hangup&direction=out&callId=1234567890-1&cause=cancel'
  223. post '/api/v1/sipgate/out', params
  224. assert_response(200)
  225. log = Cti::Log.find_by(call_id: '1234567890-1')
  226. assert(log)
  227. assert_equal('4930777000000', log.from)
  228. assert_equal('4912347114711', log.to)
  229. assert_equal('out', log.direction)
  230. assert_equal('user 1', log.from_comment)
  231. assert_equal('CallerId Customer1', log.to_comment)
  232. assert_equal('cancel', log.comment)
  233. assert_equal('hangup', log.state)
  234. assert_equal(true, log.done)
  235. # outbound - II - new call
  236. params = 'event=newCall&direction=out&from=4930600000000&to=4912347114711&callId=1234567890-2&user%5B%5D=user+1'
  237. post '/api/v1/sipgate/out', params
  238. assert_response(200)
  239. log = Cti::Log.find_by(call_id: '1234567890-2')
  240. assert(log)
  241. assert_equal('4930777000000', log.from)
  242. assert_equal('4912347114711', log.to)
  243. assert_equal('out', log.direction)
  244. assert_equal('user 1', log.from_comment)
  245. assert_equal('CallerId Customer1', log.to_comment)
  246. assert_nil(log.comment)
  247. assert_equal('newCall', log.state)
  248. assert_equal(true, log.done)
  249. # outbound - II - answer by customer
  250. params = 'event=answer&direction=out&callId=1234567890-2&from=4930600000000&to=4912347114711'
  251. post '/api/v1/sipgate/out', params
  252. assert_response(200)
  253. log = Cti::Log.find_by(call_id: '1234567890-2')
  254. assert(log)
  255. assert_equal('4930777000000', log.from)
  256. assert_equal('4912347114711', log.to)
  257. assert_equal('out', log.direction)
  258. assert_equal('user 1', log.from_comment)
  259. assert_equal('CallerId Customer1', log.to_comment)
  260. assert_nil(log.comment)
  261. assert_equal('answer', log.state)
  262. assert_equal(true, log.done)
  263. # outbound - II - hangup by customer
  264. params = 'event=hangup&direction=out&callId=1234567890-2&cause=normalClearing&from=4930600000000&to=4912347114711'
  265. post '/api/v1/sipgate/out', params
  266. assert_response(200)
  267. log = Cti::Log.find_by(call_id: '1234567890-2')
  268. assert(log)
  269. assert_equal('4930777000000', log.from)
  270. assert_equal('4912347114711', log.to)
  271. assert_equal('out', log.direction)
  272. assert_equal('user 1', log.from_comment)
  273. assert_equal('CallerId Customer1', log.to_comment)
  274. assert_equal('normalClearing', log.comment)
  275. assert_equal('hangup', log.state)
  276. assert_equal(true, log.done)
  277. # inbound - I - new call
  278. params = 'event=newCall&direction=in&to=4930600000000&from=4912347114711&callId=1234567890-3&user%5B%5D=user+1'
  279. post '/api/v1/sipgate/in', params
  280. assert_response(200)
  281. log = Cti::Log.find_by(call_id: '1234567890-3')
  282. assert(log)
  283. assert_equal('4930600000000', log.to)
  284. assert_equal('4912347114711', log.from)
  285. assert_equal('in', log.direction)
  286. assert_equal('user 1', log.to_comment)
  287. assert_equal('CallerId Customer1', log.from_comment)
  288. assert_nil(log.comment)
  289. assert_equal('newCall', log.state)
  290. assert_equal(true, log.done)
  291. # inbound - I - answer by customer
  292. params = 'event=answer&direction=in&callId=1234567890-3&to=4930600000000&from=4912347114711'
  293. post '/api/v1/sipgate/in', params
  294. assert_response(200)
  295. log = Cti::Log.find_by(call_id: '1234567890-3')
  296. assert(log)
  297. assert_equal('4930600000000', log.to)
  298. assert_equal('4912347114711', log.from)
  299. assert_equal('in', log.direction)
  300. assert_equal('user 1', log.to_comment)
  301. assert_equal('CallerId Customer1', log.from_comment)
  302. assert_nil(log.comment)
  303. assert_equal('answer', log.state)
  304. assert_equal(true, log.done)
  305. # inbound - I - hangup by customer
  306. params = 'event=hangup&direction=in&callId=1234567890-3&cause=normalClearing&to=4930600000000&from=4912347114711'
  307. post '/api/v1/sipgate/in', params
  308. assert_response(200)
  309. log = Cti::Log.find_by(call_id: '1234567890-3')
  310. assert(log)
  311. assert_equal('4930600000000', log.to)
  312. assert_equal('4912347114711', log.from)
  313. assert_equal('in', log.direction)
  314. assert_equal('user 1', log.to_comment)
  315. assert_equal('CallerId Customer1', log.from_comment)
  316. assert_equal('normalClearing', log.comment)
  317. assert_equal('hangup', log.state)
  318. assert_equal(true, log.done)
  319. # inbound - II - new call
  320. params = 'event=newCall&direction=in&to=4930600000000&from=4912347114711&callId=1234567890-4&user%5B%5D=user+1,user+2'
  321. post '/api/v1/sipgate/in', params
  322. assert_response(200)
  323. log = Cti::Log.find_by(call_id: '1234567890-4')
  324. assert(log)
  325. assert_equal('4930600000000', log.to)
  326. assert_equal('4912347114711', log.from)
  327. assert_equal('in', log.direction)
  328. assert_equal('user 1,user 2', log.to_comment)
  329. assert_equal('CallerId Customer1', log.from_comment)
  330. assert_nil(log.comment)
  331. assert_equal('newCall', log.state)
  332. assert_equal(true, log.done)
  333. # inbound - II - answer by voicemail
  334. params = 'event=answer&direction=in&callId=1234567890-4&to=4930600000000&from=4912347114711&user=voicemail'
  335. post '/api/v1/sipgate/in', params
  336. assert_response(200)
  337. log = Cti::Log.find_by(call_id: '1234567890-4')
  338. assert(log)
  339. assert_equal('4930600000000', log.to)
  340. assert_equal('4912347114711', log.from)
  341. assert_equal('in', log.direction)
  342. assert_equal('voicemail', log.to_comment)
  343. assert_equal('CallerId Customer1', log.from_comment)
  344. assert_nil(log.comment)
  345. assert_equal('answer', log.state)
  346. assert_equal(true, log.done)
  347. # inbound - II - hangup by customer
  348. params = 'event=hangup&direction=in&callId=1234567890-4&cause=normalClearing&to=4930600000000&from=4912347114711'
  349. post '/api/v1/sipgate/in', params
  350. assert_response(200)
  351. log = Cti::Log.find_by(call_id: '1234567890-4')
  352. assert(log)
  353. assert_equal('4930600000000', log.to)
  354. assert_equal('4912347114711', log.from)
  355. assert_equal('in', log.direction)
  356. assert_equal('voicemail', log.to_comment)
  357. assert_equal('CallerId Customer1', log.from_comment)
  358. assert_equal('normalClearing', log.comment)
  359. assert_equal('hangup', log.state)
  360. assert_equal(false, log.done)
  361. # inbound - III - new call
  362. params = 'event=newCall&direction=in&to=4930600000000&from=4912347114711&callId=1234567890-5&user%5B%5D=user+1,user+2'
  363. post '/api/v1/sipgate/in', params
  364. assert_response(200)
  365. log = Cti::Log.find_by(call_id: '1234567890-5')
  366. assert(log)
  367. assert_equal('4930600000000', log.to)
  368. assert_equal('4912347114711', log.from)
  369. assert_equal('in', log.direction)
  370. assert_equal('user 1,user 2', log.to_comment)
  371. assert_equal('CallerId Customer1', log.from_comment)
  372. assert_nil(log.comment)
  373. assert_equal('newCall', log.state)
  374. assert_equal(true, log.done)
  375. # inbound - III - hangup by customer
  376. params = 'event=hangup&direction=in&callId=1234567890-5&cause=normalClearing&to=4930600000000&from=4912347114711'
  377. post '/api/v1/sipgate/in', params
  378. assert_response(200)
  379. log = Cti::Log.find_by(call_id: '1234567890-5')
  380. assert(log)
  381. assert_equal('4930600000000', log.to)
  382. assert_equal('4912347114711', log.from)
  383. assert_equal('in', log.direction)
  384. assert_equal('user 1,user 2', log.to_comment)
  385. assert_equal('CallerId Customer1', log.from_comment)
  386. assert_equal('normalClearing', log.comment)
  387. assert_equal('hangup', log.state)
  388. assert_equal(false, log.done)
  389. # inbound - IV - new call
  390. params = 'event=newCall&direction=in&to=4930600000000&from=49999992222222&callId=1234567890-6&user%5B%5D=user+1,user+2'
  391. post '/api/v1/sipgate/in', params
  392. assert_response(200)
  393. log = Cti::Log.find_by(call_id: '1234567890-6')
  394. assert(log)
  395. assert_equal('4930600000000', log.to)
  396. assert_equal('49999992222222', log.from)
  397. assert_equal('in', log.direction)
  398. assert_equal('user 1,user 2', log.to_comment)
  399. assert_equal('CallerId Customer3,CallerId Customer2', log.from_comment)
  400. assert_not(log.preferences['to'])
  401. assert(log.preferences['from'])
  402. assert_nil(log.comment)
  403. assert_equal('newCall', log.state)
  404. assert_equal(true, log.done)
  405. # get caller list
  406. get '/api/v1/cti/log'
  407. assert_response(401)
  408. customer2 = User.lookup(login: 'ticket-caller_id_sipgate-customer2@example.com')
  409. customer3 = User.lookup(login: 'ticket-caller_id_sipgate-customer3@example.com')
  410. headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
  411. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('cti-agent@example.com', 'agentpw')
  412. get '/api/v1/cti/log', {}, headers.merge('Authorization' => credentials)
  413. assert_response(200)
  414. result = JSON.parse(@response.body)
  415. assert_equal(result['list'].class, Array)
  416. assert_equal(6, result['list'].count)
  417. assert(result['assets'])
  418. assert(result['assets']['User'])
  419. assert(result['assets']['User'][customer2.id.to_s])
  420. assert(result['assets']['User'][customer3.id.to_s])
  421. assert_equal('1234567890-6', result['list'][0]['call_id'])
  422. assert_equal('1234567890-5', result['list'][1]['call_id'])
  423. assert_equal('1234567890-4', result['list'][2]['call_id'])
  424. assert_equal('1234567890-3', result['list'][3]['call_id'])
  425. assert_equal('1234567890-2', result['list'][4]['call_id'])
  426. assert_equal('hangup', result['list'][4]['state'])
  427. assert_equal('4930777000000', result['list'][4]['from'])
  428. assert_equal('user 1', result['list'][4]['from_comment'])
  429. assert_equal('4912347114711', result['list'][4]['to'])
  430. assert_equal('CallerId Customer1', result['list'][4]['to_comment'])
  431. assert_equal('normalClearing', result['list'][4]['comment'])
  432. assert_equal('hangup', result['list'][4]['state'])
  433. assert_equal('1234567890-1', result['list'][5]['call_id'])
  434. end
  435. end