email_process_follow_up_test.rb 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. # encoding: utf-8
  2. require 'test_helper'
  3. class EmailProcessFollowUpTest < ActiveSupport::TestCase
  4. test 'process with follow up check' do
  5. ticket = Ticket.create(
  6. title: 'follow up check',
  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. article = Ticket::Article.create(
  15. ticket_id: ticket.id,
  16. from: 'some_sender@example.com',
  17. to: 'some_recipient@example.com',
  18. subject: 'follow up check',
  19. message_id: '<20150830145601.30.608882@edenhofer.zammad.com>',
  20. body: 'some message article',
  21. internal: false,
  22. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  23. type: Ticket::Article::Type.lookup(name: 'email'),
  24. updated_by_id: 1,
  25. created_by_id: 1,
  26. )
  27. email_raw_string_subject = "From: me@example.com
  28. To: customer@example.com
  29. Subject: #{ticket.subject_build('some new subject')}
  30. Some Text"
  31. email_raw_string_body = "From: me@example.com
  32. To: customer@example.com
  33. Subject: no reference
  34. Some Text #{ticket.subject_build('some new subject')} "
  35. email_raw_string_attachment = "From: me@example.com
  36. Content-Type: multipart/mixed; boundary=\"Apple-Mail=_ED77AC8D-FB6F-40E5-8FBE-D41FF5E1BAF2\"
  37. Subject: no reference
  38. Date: Sun, 30 Aug 2015 23:20:54 +0200
  39. To: Martin Edenhofer <me@znuny.com>
  40. Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
  41. X-Mailer: Apple Mail (2.2104)
  42. --Apple-Mail=_ED77AC8D-FB6F-40E5-8FBE-D41FF5E1BAF2
  43. Content-Transfer-Encoding: 7bit
  44. Content-Type: text/plain;
  45. charset=us-ascii
  46. no reference
  47. --Apple-Mail=_ED77AC8D-FB6F-40E5-8FBE-D41FF5E1BAF2
  48. Content-Disposition: attachment;
  49. filename=test1.txt
  50. Content-Type: text/plain;
  51. name=\"test.txt\"
  52. Content-Transfer-Encoding: 7bit
  53. Some Text #{ticket.subject_build('some new subject')}
  54. --Apple-Mail=_ED77AC8D-FB6F-40E5-8FBE-D41FF5E1BAF2--"
  55. email_raw_string_references1 = "From: me@example.com
  56. To: customer@example.com
  57. Subject: no reference
  58. In-Reply-To: <20150830145601.30.608882@edenhofer.zammad.com>
  59. References: <DA918CD1-BE9A-4262-ACF6-5001E59291B6@znuny.com>
  60. no reference "
  61. email_raw_string_references2 = "From: me@example.com
  62. To: customer@example.com
  63. Subject: no reference
  64. References: <DA918CD1-BE9A-4262-ACF6-5001E59291B6@znuny.com> <20150830145601.30.608882@edenhofer.zammad.com> <DA918CD1-BE9A-4262-ACF6-5001E59291XX@znuny.com>
  65. no reference "
  66. setting_orig = Setting.get('postmaster_follow_up_search_in')
  67. Setting.set('postmaster_follow_up_search_in', %w(body attachment references))
  68. sleep 1
  69. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_subject)
  70. assert_equal(ticket.id, ticket_p.id)
  71. sleep 1
  72. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_body)
  73. assert_equal(ticket.id, ticket_p.id)
  74. sleep 1
  75. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_attachment)
  76. assert_equal(ticket.id, ticket_p.id)
  77. sleep 1
  78. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_references1)
  79. assert_equal(ticket.id, ticket_p.id)
  80. sleep 1
  81. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_references2)
  82. assert_equal(ticket.id, ticket_p.id)
  83. Setting.set('postmaster_follow_up_search_in', setting_orig)
  84. sleep 1
  85. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_subject)
  86. assert_equal(ticket.id, ticket_p.id)
  87. sleep 1
  88. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_body)
  89. assert_not_equal(ticket.id, ticket_p.id)
  90. sleep 1
  91. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_attachment)
  92. assert_not_equal(ticket.id, ticket_p.id)
  93. sleep 1
  94. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_references1)
  95. assert_not_equal(ticket.id, ticket_p.id)
  96. sleep 1
  97. ticket_p, article_p, user_p = Channel::EmailParser.new.process({}, email_raw_string_references2)
  98. assert_not_equal(ticket.id, ticket_p.id)
  99. end
  100. test 'process with follow up check with two external reference headers' do
  101. setting_orig = Setting.get('postmaster_follow_up_search_in')
  102. Setting.set('postmaster_follow_up_search_in', %w(body attachment references))
  103. data1 = "From: me@example.com
  104. To: z@example.com
  105. Subject: test 123
  106. Message-ID: <9d16181c-2db2-c6c1-ff7f-41f2da4e289a@linuxhotel.de>
  107. test 123
  108. "
  109. ticket_p1, article_p1, user_p1 = Channel::EmailParser.new.process({}, data1)
  110. sleep 1
  111. data1 = "From: me@example.com
  112. To: z@example.com
  113. Subject: test 123
  114. Message-ID: <9d16181c-2db2-c6c1-ff7f-41f2da4e289a@linuxhotel.de>
  115. test 123
  116. "
  117. ticket_p2, article_p2, user_p2 = Channel::EmailParser.new.process({}, data1)
  118. assert_not_equal(ticket_p1.id, ticket_p2.id)
  119. data2 = "From: you@example.com
  120. To: y@example.com
  121. Subject: RE: test 123
  122. Message-ID: <oknn9teOke2uqbFQdGj2umXUwTkqgu0CqWHkA6V4K8p@akmail>
  123. References: <9d16181c-2db2-c6c1-ff7f-41f2da4e289a@linuxhotel.de>
  124. test 123
  125. "
  126. ticket_p3, article_p3, user_p3 = Channel::EmailParser.new.process({}, data2)
  127. assert_equal(ticket_p2.id, ticket_p3.id)
  128. Setting.set('postmaster_follow_up_search_in', setting_orig)
  129. end
  130. test 'process with follow up check - with auto responses and no T# in subject_build' do
  131. ticket = Ticket.create(
  132. title: 'follow up - with references follow up check',
  133. group: Group.lookup(name: 'Users'),
  134. customer_id: 2,
  135. state: Ticket::State.lookup(name: 'closed'),
  136. priority: Ticket::Priority.lookup(name: '2 normal'),
  137. updated_by_id: 1,
  138. created_by_id: 1,
  139. )
  140. article = Ticket::Article.create(
  141. ticket_id: ticket.id,
  142. from: 'some_sender@example.com',
  143. to: 'some_recipient@example.com',
  144. subject: 'follow up with references follow up check',
  145. message_id: '<20151222145601.30.608881@edenhofer.zammad.com>',
  146. body: 'some message with references follow up check',
  147. internal: false,
  148. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  149. type: Ticket::Article::Type.lookup(name: 'email'),
  150. updated_by_id: 1,
  151. created_by_id: 1,
  152. )
  153. sleep 1
  154. # auto response without T# in subject, find follow up by references header
  155. email_raw_string = "From: bob@example.com
  156. To: customer@example.com
  157. Subject: =?ISO-8859-1?Q?AUTO=3A_Bob_Smith_ist_au=DFer_Haus=2E_=2F_is_out_of?=
  158. =?ISO-8859-1?Q?_office=2E_=28R=FCckkehr_am_28=2E12=2E2015=29?=
  159. In-Reply-To: <20251222081758.116249.983698@portal.znuny.com>
  160. References: <OF9D1FD72A.878EF84E-ONC1257F22.003D7BB4-C1257F22.003F4503@example.com> <20151222145601.30.608881@edenhofer.zammad.com> <20251222081758.116249.983698@portal.znuny.com>
  161. Message-ID: <OFD563742F.FC05EEAF-ONC1257F23.002DAE02@example.com>
  162. Auto-Submitted: auto-replied
  163. Some Text"
  164. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string)
  165. ticket = Ticket.find(ticket.id)
  166. assert_equal(ticket.id, ticket_p.id)
  167. assert_equal('open', ticket.state.name)
  168. end
  169. test 'process with follow up check - email with more forgein T#\'s in subject' do
  170. ticket = Ticket.create(
  171. title: 'email with more forgein T#\'s in subject',
  172. group: Group.lookup(name: 'Users'),
  173. customer_id: 2,
  174. state: Ticket::State.lookup(name: 'closed'),
  175. priority: Ticket::Priority.lookup(name: '2 normal'),
  176. updated_by_id: 1,
  177. created_by_id: 1,
  178. )
  179. article = Ticket::Article.create(
  180. ticket_id: ticket.id,
  181. from: 'some_sender@example.com',
  182. to: 'some_recipient@example.com',
  183. subject: 'follow up with references follow up check',
  184. message_id: '<20151222145601.30.608881@edenhofer.zammad.com>',
  185. body: 'some message with references follow up check',
  186. internal: false,
  187. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  188. type: Ticket::Article::Type.lookup(name: 'email'),
  189. updated_by_id: 1,
  190. created_by_id: 1,
  191. )
  192. sleep 1
  193. system_id = Setting.get('system_id')
  194. ticket_hook = Setting.get('ticket_hook')
  195. ticket_hook_divider = Setting.get('ticket_hook_divider')
  196. tn = "[#{ticket_hook}#{ticket_hook_divider}#{system_id}#{Ticket::Number.generate}99]"
  197. email_raw_string_subject = "From: me@example.com
  198. To: customer@example.com
  199. Subject: First foreign Tn #{tn} #{tn} #{tn} - #{ticket.subject_build('some new subject')}
  200. Some Text"
  201. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, email_raw_string_subject)
  202. ticket = Ticket.find(ticket.id)
  203. assert_equal(ticket.id, ticket_p.id)
  204. assert_equal('open', ticket.state.name)
  205. end
  206. end