ticket_test.rb 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. # encoding: utf-8
  2. require 'test_helper'
  3. class TicketTest < ActiveSupport::TestCase
  4. test 'ticket create' do
  5. ticket = Ticket.create(
  6. title: "some title\n äöüß",
  7. group: Group.lookup(name: 'Users'),
  8. customer_id: 2,
  9. state: Ticket::State.lookup(name: 'new'),
  10. priority: Ticket::Priority.lookup(name: '2 normal'),
  11. updated_by_id: 1,
  12. created_by_id: 1,
  13. )
  14. assert(ticket, 'ticket created')
  15. assert_equal(ticket.title, 'some title äöüß', 'ticket.title verify')
  16. assert_equal(ticket.group.name, 'Users', 'ticket.group verify')
  17. assert_equal(ticket.state.name, 'new', 'ticket.state verify')
  18. # create inbound article #1
  19. article_inbound1 = Ticket::Article.create(
  20. ticket_id: ticket.id,
  21. from: 'some_sender@example.com',
  22. to: 'some_recipient@example.com',
  23. subject: 'some subject',
  24. message_id: 'some@id',
  25. body: 'some message article_inbound1 😍😍😍',
  26. internal: false,
  27. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  28. type: Ticket::Article::Type.find_by(name: 'email'),
  29. updated_by_id: 1,
  30. created_by_id: 1,
  31. )
  32. assert_equal(article_inbound1.body, 'some message article_inbound1 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  33. ticket = Ticket.find(ticket.id)
  34. assert_equal(ticket.article_count, 1, 'ticket.article_count verify - inbound')
  35. assert_equal(ticket.last_contact.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact verify - inbound')
  36. assert_equal(ticket.last_contact_customer.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer verify - inbound')
  37. assert_equal(ticket.last_contact_agent, nil, 'ticket.last_contact_agent verify - inbound')
  38. assert_equal(ticket.first_response, nil, 'ticket.first_response verify - inbound')
  39. assert_equal(ticket.close_time, nil, 'ticket.close_time verify - inbound')
  40. # create inbound article #2
  41. sleep 2
  42. article_inbound2 = Ticket::Article.create(
  43. ticket_id: ticket.id,
  44. from: 'some_sender@example.com',
  45. to: 'some_recipient@example.com',
  46. subject: 'some subject',
  47. message_id: 'some@id',
  48. body: 'some message article_inbound2 😍😍😍',
  49. internal: false,
  50. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  51. type: Ticket::Article::Type.find_by(name: 'email'),
  52. updated_by_id: 1,
  53. created_by_id: 1,
  54. )
  55. assert_equal(article_inbound2.body, 'some message article_inbound2 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  56. ticket = Ticket.find(ticket.id)
  57. assert_equal(ticket.article_count, 2, 'ticket.article_count verify - inbound')
  58. assert_equal(ticket.last_contact.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact verify - inbound')
  59. assert_equal(ticket.last_contact_customer.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer verify - inbound')
  60. assert_equal(ticket.last_contact_agent, nil, 'ticket.last_contact_agent verify - inbound')
  61. assert_equal(ticket.first_response, nil, 'ticket.first_response verify - inbound')
  62. assert_equal(ticket.close_time, nil, 'ticket.close_time verify - inbound')
  63. # create note article
  64. article_note = Ticket::Article.create(
  65. ticket_id: ticket.id,
  66. from: 'some person',
  67. subject: "some\nnote",
  68. body: "some\n message",
  69. internal: true,
  70. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  71. type: Ticket::Article::Type.find_by(name: 'note'),
  72. updated_by_id: 1,
  73. created_by_id: 1,
  74. )
  75. assert_equal(article_note.subject, 'some note', 'article_note.subject verify - inbound')
  76. assert_equal(article_note.body, "some\n message", 'article_note.body verify - inbound')
  77. ticket = Ticket.find(ticket.id)
  78. assert_equal(ticket.article_count, 3, 'ticket.article_count verify - note')
  79. assert_equal(ticket.last_contact.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact verify - note')
  80. assert_equal(ticket.last_contact_customer.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer verify - note')
  81. assert_equal(ticket.last_contact_agent, nil, 'ticket.last_contact_agent verify - note')
  82. assert_equal(ticket.first_response, nil, 'ticket.first_response verify - note')
  83. assert_equal(ticket.close_time, nil, 'ticket.close_time verify - note')
  84. # create outbound article
  85. sleep 2
  86. article_outbound = Ticket::Article.create(
  87. ticket_id: ticket.id,
  88. from: 'some_recipient@example.com',
  89. to: 'some_sender@example.com',
  90. subject: 'some subject',
  91. message_id: 'some@id2',
  92. body: 'some message 2',
  93. internal: false,
  94. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  95. type: Ticket::Article::Type.find_by(name: 'email'),
  96. updated_by_id: 1,
  97. created_by_id: 1,
  98. )
  99. ticket = Ticket.find(ticket.id)
  100. assert_equal(ticket.article_count, 4, 'ticket.article_count verify - outbound')
  101. assert_equal(ticket.last_contact.to_s, article_outbound.created_at.to_s, 'ticket.last_contact verify - outbound')
  102. assert_equal(ticket.last_contact_customer.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer verify - outbound')
  103. assert_equal(ticket.last_contact_agent.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent verify - outbound')
  104. assert_equal(ticket.first_response.to_s, article_outbound.created_at.to_s, 'ticket.first_response verify - outbound')
  105. assert_equal(ticket.close_time, nil, 'ticket.close_time verify - outbound')
  106. # create inbound article #3
  107. article_inbound3 = Ticket::Article.create(
  108. ticket_id: ticket.id,
  109. from: 'some_sender@example.com',
  110. to: 'some_recipient@example.com',
  111. subject: 'some subject',
  112. message_id: 'some@id',
  113. body: 'some message article_inbound3 😍😍😍',
  114. internal: false,
  115. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  116. type: Ticket::Article::Type.find_by(name: 'email'),
  117. updated_by_id: 1,
  118. created_by_id: 1,
  119. )
  120. assert_equal(article_inbound3.body, 'some message article_inbound3 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  121. ticket = Ticket.find(ticket.id)
  122. assert_equal(ticket.article_count, 5, 'ticket.article_count verify - inbound')
  123. assert_equal(ticket.last_contact.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact verify - inbound')
  124. assert_equal(ticket.last_contact_customer.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact_customer verify - inbound')
  125. assert_equal(ticket.last_contact_agent.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent verify - outbound')
  126. assert_equal(ticket.first_response.to_s, article_outbound.created_at.to_s, 'ticket.first_response verify - outbound')
  127. assert_equal(ticket.close_time, nil, 'ticket.close_time verify - outbound')
  128. # create inbound article #4
  129. sleep 2
  130. article_inbound4 = Ticket::Article.create(
  131. ticket_id: ticket.id,
  132. from: 'some_sender@example.com',
  133. to: 'some_recipient@example.com',
  134. subject: 'some subject',
  135. message_id: 'some@id',
  136. body: 'some message article_inbound4 😍😍😍',
  137. internal: false,
  138. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  139. type: Ticket::Article::Type.find_by(name: 'email'),
  140. updated_by_id: 1,
  141. created_by_id: 1,
  142. )
  143. assert_equal(article_inbound4.body, 'some message article_inbound4 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  144. ticket = Ticket.find(ticket.id)
  145. assert_equal(ticket.article_count, 6, 'ticket.article_count verify - inbound')
  146. assert_equal(ticket.last_contact.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact verify - inbound')
  147. assert_equal(ticket.last_contact_customer.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact_customer verify - inbound')
  148. assert_equal(ticket.last_contact_agent.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent verify - outbound')
  149. assert_equal(ticket.first_response.to_s, article_outbound.created_at.to_s, 'ticket.first_response verify - outbound')
  150. assert_equal(ticket.close_time, nil, 'ticket.close_time verify - outbound')
  151. ticket.state_id = Ticket::State.where(name: 'closed').first.id
  152. ticket.save
  153. ticket = Ticket.find(ticket.id)
  154. assert_equal(ticket.article_count, 6, 'ticket.article_count verify - state update')
  155. assert_equal(ticket.last_contact.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact verify - state update')
  156. assert_equal(ticket.last_contact_customer.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact_customer verify - state update')
  157. assert_equal(ticket.last_contact_agent.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent verify - state update')
  158. assert_equal(ticket.first_response.to_s, article_outbound.created_at.to_s, 'ticket.first_response verify - state update')
  159. assert(ticket.close_time, 'ticket.close_time verify - state update')
  160. # set pending time
  161. ticket.state_id = Ticket::State.find_by(name: 'pending reminder').id
  162. ticket.pending_time = Time.zone.parse('1977-10-27 22:00:00 +0000')
  163. ticket.save
  164. ticket = Ticket.find(ticket.id)
  165. assert_equal(ticket.state.name, 'pending reminder', 'state verify')
  166. assert_equal(ticket.pending_time, Time.zone.parse('1977-10-27 22:00:00 +0000'), 'pending_time verify')
  167. # reset pending state, should also reset pending time
  168. ticket.state_id = Ticket::State.find_by(name: 'closed').id
  169. ticket.save
  170. ticket = Ticket.find(ticket.id)
  171. assert_equal(ticket.state.name, 'closed', 'state verify')
  172. assert_equal(ticket.pending_time, nil )
  173. delete = ticket.destroy
  174. assert(delete, 'ticket destroy')
  175. end
  176. test 'ticket latest change' do
  177. ticket1 = Ticket.create(
  178. title: 'latest change 1',
  179. group: Group.lookup(name: 'Users'),
  180. customer_id: 2,
  181. state: Ticket::State.lookup(name: 'new'),
  182. priority: Ticket::Priority.lookup(name: '2 normal'),
  183. updated_by_id: 1,
  184. created_by_id: 1,
  185. )
  186. assert_equal(Ticket.latest_change.to_s, ticket1.updated_at.to_s)
  187. sleep 1
  188. ticket2 = Ticket.create(
  189. title: 'latest change 2',
  190. group: Group.lookup(name: 'Users'),
  191. customer_id: 2,
  192. state: Ticket::State.lookup(name: 'new'),
  193. priority: Ticket::Priority.lookup(name: '2 normal'),
  194. updated_by_id: 1,
  195. created_by_id: 1,
  196. )
  197. assert_equal(Ticket.latest_change.to_s, ticket2.updated_at.to_s)
  198. sleep 1
  199. ticket1.title = 'latest change 1 - 1'
  200. ticket1.save
  201. assert_equal(Ticket.latest_change.to_s, ticket1.updated_at.to_s)
  202. sleep 1
  203. ticket1.touch
  204. assert_equal(Ticket.latest_change.to_s, ticket1.updated_at.to_s)
  205. ticket1.destroy
  206. assert_equal(Ticket.latest_change.to_s, ticket2.updated_at.to_s)
  207. end
  208. test 'ticket process_pending' do
  209. # close all other pending close tickets first
  210. Ticket.where('pending_time IS NOT NULL').each {|ticket|
  211. ticket.state = Ticket::State.lookup(name: 'closed')
  212. ticket.save!
  213. }
  214. ticket = Ticket.create(
  215. title: 'pending close test',
  216. group: Group.lookup(name: 'Users'),
  217. customer_id: 2,
  218. state: Ticket::State.lookup(name: 'pending close'),
  219. pending_time: Time.zone.now - 60,
  220. priority: Ticket::Priority.lookup(name: '2 normal'),
  221. updated_by_id: 1,
  222. created_by_id: 1,
  223. )
  224. lookup_ticket = Ticket.find_by('pending_time <= ?', Time.zone.now)
  225. assert_equal(lookup_ticket.id, ticket.id, 'ticket.pending_time verify')
  226. Ticket.process_pending
  227. lookup_ticket = Ticket.find_by('pending_time <= ?', Time.zone.now)
  228. assert_nil(lookup_ticket, 'ticket.pending_time processed verify')
  229. end
  230. test 'ticket subject' do
  231. ticket1 = Ticket.create(
  232. title: 'subject test 1',
  233. group: Group.lookup(name: 'Users'),
  234. customer_id: 2,
  235. state: Ticket::State.lookup(name: 'new'),
  236. priority: Ticket::Priority.lookup(name: '2 normal'),
  237. updated_by_id: 1,
  238. created_by_id: 1,
  239. )
  240. assert_equal('subject test 1', ticket1.title)
  241. assert_equal("ABC subject test 1 [Ticket##{ticket1.number}]", ticket1.subject_build('ABC subject test 1'))
  242. assert_equal("RE: ABC subject test 1 [Ticket##{ticket1.number}]", ticket1.subject_build('ABC subject test 1', true))
  243. ticket1.destroy
  244. end
  245. end