chat_test.rb 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. # encoding: utf-8
  2. require 'test_helper'
  3. class ChatTest < ActiveSupport::TestCase
  4. agent1 = nil
  5. agent2 = nil
  6. test 'aaa - setup' do
  7. # create base
  8. groups = Group.all
  9. roles = Role.where( name: %w(Agent) )
  10. agent1 = User.create_or_update(
  11. login: 'ticket-chat-agent1@example.com',
  12. firstname: 'Notification',
  13. lastname: 'Agent1',
  14. email: 'ticket-chat-agent1@example.com',
  15. password: 'agentpw',
  16. active: true,
  17. roles: roles,
  18. groups: groups,
  19. updated_at: '2015-02-05 16:37:00',
  20. updated_by_id: 1,
  21. created_by_id: 1,
  22. )
  23. agent2 = User.create_or_update(
  24. login: 'ticket-chat-agent2@example.com',
  25. firstname: 'Notification',
  26. lastname: 'Agent2',
  27. email: 'ticket-chat-agent2@example.com',
  28. password: 'agentpw',
  29. active: true,
  30. roles: roles,
  31. groups: groups,
  32. updated_at: '2015-02-05 16:38:00',
  33. updated_by_id: 1,
  34. created_by_id: 1,
  35. )
  36. end
  37. test 'default test' do
  38. Chat.delete_all
  39. Chat::Session.delete_all
  40. Chat::Message.delete_all
  41. Chat::Agent.delete_all
  42. Setting.set('chat', false)
  43. chat = Chat.create_or_update(
  44. name: 'default',
  45. max_queue: 5,
  46. note: '',
  47. active: true,
  48. updated_by_id: 1,
  49. created_by_id: 1,
  50. )
  51. # check if feature is disabled
  52. assert_equal('chat_disabled', chat.customer_state[:state])
  53. assert_equal('chat_disabled', Chat.agent_state(agent1.id)[:state])
  54. Setting.set('chat', true)
  55. # check customer state
  56. assert_equal('offline', chat.customer_state[:state])
  57. # check agent state
  58. agent_state = Chat.agent_state_with_sessions(agent1.id)
  59. assert_equal(0, agent_state[:waiting_chat_count])
  60. assert_equal(0, agent_state[:running_chat_count])
  61. assert_equal([], agent_state[:active_sessions])
  62. assert_equal(0, agent_state[:seads_available])
  63. assert_equal(0, agent_state[:seads_total])
  64. assert_equal(false, agent_state[:active])
  65. # set agent 1 to active
  66. chat_agent1 = Chat::Agent.create_or_update(
  67. active: true,
  68. concurrent: 4,
  69. updated_by_id: agent1.id,
  70. created_by_id: agent1.id,
  71. )
  72. # check customer state
  73. assert_equal('online', chat.customer_state[:state])
  74. # check agent state
  75. agent_state = Chat.agent_state_with_sessions(agent1.id)
  76. assert_equal(0, agent_state[:waiting_chat_count])
  77. assert_equal(0, agent_state[:running_chat_count])
  78. assert_equal([], agent_state[:active_sessions])
  79. assert_equal(4, agent_state[:seads_available])
  80. assert_equal(4, agent_state[:seads_total])
  81. assert_equal(true, agent_state[:active])
  82. # start session
  83. chat_session1 = Chat::Session.create(
  84. chat_id: chat.id,
  85. user_id: agent1.id,
  86. )
  87. assert(chat_session1.session_id)
  88. # check customer state
  89. assert_equal('online', chat.customer_state[:state])
  90. # check agent state
  91. agent_state = Chat.agent_state_with_sessions(agent1.id)
  92. assert_equal(1, agent_state[:waiting_chat_count])
  93. assert_equal(0, agent_state[:running_chat_count])
  94. assert_equal([], agent_state[:active_sessions])
  95. assert_equal(3, agent_state[:seads_available])
  96. assert_equal(4, agent_state[:seads_total])
  97. assert_equal(true, agent_state[:active])
  98. # activate second agent
  99. chat_agent2 = Chat::Agent.create_or_update(
  100. active: true,
  101. concurrent: 2,
  102. updated_by_id: agent2.id,
  103. created_by_id: agent2.id,
  104. )
  105. # check customer state
  106. assert_equal('online', chat.customer_state[:state])
  107. # check agent1 state
  108. agent_state = Chat.agent_state_with_sessions(agent1.id)
  109. assert_equal(1, agent_state[:waiting_chat_count])
  110. assert_equal(0, agent_state[:running_chat_count])
  111. assert_equal([], agent_state[:active_sessions])
  112. assert_equal(5, agent_state[:seads_available])
  113. assert_equal(6, agent_state[:seads_total])
  114. assert_equal(true, agent_state[:active])
  115. # check agent2 state
  116. agent_state = Chat.agent_state_with_sessions(agent2.id)
  117. assert_equal(1, agent_state[:waiting_chat_count])
  118. assert_equal(0, agent_state[:running_chat_count])
  119. assert_equal([], agent_state[:active_sessions])
  120. assert_equal(5, agent_state[:seads_available])
  121. assert_equal(6, agent_state[:seads_total])
  122. assert_equal(true, agent_state[:active])
  123. # start next chat
  124. chat_session2 = Chat::Session.create(
  125. chat_id: chat.id,
  126. )
  127. # check customer state
  128. assert_equal('online', chat.customer_state[:state])
  129. # check agent1 state
  130. agent_state = Chat.agent_state_with_sessions(agent1.id)
  131. assert_equal(2, agent_state[:waiting_chat_count])
  132. assert_equal(0, agent_state[:running_chat_count])
  133. assert_equal([], agent_state[:active_sessions])
  134. assert_equal(4, agent_state[:seads_available])
  135. assert_equal(6, agent_state[:seads_total])
  136. assert_equal(true, agent_state[:active])
  137. # check agent2 state
  138. agent_state = Chat.agent_state_with_sessions(agent2.id)
  139. assert_equal(2, agent_state[:waiting_chat_count])
  140. assert_equal(0, agent_state[:running_chat_count])
  141. assert_equal([], agent_state[:active_sessions])
  142. assert_equal(4, agent_state[:seads_available])
  143. assert_equal(6, agent_state[:seads_total])
  144. assert_equal(true, agent_state[:active])
  145. # start new chats
  146. chat_session3 = Chat::Session.create(
  147. chat_id: chat.id,
  148. )
  149. chat_session4 = Chat::Session.create(
  150. chat_id: chat.id,
  151. )
  152. chat_session5 = Chat::Session.create(
  153. chat_id: chat.id,
  154. )
  155. chat_session6 = Chat::Session.create(
  156. chat_id: chat.id,
  157. )
  158. # check customer state
  159. assert_equal('no_seats_available', chat.customer_state[:state])
  160. # check agent1 state
  161. agent_state = Chat.agent_state_with_sessions(agent1.id)
  162. assert_equal(6, agent_state[:waiting_chat_count])
  163. assert_equal(0, agent_state[:running_chat_count])
  164. assert_equal([], agent_state[:active_sessions])
  165. assert_equal(0, agent_state[:seads_available])
  166. assert_equal(6, agent_state[:seads_total])
  167. assert_equal(true, agent_state[:active])
  168. # check agent2 state
  169. agent_state = Chat.agent_state_with_sessions(agent2.id)
  170. assert_equal(6, agent_state[:waiting_chat_count])
  171. assert_equal(0, agent_state[:running_chat_count])
  172. assert_equal([], agent_state[:active_sessions])
  173. assert_equal(0, agent_state[:seads_available])
  174. assert_equal(6, agent_state[:seads_total])
  175. assert_equal(true, agent_state[:active])
  176. chat_session6.user_id = agent1.id
  177. chat_session6.state = 'running'
  178. chat_session6.save
  179. Chat::Message.create(
  180. chat_session_id: chat_session6.id,
  181. content: 'message 1',
  182. created_by_id: agent1.id,
  183. )
  184. travel 1.second
  185. Chat::Message.create(
  186. chat_session_id: chat_session6.id,
  187. content: 'message 2',
  188. created_by_id: agent1.id,
  189. )
  190. travel 1.second
  191. Chat::Message.create(
  192. chat_session_id: chat_session6.id,
  193. content: 'message 3',
  194. created_by_id: agent1.id,
  195. )
  196. travel 1.second
  197. Chat::Message.create(
  198. chat_session_id: chat_session6.id,
  199. content: 'message 4',
  200. created_by_id: nil,
  201. )
  202. # check customer state
  203. customer_state = chat.customer_state
  204. assert_equal('no_seats_available', customer_state[:state])
  205. assert_equal(5, customer_state[:queue])
  206. # customer chat state
  207. customer_state = chat.customer_state(chat_session6.session_id)
  208. assert_equal('reconnect', customer_state[:state])
  209. assert(customer_state[:session])
  210. assert_equal(Array, customer_state[:session].class)
  211. assert_equal('message 1', customer_state[:session][0]['content'])
  212. assert_equal('message 2', customer_state[:session][1]['content'])
  213. assert_equal('message 3', customer_state[:session][2]['content'])
  214. assert_equal('message 4', customer_state[:session][3]['content'])
  215. assert_equal('Notification Agent1', customer_state[:agent][:name])
  216. assert_equal(nil, customer_state[:agent][:avatar])
  217. # check agent1 state
  218. agent_state = Chat.agent_state_with_sessions(agent1.id)
  219. assert_equal(5, agent_state[:waiting_chat_count])
  220. assert_equal(1, agent_state[:running_chat_count])
  221. assert_equal(Array, agent_state[:active_sessions].class)
  222. assert_equal(chat.id, agent_state[:active_sessions][0]['chat_id'])
  223. assert_equal(agent1.id, agent_state[:active_sessions][0]['user_id'])
  224. assert(agent_state[:active_sessions][0]['messages'])
  225. assert_equal(Array, agent_state[:active_sessions][0]['messages'].class)
  226. assert_equal('message 1', agent_state[:active_sessions][0]['messages'][0]['content'])
  227. assert_equal('message 2', agent_state[:active_sessions][0]['messages'][1]['content'])
  228. assert_equal('message 3', agent_state[:active_sessions][0]['messages'][2]['content'])
  229. assert_equal('message 4', agent_state[:active_sessions][0]['messages'][3]['content'])
  230. assert_equal(0, agent_state[:seads_available])
  231. assert_equal(6, agent_state[:seads_total])
  232. assert_equal(true, agent_state[:active])
  233. # check agent2 state
  234. agent_state = Chat.agent_state_with_sessions(agent2.id)
  235. assert_equal(5, agent_state[:waiting_chat_count])
  236. assert_equal(1, agent_state[:running_chat_count])
  237. assert_equal([], agent_state[:active_sessions])
  238. assert_equal(0, agent_state[:seads_available])
  239. assert_equal(6, agent_state[:seads_total])
  240. assert_equal(true, agent_state[:active])
  241. chat_agent2.active = false
  242. chat_agent2.save
  243. # check customer state
  244. assert_equal('no_seats_available', chat.customer_state[:state])
  245. assert_equal(5, chat.customer_state[:queue])
  246. # check agent1 state
  247. agent_state = Chat.agent_state_with_sessions(agent1.id)
  248. assert_equal(5, agent_state[:waiting_chat_count])
  249. assert_equal(1, agent_state[:running_chat_count])
  250. assert_equal(Array, agent_state[:active_sessions].class)
  251. assert_equal(chat.id, agent_state[:active_sessions][0]['chat_id'])
  252. assert_equal(agent1.id, agent_state[:active_sessions][0]['user_id'])
  253. assert(agent_state[:active_sessions][0]['messages'])
  254. assert_equal(Array, agent_state[:active_sessions][0]['messages'].class)
  255. assert_equal('message 1', agent_state[:active_sessions][0]['messages'][0]['content'])
  256. assert_equal('message 2', agent_state[:active_sessions][0]['messages'][1]['content'])
  257. assert_equal('message 3', agent_state[:active_sessions][0]['messages'][2]['content'])
  258. assert_equal('message 4', agent_state[:active_sessions][0]['messages'][3]['content'])
  259. assert_equal(-2, agent_state[:seads_available])
  260. assert_equal(4, agent_state[:seads_total])
  261. assert_equal(true, agent_state[:active])
  262. # check agent2 state
  263. agent_state = Chat.agent_state_with_sessions(agent2.id)
  264. assert_equal(5, agent_state[:waiting_chat_count])
  265. assert_equal(1, agent_state[:running_chat_count])
  266. assert_equal([], agent_state[:active_sessions])
  267. assert_equal(-2, agent_state[:seads_available])
  268. assert_equal(4, agent_state[:seads_total])
  269. assert_equal(false, agent_state[:active])
  270. chat_session6.state = 'closed'
  271. chat_session6.save
  272. # check customer state
  273. assert_equal('no_seats_available', chat.customer_state[:state])
  274. assert_equal(5, chat.customer_state[:queue])
  275. # check agent1 state
  276. agent_state = Chat.agent_state_with_sessions(agent1.id)
  277. assert_equal(5, agent_state[:waiting_chat_count])
  278. assert_equal(0, agent_state[:running_chat_count])
  279. assert_equal([], agent_state[:active_sessions])
  280. assert_equal(-1, agent_state[:seads_available])
  281. assert_equal(4, agent_state[:seads_total])
  282. assert_equal(true, agent_state[:active])
  283. # check agent2 state
  284. agent_state = Chat.agent_state_with_sessions(agent2.id)
  285. assert_equal(5, agent_state[:waiting_chat_count])
  286. assert_equal(0, agent_state[:running_chat_count])
  287. assert_equal([], agent_state[:active_sessions])
  288. assert_equal(-1, agent_state[:seads_available])
  289. assert_equal(4, agent_state[:seads_total])
  290. assert_equal(false, agent_state[:active])
  291. chat_session5.destroy
  292. chat_session4.destroy
  293. # check customer state
  294. assert_equal('online', chat.customer_state[:state])
  295. # check agent1 state
  296. agent_state = Chat.agent_state_with_sessions(agent1.id)
  297. assert_equal(3, agent_state[:waiting_chat_count])
  298. assert_equal(0, agent_state[:running_chat_count])
  299. assert_equal([], agent_state[:active_sessions])
  300. assert_equal(1, agent_state[:seads_available])
  301. assert_equal(4, agent_state[:seads_total])
  302. assert_equal(true, agent_state[:active])
  303. # check agent2 state
  304. agent_state = Chat.agent_state_with_sessions(agent2.id)
  305. assert_equal(3, agent_state[:waiting_chat_count])
  306. assert_equal(0, agent_state[:running_chat_count])
  307. assert_equal([], agent_state[:active_sessions])
  308. assert_equal(1, agent_state[:seads_available])
  309. assert_equal(4, agent_state[:seads_total])
  310. assert_equal(false, agent_state[:active])
  311. travel_back
  312. end
  313. end