ticket_test.rb 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. require 'test_helper'
  3. class TicketTest < ActiveSupport::TestCase
  4. setup do
  5. Ticket.destroy_all
  6. end
  7. test 'ticket create' do
  8. ticket = Ticket.create!(
  9. title: "some title\n äöüß",
  10. group: Group.lookup(name: 'Users'),
  11. customer_id: 2,
  12. state: Ticket::State.lookup(name: 'new'),
  13. priority: Ticket::Priority.lookup(name: '2 normal'),
  14. updated_by_id: 1,
  15. created_by_id: 1,
  16. )
  17. assert(ticket, 'ticket created')
  18. assert_equal(ticket.title, 'some title äöüß', 'ticket.title verify')
  19. assert_equal(ticket.group.name, 'Users', 'ticket.group verify')
  20. assert_equal(ticket.state.name, 'new', 'ticket.state verify')
  21. # create inbound article #1
  22. article_inbound1 = Ticket::Article.create!(
  23. ticket_id: ticket.id,
  24. from: 'some_sender@example.com',
  25. to: 'some_recipient@example.com',
  26. subject: 'some subject',
  27. message_id: 'some@id',
  28. body: 'some message article_inbound1 😍😍😍',
  29. internal: false,
  30. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  31. type: Ticket::Article::Type.find_by(name: 'email'),
  32. updated_by_id: 1,
  33. created_by_id: 1,
  34. )
  35. assert_equal(article_inbound1.body, 'some message article_inbound1 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  36. ticket = Ticket.find(ticket.id)
  37. assert_equal(ticket.article_count, 1, 'ticket.article_count verify - inbound')
  38. assert_equal(ticket.last_contact_at.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact verify - inbound')
  39. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  40. assert_nil(ticket.last_contact_agent_at, 'ticket.last_contact_agent_at verify - inbound')
  41. assert_nil(ticket.first_response_at, 'ticket.first_response_at verify - inbound')
  42. assert_nil(ticket.close_at, 'ticket.close_at verify - inbound')
  43. # create inbound article #2
  44. travel 2.seconds
  45. article_inbound2 = Ticket::Article.create!(
  46. ticket_id: ticket.id,
  47. from: 'some_sender@example.com',
  48. to: 'some_recipient@example.com',
  49. subject: 'some subject',
  50. message_id: 'some@id',
  51. body: 'some message article_inbound2 😍😍😍',
  52. internal: false,
  53. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  54. type: Ticket::Article::Type.find_by(name: 'email'),
  55. updated_by_id: 1,
  56. created_by_id: 1,
  57. )
  58. assert_equal(article_inbound2.body, 'some message article_inbound2 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  59. ticket = Ticket.find(ticket.id)
  60. assert_equal(ticket.article_count, 2, 'ticket.article_count verify - inbound')
  61. assert_equal(ticket.last_contact_at.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact verify - inbound')
  62. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  63. assert_nil(ticket.last_contact_agent_at, 'ticket.last_contact_agent_at verify - inbound')
  64. assert_nil(ticket.first_response_at, 'ticket.first_response_at verify - inbound')
  65. assert_nil(ticket.close_at, 'ticket.close_at verify - inbound')
  66. # create note article
  67. article_note = Ticket::Article.create!(
  68. ticket_id: ticket.id,
  69. from: 'some person',
  70. subject: "some\nnote",
  71. body: "some\n message",
  72. internal: true,
  73. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  74. type: Ticket::Article::Type.find_by(name: 'note'),
  75. updated_by_id: 1,
  76. created_by_id: 1,
  77. )
  78. assert_equal(article_note.subject, 'some note', 'article_note.subject verify - inbound')
  79. assert_equal(article_note.body, "some\n message", 'article_note.body verify - inbound')
  80. ticket = Ticket.find(ticket.id)
  81. assert_equal(ticket.article_count, 3, 'ticket.article_count verify - note')
  82. assert_equal(ticket.last_contact_at.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact verify - note')
  83. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer_at verify - note')
  84. assert_nil(ticket.last_contact_agent_at, 'ticket.last_contact_agent_at verify - note')
  85. assert_nil(ticket.first_response_at, 'ticket.first_response_at verify - note')
  86. assert_nil(ticket.close_at, 'ticket.close_at verify - note')
  87. # create outbound article
  88. travel 2.seconds
  89. article_outbound = Ticket::Article.create!(
  90. ticket_id: ticket.id,
  91. from: 'some_recipient@example.com',
  92. to: 'some_sender@example.com',
  93. subject: 'some subject',
  94. message_id: 'some@id2',
  95. body: 'some message 2',
  96. internal: false,
  97. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  98. type: Ticket::Article::Type.find_by(name: 'email'),
  99. updated_by_id: 1,
  100. created_by_id: 1,
  101. )
  102. ticket = Ticket.find(ticket.id)
  103. assert_equal(ticket.article_count, 4, 'ticket.article_count verify - outbound')
  104. assert_equal(ticket.last_contact_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact verify - outbound')
  105. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound1.created_at.to_s, 'ticket.last_contact_customer_at verify - outbound')
  106. assert_equal(ticket.last_contact_agent_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent_at verify - outbound')
  107. assert_equal(ticket.first_response_at.to_s, article_outbound.created_at.to_s, 'ticket.first_response_at verify - outbound')
  108. assert_nil(ticket.close_at, 'ticket.close_at verify - outbound')
  109. # create inbound article #3
  110. article_inbound3 = Ticket::Article.create!(
  111. ticket_id: ticket.id,
  112. from: 'some_sender@example.com',
  113. to: 'some_recipient@example.com',
  114. subject: 'some subject',
  115. message_id: 'some@id',
  116. body: 'some message article_inbound3 😍😍😍',
  117. internal: false,
  118. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  119. type: Ticket::Article::Type.find_by(name: 'email'),
  120. updated_by_id: 1,
  121. created_by_id: 1,
  122. )
  123. assert_equal(article_inbound3.body, 'some message article_inbound3 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  124. ticket = Ticket.find(ticket.id)
  125. assert_equal(ticket.article_count, 5, 'ticket.article_count verify - inbound')
  126. assert_equal(ticket.last_contact_at.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact verify - inbound')
  127. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  128. assert_equal(ticket.last_contact_agent_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent_at verify - outbound')
  129. assert_equal(ticket.first_response_at.to_s, article_outbound.created_at.to_s, 'ticket.first_response_at verify - outbound')
  130. assert_nil(ticket.close_at, 'ticket.close_at verify - outbound')
  131. # create inbound article #4
  132. travel 2.seconds
  133. article_inbound4 = Ticket::Article.create!(
  134. ticket_id: ticket.id,
  135. from: 'some_sender@example.com',
  136. to: 'some_recipient@example.com',
  137. subject: 'some subject',
  138. message_id: 'some@id',
  139. body: 'some message article_inbound4 😍😍😍',
  140. internal: false,
  141. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  142. type: Ticket::Article::Type.find_by(name: 'email'),
  143. updated_by_id: 1,
  144. created_by_id: 1,
  145. )
  146. assert_equal(article_inbound4.body, 'some message article_inbound4 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound')
  147. ticket = Ticket.find(ticket.id)
  148. assert_equal(ticket.article_count, 6, 'ticket.article_count verify - inbound')
  149. assert_equal(ticket.last_contact_at.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact verify - inbound')
  150. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  151. assert_equal(ticket.last_contact_agent_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent_at verify - outbound')
  152. assert_equal(ticket.first_response_at.to_s, article_outbound.created_at.to_s, 'ticket.first_response_at verify - outbound')
  153. assert_nil(ticket.close_at, 'ticket.close_at verify - outbound')
  154. ticket.state_id = Ticket::State.where(name: 'closed').first.id
  155. ticket.save
  156. ticket = Ticket.find(ticket.id)
  157. assert_equal(ticket.article_count, 6, 'ticket.article_count verify - state update')
  158. assert_equal(ticket.last_contact_at.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact verify - state update')
  159. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound3.created_at.to_s, 'ticket.last_contact_customer_at verify - state update')
  160. assert_equal(ticket.last_contact_agent_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent_at verify - state update')
  161. assert_equal(ticket.first_response_at.to_s, article_outbound.created_at.to_s, 'ticket.first_response_at verify - state update')
  162. assert(ticket.close_at, 'ticket.close_at verify - state update')
  163. # set pending time
  164. ticket.state_id = Ticket::State.find_by(name: 'pending reminder').id
  165. ticket.pending_time = Time.zone.parse('1977-10-27 22:00:00 +0000')
  166. ticket.save
  167. ticket = Ticket.find(ticket.id)
  168. assert_equal(ticket.state.name, 'pending reminder', 'state verify')
  169. assert_equal(ticket.pending_time, Time.zone.parse('1977-10-27 22:00:00 +0000'), 'pending_time verify')
  170. # reset pending state, should also reset pending time
  171. ticket.state_id = Ticket::State.find_by(name: 'closed').id
  172. ticket.save
  173. ticket = Ticket.find(ticket.id)
  174. assert_equal(ticket.state.name, 'closed', 'state verify')
  175. assert_nil(ticket.pending_time)
  176. # delete article
  177. article_note = Ticket::Article.create!(
  178. ticket_id: ticket.id,
  179. from: 'some person',
  180. subject: 'some note',
  181. body: 'some message',
  182. internal: true,
  183. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  184. type: Ticket::Article::Type.find_by(name: 'note'),
  185. updated_by_id: 1,
  186. created_by_id: 1,
  187. )
  188. ticket = Ticket.find(ticket.id)
  189. assert_equal(ticket.article_count, 7, 'ticket.article_count verify - note')
  190. article_note.destroy
  191. ticket = Ticket.find(ticket.id)
  192. assert_equal(ticket.article_count, 6, 'ticket.article_count verify - note')
  193. delete = ticket.destroy
  194. assert(delete, 'ticket destroy')
  195. travel_back
  196. end
  197. test 'ticket latest change' do
  198. ticket1 = Ticket.create!(
  199. title: 'latest change 1',
  200. group: Group.lookup(name: 'Users'),
  201. customer_id: 2,
  202. state: Ticket::State.lookup(name: 'new'),
  203. priority: Ticket::Priority.lookup(name: '2 normal'),
  204. updated_by_id: 1,
  205. created_by_id: 1,
  206. )
  207. assert_equal(Ticket.latest_change.to_s, ticket1.updated_at.to_s)
  208. travel 1.minute
  209. ticket2 = Ticket.create!(
  210. title: 'latest change 2',
  211. group: Group.lookup(name: 'Users'),
  212. customer_id: 2,
  213. state: Ticket::State.lookup(name: 'new'),
  214. priority: Ticket::Priority.lookup(name: '2 normal'),
  215. updated_by_id: 1,
  216. created_by_id: 1,
  217. )
  218. assert_equal(Ticket.latest_change.to_s, ticket2.updated_at.to_s)
  219. travel 1.minute
  220. ticket1.title = 'latest change 1 - 1'
  221. ticket1.save
  222. assert_equal(Ticket.latest_change.to_s, ticket1.updated_at.to_s)
  223. travel 1.minute
  224. ticket1.touch
  225. assert_equal(Ticket.latest_change.to_s, ticket1.updated_at.to_s)
  226. ticket1.destroy
  227. assert_equal(Ticket.latest_change.to_s, ticket2.updated_at.to_s)
  228. ticket2.destroy
  229. travel_back
  230. end
  231. test 'ticket process_pending' do
  232. # close all other pending close tickets first
  233. Ticket.where.not(pending_time: nil).each do |ticket|
  234. ticket.state = Ticket::State.lookup(name: 'closed')
  235. ticket.save!
  236. end
  237. ticket = Ticket.create!(
  238. title: 'pending close test',
  239. group: Group.lookup(name: 'Users'),
  240. customer_id: 2,
  241. state: Ticket::State.lookup(name: 'pending close'),
  242. pending_time: Time.zone.now - 60,
  243. priority: Ticket::Priority.lookup(name: '2 normal'),
  244. updated_by_id: 1,
  245. created_by_id: 1,
  246. )
  247. lookup_ticket = Ticket.find_by('pending_time <= ?', Time.zone.now)
  248. assert_equal(lookup_ticket.id, ticket.id, 'ticket.pending_time verify')
  249. Ticket.process_pending
  250. lookup_ticket = Ticket.find_by('pending_time <= ?', Time.zone.now)
  251. assert_nil(lookup_ticket, 'ticket.pending_time processed verify')
  252. end
  253. test 'ticket subject' do
  254. ticket = Ticket.create!(
  255. title: 'subject test 1',
  256. group: Group.lookup(name: 'Users'),
  257. customer_id: 2,
  258. state: Ticket::State.lookup(name: 'new'),
  259. priority: Ticket::Priority.lookup(name: '2 normal'),
  260. updated_by_id: 1,
  261. created_by_id: 1,
  262. )
  263. assert_equal('subject test 1', ticket.title)
  264. assert_equal("ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1'))
  265. assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1', 'reply'))
  266. assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build(' ABC subject test 1', 'reply'))
  267. assert_equal("RE: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1 ', 'reply'))
  268. assert_equal("FWD: ABC subject test 1 [Ticket##{ticket.number}]", ticket.subject_build('ABC subject test 1 ', 'forward'))
  269. ticket.destroy
  270. Setting.set('ticket_hook_position', 'left')
  271. ticket = Ticket.create!(
  272. title: 'subject test 1',
  273. group: Group.lookup(name: 'Users'),
  274. customer_id: 2,
  275. state: Ticket::State.lookup(name: 'new'),
  276. priority: Ticket::Priority.lookup(name: '2 normal'),
  277. updated_by_id: 1,
  278. created_by_id: 1,
  279. )
  280. assert_equal('subject test 1', ticket.title)
  281. assert_equal("[Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1'))
  282. assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1', 'reply'))
  283. assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build(' ABC subject test 1', 'reply'))
  284. assert_equal("RE: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1 ', 'reply'))
  285. assert_equal("FWD: [Ticket##{ticket.number}] ABC subject test 1", ticket.subject_build('ABC subject test 1 ', 'forward'))
  286. ticket.destroy
  287. Setting.set('ticket_hook_position', 'none')
  288. ticket = Ticket.create!(
  289. title: 'subject test 1',
  290. group: Group.lookup(name: 'Users'),
  291. customer_id: 2,
  292. state: Ticket::State.lookup(name: 'new'),
  293. priority: Ticket::Priority.lookup(name: '2 normal'),
  294. updated_by_id: 1,
  295. created_by_id: 1,
  296. )
  297. assert_equal('subject test 1', ticket.title)
  298. assert_equal('ABC subject test 1', ticket.subject_build('ABC subject test 1'))
  299. assert_equal('RE: ABC subject test 1', ticket.subject_build('ABC subject test 1', 'reply'))
  300. assert_equal('RE: ABC subject test 1', ticket.subject_build(' ABC subject test 1', 'reply'))
  301. assert_equal('RE: ABC subject test 1', ticket.subject_build('ABC subject test 1 ', 'reply'))
  302. assert_equal('FWD: ABC subject test 1', ticket.subject_build('ABC subject test 1 ', 'forward'))
  303. ticket.destroy
  304. end
  305. test 'ticket followup number check' do
  306. origin_backend = Setting.get('ticket_number')
  307. Setting.set('ticket_number', 'Ticket::Number::Increment')
  308. ticket1 = Ticket.create!(
  309. title: 'subject test 1234-1',
  310. group: Group.lookup(name: 'Users'),
  311. customer_id: 2,
  312. state: Ticket::State.lookup(name: 'new'),
  313. priority: Ticket::Priority.lookup(name: '2 normal'),
  314. updated_by_id: 1,
  315. created_by_id: 1,
  316. )
  317. assert_equal('subject test 1234-1', ticket1.title)
  318. assert_equal("ABC subject test 1 [Ticket##{ticket1.number}]", ticket1.subject_build('ABC subject test 1'))
  319. assert_equal(ticket1.id, Ticket::Number.check("Re: Help [Ticket##{ticket1.number}]").id)
  320. Setting.set('ticket_number', 'Ticket::Number::Date')
  321. ticket1 = Ticket.create!(
  322. title: 'subject test 1234-2',
  323. group: Group.lookup(name: 'Users'),
  324. customer_id: 2,
  325. state: Ticket::State.lookup(name: 'new'),
  326. priority: Ticket::Priority.lookup(name: '2 normal'),
  327. updated_by_id: 1,
  328. created_by_id: 1,
  329. )
  330. assert_equal('subject test 1234-2', ticket1.title)
  331. assert_equal("ABC subject test 1 [Ticket##{ticket1.number}]", ticket1.subject_build('ABC subject test 1'))
  332. assert_equal(ticket1.id, Ticket::Number.check("Re: Help [Ticket##{ticket1.number}]").id)
  333. Setting.set('ticket_number', origin_backend)
  334. end
  335. test 'article attachment helper 1' do
  336. ticket1 = Ticket.create!(
  337. title: 'some article helper test1',
  338. group: Group.lookup(name: 'Users'),
  339. customer_id: 2,
  340. state: Ticket::State.lookup(name: 'new'),
  341. priority: Ticket::Priority.lookup(name: '2 normal'),
  342. updated_by_id: 1,
  343. created_by_id: 1,
  344. )
  345. assert(ticket1, 'ticket created')
  346. # create inbound article #1
  347. article1 = Ticket::Article.create!(
  348. ticket_id: ticket1.id,
  349. from: 'some_sender@example.com',
  350. to: 'some_recipient@example.com',
  351. subject: 'some subject',
  352. message_id: 'some@id',
  353. content_type: 'text/html',
  354. body: 'some message article helper test1 <div><img style="width: 85.5px; height: 49.5px" src="cid:15.274327094.140938@zammad.example.com">asdasd<img src="cid:15.274327094.140939@zammad.example.com"><br>',
  355. internal: false,
  356. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  357. type: Ticket::Article::Type.find_by(name: 'email'),
  358. updated_by_id: 1,
  359. created_by_id: 1,
  360. )
  361. store1 = Store.add(
  362. object: 'Ticket::Article',
  363. o_id: article1.id,
  364. data: 'content_file1_normally_should_be_an_image',
  365. filename: 'some_file1.jpg',
  366. preferences: {
  367. 'Content-Type' => 'image/jpeg',
  368. 'Mime-Type' => 'image/jpeg',
  369. 'Content-ID' => '15.274327094.140938@zammad.example.com',
  370. 'Content-Disposition' => 'inline'
  371. },
  372. created_by_id: 1,
  373. )
  374. store2 = Store.add(
  375. object: 'Ticket::Article',
  376. o_id: article1.id,
  377. data: 'content_file2_normally_should_be_an_image',
  378. filename: 'some_file2.jpg',
  379. preferences: {
  380. 'Content-Type' => 'image/jpeg',
  381. 'Mime-Type' => 'image/jpeg',
  382. 'Content-ID' => '15.274327094.140939@zammad.example.com',
  383. 'Content-Disposition' => 'inline'
  384. },
  385. created_by_id: 1,
  386. )
  387. store3 = Store.add(
  388. object: 'Ticket::Article',
  389. o_id: article1.id,
  390. data: 'content_file3',
  391. filename: 'some_file3.txt',
  392. preferences: {
  393. 'Content-Type' => 'text/stream',
  394. 'Mime-Type' => 'text/stream',
  395. 'Content-ID' => '15.274327094.99999@zammad.example.com',
  396. 'Content-Disposition' => 'inline'
  397. },
  398. created_by_id: 1,
  399. )
  400. article_attributes = Ticket::Article.insert_urls(article1.attributes_with_association_ids)
  401. assert_no_match('15.274327094.140938@zammad.example.com', article_attributes['body'])
  402. assert_no_match('15.274327094.140939@zammad.example.com', article_attributes['body'])
  403. assert_no_match('15.274327094.99999@zammad.example.com', article_attributes['body'])
  404. assert_match("api/v1/ticket_attachment/#{ticket1.id}/#{article1.id}/#{store1.id}", article_attributes['body'])
  405. assert_match("api/v1/ticket_attachment/#{ticket1.id}/#{article1.id}/#{store2.id}", article_attributes['body'])
  406. assert_no_match("api/v1/ticket_attachment/#{ticket1.id}/#{article1.id}/#{store3.id}", article_attributes['body'])
  407. article1 = Ticket::Article.find(article1.id)
  408. attachments = article1.attachments_inline
  409. assert_equal(2, attachments.length)
  410. assert_equal(store1.id, attachments.first.id)
  411. ticket1.destroy
  412. end
  413. test 'article attachment helper 2' do
  414. ticket1 = Ticket.create!(
  415. title: 'some article helper test2',
  416. group: Group.lookup(name: 'Users'),
  417. customer_id: 2,
  418. state: Ticket::State.lookup(name: 'new'),
  419. priority: Ticket::Priority.lookup(name: '2 normal'),
  420. updated_by_id: 1,
  421. created_by_id: 1,
  422. )
  423. assert(ticket1, 'ticket created')
  424. # create inbound article #1
  425. article1 = Ticket::Article.create!(
  426. ticket_id: ticket1.id,
  427. from: 'some_sender@example.com',
  428. to: 'some_recipient@example.com',
  429. subject: 'some subject',
  430. message_id: 'some@id',
  431. content_type: 'text/html',
  432. body: 'some message article helper test2 <div><img src="cid:15.274327094.140938@zammad.example.com">asdasd<img border="0" width="60" height="19" src="cid:15.274327094.140939@zammad.example.com" alt="Beschreibung: Beschreibung: efqmLogo"><br>',
  433. internal: false,
  434. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  435. type: Ticket::Article::Type.find_by(name: 'email'),
  436. updated_by_id: 1,
  437. created_by_id: 1,
  438. )
  439. store1 = Store.add(
  440. object: 'Ticket::Article',
  441. o_id: article1.id,
  442. data: 'content_file1_normally_should_be_an_image',
  443. filename: 'some_file1.jpg',
  444. preferences: {
  445. 'Content-Type' => 'image/jpeg',
  446. 'Mime-Type' => 'image/jpeg',
  447. 'Content-ID' => '15.274327094.140938@zammad.example.com',
  448. 'Content-Disposition' => 'inline'
  449. },
  450. created_by_id: 1,
  451. )
  452. store2 = Store.add(
  453. object: 'Ticket::Article',
  454. o_id: article1.id,
  455. data: 'content_file2_normally_should_be_an_image',
  456. filename: 'some_file2.jpg',
  457. preferences: {
  458. 'Content-Type' => 'image/jpeg',
  459. 'Mime-Type' => 'image/jpeg',
  460. 'Content-ID' => '15.274327094.140939@zammad.example.com',
  461. 'Content-Disposition' => 'inline'
  462. },
  463. created_by_id: 1,
  464. )
  465. store3 = Store.add(
  466. object: 'Ticket::Article',
  467. o_id: article1.id,
  468. data: 'content_file3',
  469. filename: 'some_file3.txt',
  470. preferences: {
  471. 'Content-Type' => 'text/stream',
  472. 'Mime-Type' => 'text/stream',
  473. 'Content-ID' => '15.274327094.99999@zammad.example.com',
  474. 'Content-Disposition' => 'inline'
  475. },
  476. created_by_id: 1,
  477. )
  478. article_attributes = Ticket::Article.insert_urls(article1.attributes_with_association_ids)
  479. assert_no_match('15.274327094.140938@zammad.example.com', article_attributes['body'])
  480. assert_no_match('15.274327094.140939@zammad.example.com', article_attributes['body'])
  481. assert_no_match('15.274327094.99999@zammad.example.com', article_attributes['body'])
  482. assert_match("api/v1/ticket_attachment/#{ticket1.id}/#{article1.id}/#{store1.id}", article_attributes['body'])
  483. assert_match("api/v1/ticket_attachment/#{ticket1.id}/#{article1.id}/#{store2.id}", article_attributes['body'])
  484. assert_no_match("api/v1/ticket_attachment/#{ticket1.id}/#{article1.id}/#{store3.id}", article_attributes['body'])
  485. article1 = Ticket::Article.find(article1.id)
  486. attachments = article1.attachments_inline
  487. assert_equal(2, attachments.length)
  488. assert_equal(store1.id, attachments.first.id)
  489. ticket1.destroy
  490. end
  491. end