tickets_controller_test.rb 94 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218
  1. require 'test_helper'
  2. class TicketsControllerTest < ActionDispatch::IntegrationTest
  3. setup do
  4. # set accept header
  5. @headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
  6. # create agent
  7. roles = Role.where(name: %w[Admin Agent])
  8. groups = Group.all
  9. UserInfo.current_user_id = 1
  10. @admin = User.create!(
  11. login: 'tickets-admin',
  12. firstname: 'Tickets',
  13. lastname: 'Admin',
  14. email: 'tickets-admin@example.com',
  15. password: 'adminpw',
  16. active: true,
  17. roles: roles,
  18. groups: groups,
  19. )
  20. # create agent
  21. roles = Role.where(name: 'Agent')
  22. @agent = User.create!(
  23. login: 'tickets-agent@example.com',
  24. firstname: 'Tickets',
  25. lastname: 'Agent',
  26. email: 'tickets-agent@example.com',
  27. password: 'agentpw',
  28. active: true,
  29. roles: roles,
  30. groups: groups,
  31. )
  32. # create customer without org
  33. roles = Role.where(name: 'Customer')
  34. @customer_without_org = User.create!(
  35. login: 'tickets-customer1@example.com',
  36. firstname: 'Tickets',
  37. lastname: 'Customer1',
  38. email: 'tickets-customer1@example.com',
  39. password: 'customer1pw',
  40. active: true,
  41. roles: roles,
  42. )
  43. UserInfo.current_user_id = nil
  44. end
  45. test '01.01 ticket create with agent - missing group' do
  46. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  47. params = {
  48. title: 'a new ticket #1',
  49. article: {
  50. content_type: 'text/plain', # or text/html
  51. body: 'some body',
  52. sender: 'Customer',
  53. type: 'note',
  54. },
  55. }
  56. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  57. assert_response(422)
  58. result = JSON.parse(@response.body)
  59. assert_equal(Hash, result.class)
  60. assert_equal('Group can\'t be blank', result['error_human'])
  61. end
  62. test '01.02 ticket create with agent - wrong group' do
  63. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  64. params = {
  65. title: 'a new ticket #2',
  66. group: 'not_existing',
  67. article: {
  68. content_type: 'text/plain', # or text/html
  69. body: 'some body',
  70. sender: 'Customer',
  71. type: 'note',
  72. },
  73. }
  74. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  75. assert_response(422)
  76. result = JSON.parse(@response.body)
  77. assert_equal(Hash, result.class)
  78. assert_equal('No lookup value found for \'group\': "not_existing"', result['error'])
  79. end
  80. test '01.03 ticket create with agent - missing article.body' do
  81. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  82. params = {
  83. title: 'a new ticket #3',
  84. group: 'Users',
  85. priority: '2 normal',
  86. state: 'new',
  87. customer_id: @customer_without_org.id,
  88. article: {},
  89. }
  90. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  91. assert_response(422)
  92. result = JSON.parse(@response.body)
  93. assert_equal(Hash, result.class)
  94. assert_equal('Need at least article: { body: "some text" }', result['error'])
  95. end
  96. test '01.03 ticket create with agent - minimal article' do
  97. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  98. params = {
  99. title: 'a new ticket #3',
  100. group: 'Users',
  101. priority: '2 normal',
  102. state: 'new',
  103. customer_id: @customer_without_org.id,
  104. article: {
  105. body: 'some test 123',
  106. },
  107. }
  108. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  109. assert_response(201)
  110. result = JSON.parse(@response.body)
  111. assert_equal(Hash, result.class)
  112. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  113. assert_equal('a new ticket #3', result['title'])
  114. assert_equal(@customer_without_org.id, result['customer_id'])
  115. assert_equal(@agent.id, result['updated_by_id'])
  116. assert_equal(@agent.id, result['created_by_id'])
  117. end
  118. test '01.04 ticket create with agent - minimal article and customer.email' do
  119. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  120. params = {
  121. title: 'a new ticket #3',
  122. group: 'Users',
  123. priority: '2 normal',
  124. state: 'new',
  125. customer: @customer_without_org.email,
  126. article: {
  127. body: 'some test 123',
  128. },
  129. }
  130. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  131. assert_response(201)
  132. result = JSON.parse(@response.body)
  133. assert_equal(Hash, result.class)
  134. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  135. assert_equal('a new ticket #3', result['title'])
  136. assert_equal(@customer_without_org.id, result['customer_id'])
  137. assert_equal(@agent.id, result['updated_by_id'])
  138. assert_equal(@agent.id, result['created_by_id'])
  139. end
  140. test '01.05 ticket create with agent - wrong owner_id - 0' do
  141. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  142. params = {
  143. title: 'a new ticket #4',
  144. group: 'Users',
  145. priority: '2 normal',
  146. owner_id: 0,
  147. state: 'new',
  148. customer_id: @customer_without_org.id,
  149. article: {
  150. body: 'some test 123',
  151. },
  152. }
  153. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  154. assert_response(422)
  155. result = JSON.parse(@response.body)
  156. assert_equal(Hash, result.class)
  157. assert_equal('Invalid value for param \'owner_id\': 0', result['error'])
  158. end
  159. test '01.06 ticket create with agent - wrong owner_id - ""' do
  160. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  161. params = {
  162. title: 'a new ticket #5',
  163. group: 'Users',
  164. priority: '2 normal',
  165. owner_id: '',
  166. state: 'new',
  167. customer_id: @customer_without_org.id,
  168. article: {
  169. body: 'some test 123',
  170. },
  171. }
  172. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  173. #assert_response(422)
  174. #result = JSON.parse(@response.body)
  175. #assert_equal(Hash, result.class)
  176. #assert_equal('Invalid value for param \'owner_id\': ""', result['error'])
  177. assert_response(201)
  178. result = JSON.parse(@response.body)
  179. assert_equal(Hash, result.class)
  180. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  181. assert_equal('a new ticket #5', result['title'])
  182. assert_equal(@customer_without_org.id, result['customer_id'])
  183. assert_equal(@agent.id, result['updated_by_id'])
  184. assert_equal(@agent.id, result['created_by_id'])
  185. end
  186. test '01.07 ticket create with agent - wrong owner_id - 99999' do
  187. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  188. params = {
  189. title: 'a new ticket #6',
  190. group: 'Users',
  191. priority: '2 normal',
  192. owner_id: 99_999,
  193. state: 'new',
  194. customer_id: @customer_without_org.id,
  195. article: {
  196. body: 'some test 123',
  197. },
  198. }
  199. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  200. assert_response(422)
  201. result = JSON.parse(@response.body)
  202. assert_equal(Hash, result.class)
  203. assert_equal('Invalid value for param \'owner_id\': 99999', result['error'])
  204. end
  205. test '01.08 ticket create with agent - wrong owner_id - nil' do
  206. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  207. params = {
  208. title: 'a new ticket #7',
  209. group: 'Users',
  210. priority: '2 normal',
  211. owner_id: nil,
  212. state: 'new',
  213. customer_id: @customer_without_org.id,
  214. article: {
  215. body: 'some test 123',
  216. },
  217. }
  218. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  219. assert_response(201)
  220. result = JSON.parse(@response.body)
  221. assert_equal(Hash, result.class)
  222. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  223. assert_equal('a new ticket #7', result['title'])
  224. assert_equal(@customer_without_org.id, result['customer_id'])
  225. assert_equal(@agent.id, result['updated_by_id'])
  226. assert_equal(@agent.id, result['created_by_id'])
  227. end
  228. test '01.09 ticket create with agent - minimal article with guess customer' do
  229. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  230. params = {
  231. title: 'a new ticket #9',
  232. group: 'Users',
  233. priority: '2 normal',
  234. state: 'new',
  235. customer_id: 'guess:some_new_customer@example.com',
  236. article: {
  237. body: 'some test 123',
  238. },
  239. }
  240. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  241. assert_response(201)
  242. result = JSON.parse(@response.body)
  243. assert_equal(Hash, result.class)
  244. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  245. assert_equal('a new ticket #9', result['title'])
  246. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, result['customer_id'])
  247. assert_equal(@agent.id, result['updated_by_id'])
  248. assert_equal(@agent.id, result['created_by_id'])
  249. end
  250. test '01.10 ticket create with agent - minimal article with guess customer' do
  251. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  252. params = {
  253. title: 'a new ticket #10',
  254. group: 'Users',
  255. customer_id: 'guess:some_new_customer@example.com',
  256. article: {
  257. body: 'some test 123',
  258. },
  259. }
  260. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  261. assert_response(201)
  262. result = JSON.parse(@response.body)
  263. assert_equal(Hash, result.class)
  264. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  265. assert_equal('a new ticket #10', result['title'])
  266. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, result['customer_id'])
  267. assert_equal(@agent.id, result['updated_by_id'])
  268. assert_equal(@agent.id, result['created_by_id'])
  269. end
  270. test '01.11 ticket create with agent - minimal article with customer hash' do
  271. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  272. params = {
  273. title: 'a new ticket #11',
  274. group: 'Users',
  275. customer: {
  276. firstname: 'some firstname',
  277. lastname: 'some lastname',
  278. email: 'some_new_customer@example.com',
  279. },
  280. article: {
  281. body: 'some test 123',
  282. },
  283. }
  284. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  285. assert_response(201)
  286. result = JSON.parse(@response.body)
  287. assert_equal(Hash, result.class)
  288. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  289. assert_equal('a new ticket #11', result['title'])
  290. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, result['customer_id'])
  291. assert_equal(@agent.id, result['updated_by_id'])
  292. assert_equal(@agent.id, result['created_by_id'])
  293. end
  294. test '01.11.1 ticket create with agent - minimal article with customer hash with article.origin_by' do
  295. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  296. params = {
  297. title: 'a new ticket #11.1',
  298. group: 'Users',
  299. customer: {
  300. firstname: 'some firstname',
  301. lastname: 'some lastname',
  302. email: 'some_new_customer@example.com',
  303. },
  304. article: {
  305. body: 'some test 123',
  306. origin_by: 'some_new_customer@example.com',
  307. },
  308. }
  309. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  310. assert_response(201)
  311. result = JSON.parse(@response.body)
  312. assert_equal(Hash, result.class)
  313. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  314. assert_equal('a new ticket #11.1', result['title'])
  315. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, result['customer_id'])
  316. assert_equal(@agent.id, result['updated_by_id'])
  317. assert_equal(@agent.id, result['created_by_id'])
  318. ticket = Ticket.find(result['id'])
  319. article = ticket.articles.first
  320. assert_equal(@agent.id, article.updated_by_id)
  321. assert_equal(@agent.id, article.created_by_id)
  322. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, article.origin_by_id)
  323. assert_equal('Customer', article.sender.name)
  324. assert_equal('note', article.type.name)
  325. assert_equal('some firstname some lastname', article.from)
  326. end
  327. test '01.11.2 ticket create with agent - minimal article with customer hash with article.origin_by' do
  328. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  329. params = {
  330. title: 'a new ticket #11.2',
  331. group: 'Users',
  332. customer: {
  333. firstname: 'some firstname',
  334. lastname: 'some lastname',
  335. email: 'some_new_customer@example.com',
  336. },
  337. article: {
  338. sender: 'Customer',
  339. body: 'some test 123',
  340. origin_by: 'some_new_customer@example.com',
  341. },
  342. }
  343. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  344. assert_response(201)
  345. result = JSON.parse(@response.body)
  346. assert_equal(Hash, result.class)
  347. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  348. assert_equal('a new ticket #11.2', result['title'])
  349. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, result['customer_id'])
  350. assert_equal(@agent.id, result['updated_by_id'])
  351. assert_equal(@agent.id, result['created_by_id'])
  352. ticket = Ticket.find(result['id'])
  353. article = ticket.articles.first
  354. assert_equal(@agent.id, article.updated_by_id)
  355. assert_equal(@agent.id, article.created_by_id)
  356. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, article.origin_by_id)
  357. assert_equal('Customer', article.sender.name)
  358. assert_equal('note', article.type.name)
  359. assert_equal('some firstname some lastname', article.from)
  360. end
  361. test '01.11.3 ticket create with agent - minimal article with customer hash with article.origin_by' do
  362. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  363. params = {
  364. title: 'a new ticket #11.3',
  365. group: 'Users',
  366. customer: {
  367. firstname: 'some firstname',
  368. lastname: 'some lastname',
  369. email: 'some_new_customer@example.com',
  370. },
  371. article: {
  372. sender: 'Agent',
  373. from: 'somebody',
  374. body: 'some test 123',
  375. origin_by: 'some_new_customer@example.com',
  376. },
  377. }
  378. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  379. assert_response(201)
  380. result = JSON.parse(@response.body)
  381. assert_equal(Hash, result.class)
  382. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  383. assert_equal('a new ticket #11.3', result['title'])
  384. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, result['customer_id'])
  385. assert_equal(@agent.id, result['updated_by_id'])
  386. assert_equal(@agent.id, result['created_by_id'])
  387. ticket = Ticket.find(result['id'])
  388. article = ticket.articles.first
  389. assert_equal(@agent.id, article.updated_by_id)
  390. assert_equal(@agent.id, article.created_by_id)
  391. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, article.origin_by_id)
  392. assert_equal('Customer', article.sender.name)
  393. assert_equal('note', article.type.name)
  394. assert_equal('some firstname some lastname', article.from)
  395. end
  396. test '01.11.4 ticket create with agent - minimal article with customer hash with article.origin_by' do
  397. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  398. params = {
  399. title: 'a new ticket #11.4',
  400. group: 'Users',
  401. customer: {
  402. firstname: 'some firstname',
  403. lastname: 'some lastname',
  404. email: 'some_new_customer@example.com',
  405. },
  406. article: {
  407. sender: 'Customer',
  408. body: 'some test 123',
  409. origin_by: @customer_without_org.login,
  410. },
  411. }
  412. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  413. assert_response(201)
  414. result = JSON.parse(@response.body)
  415. assert_equal(Hash, result.class)
  416. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  417. assert_equal('a new ticket #11.4', result['title'])
  418. assert_equal(User.lookup(email: 'some_new_customer@example.com').id, result['customer_id'])
  419. assert_equal(@agent.id, result['updated_by_id'])
  420. assert_equal(@agent.id, result['created_by_id'])
  421. ticket = Ticket.find(result['id'])
  422. article = ticket.articles.first
  423. assert_equal(@agent.id, article.updated_by_id)
  424. assert_equal(@agent.id, article.created_by_id)
  425. assert_equal(@customer_without_org.id, article.origin_by_id)
  426. assert_equal('Customer', article.sender.name)
  427. assert_equal('note', article.type.name)
  428. assert_equal('Tickets Customer1', article.from)
  429. end
  430. test '01.12 ticket create with agent - minimal article with missing body - with customer.id' do
  431. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  432. params = {
  433. title: 'a new ticket #12',
  434. group: 'Users',
  435. customer_id: @customer_without_org.id,
  436. article: {
  437. subject: 'some test 123',
  438. },
  439. }
  440. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  441. assert_response(422)
  442. result = JSON.parse(@response.body)
  443. assert_equal(Hash, result.class)
  444. assert_equal('Need at least article: { body: "some text" }', result['error'])
  445. end
  446. test '01.13 ticket create with agent - minimal article and attachment with customer' do
  447. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  448. params = {
  449. title: 'a new ticket #13',
  450. group: 'Users',
  451. customer_id: @customer_without_org.id,
  452. article: {
  453. subject: 'some test 123',
  454. body: 'some test 123',
  455. attachments: [
  456. 'filename' => 'some_file.txt',
  457. 'data' => 'dGVzdCAxMjM=',
  458. 'mime-type' => 'text/plain',
  459. ],
  460. },
  461. }
  462. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  463. assert_response(201)
  464. result = JSON.parse(@response.body)
  465. assert_equal(Hash, result.class)
  466. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  467. assert_equal('a new ticket #13', result['title'])
  468. assert_equal(@customer_without_org.id, result['customer_id'])
  469. assert_equal(@agent.id, result['updated_by_id'])
  470. assert_equal(@agent.id, result['created_by_id'])
  471. ticket = Ticket.find(result['id'])
  472. assert_equal(1, ticket.articles.count)
  473. assert_equal(1, ticket.articles.first.attachments.count)
  474. file = ticket.articles.first.attachments.first
  475. assert_equal('test 123', file.content)
  476. assert_equal('some_file.txt', file.filename)
  477. assert_equal('text/plain', file.preferences['Mime-Type'])
  478. assert_not(file.preferences['Content-ID'])
  479. end
  480. test '01.14 ticket create with agent - minimal article and attachment with customer' do
  481. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  482. params = {
  483. title: 'a new ticket #14',
  484. group: 'Users',
  485. customer_id: @customer_without_org.id,
  486. article: {
  487. subject: 'some test 123',
  488. body: 'some test 123',
  489. attachments: [
  490. {
  491. 'filename' => 'some_file1.txt',
  492. 'data' => 'dGVzdCAxMjM=',
  493. 'mime-type' => 'text/plain',
  494. },
  495. {
  496. 'filename' => 'some_file2.txt',
  497. 'data' => 'w6TDtsO8w58=',
  498. 'mime-type' => 'text/plain',
  499. },
  500. ],
  501. },
  502. }
  503. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  504. assert_response(201)
  505. result = JSON.parse(@response.body)
  506. assert_equal(Hash, result.class)
  507. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  508. assert_equal('a new ticket #14', result['title'])
  509. assert_equal(@customer_without_org.id, result['customer_id'])
  510. assert_equal(@agent.id, result['updated_by_id'])
  511. assert_equal(@agent.id, result['created_by_id'])
  512. ticket = Ticket.find(result['id'])
  513. assert_equal(1, ticket.articles.count)
  514. assert_equal(2, ticket.articles.first.attachments.count)
  515. file = ticket.articles.first.attachments.first
  516. assert_equal('test 123', file.content)
  517. assert_equal('some_file1.txt', file.filename)
  518. assert_equal('text/plain', file.preferences['Mime-Type'])
  519. assert_not(file.preferences['Content-ID'])
  520. end
  521. test '01.15 ticket create with agent - minimal article and attachment missing mine-type with customer' do
  522. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  523. params = {
  524. title: 'a new ticket #15',
  525. group: 'Users',
  526. customer_id: @customer_without_org.id,
  527. article: {
  528. subject: 'some test 123',
  529. body: 'some test 123',
  530. attachments: [
  531. 'filename' => 'some_file.txt',
  532. 'data' => 'ABC_INVALID_BASE64',
  533. 'mime-type' => 'text/plain',
  534. ],
  535. },
  536. }
  537. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  538. assert_response(422)
  539. result = JSON.parse(@response.body)
  540. assert_equal(Hash, result.class)
  541. assert_equal('Invalid base64 for attachment with index \'0\'', result['error'])
  542. end
  543. test '01.16 ticket create with agent - minimal article and attachment invalid base64 with customer' do
  544. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  545. params = {
  546. title: 'a new ticket #16',
  547. group: 'Users',
  548. customer_id: @customer_without_org.id,
  549. article: {
  550. subject: 'some test 123',
  551. body: 'some test 123',
  552. attachments: [
  553. 'filename' => 'some_file.txt',
  554. 'data' => 'dGVzdCAxMjM=',
  555. ],
  556. },
  557. }
  558. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  559. assert_response(422)
  560. result = JSON.parse(@response.body)
  561. assert_equal(Hash, result.class)
  562. assert_equal('Attachment needs \'mime-type\' param for attachment with index \'0\'', result['error'])
  563. end
  564. test '01.17 ticket create with agent - minimal article and inline attachments with customer' do
  565. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  566. params = {
  567. title: 'a new ticket #17',
  568. group: 'Users',
  569. customer_id: @customer_without_org.id,
  570. article: {
  571. content_type: 'text/html',
  572. subject: 'some test 123',
  573. body: 'some test 123 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
  574. AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
  575. 9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" /> <img src="data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAJAAD/4QMtaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzJCOTE2NzlGQUEwMTFFNjg0M0NGQjU0OUU4MTFEOEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzJCOTE2N0FGQUEwMTFFNjg0M0NGQjU0OUU4MTFEOEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkI5MTY3N0ZBQTAxMUU2ODQzQ0ZCNTQ5RTgxMUQ4QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMkI5MTY3OEZBQTAxMUU2ODQzQ0ZCNTQ5RTgxMUQ4QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEABQRERoTGioZGSo1KCEoNTEpKCgpMUE4ODg4OEFEREREREREREREREREREREREREREREREREREREREREREREREQBFhoaIh0iKRoaKTkpIik5RDktLTlEREREOERERERERERERERERERERERERERERERERERERERERERERERERERERP/AABEIABAADAMBIgACEQEDEQH/xABbAAEBAAAAAAAAAAAAAAAAAAAEBQEBAQAAAAAAAAAAAAAAAAAABAUQAAEEAgMAAAAAAAAAAAAAAAABAhIDESIxBAURAAICAwAAAAAAAAAAAAAAAAESABNRoQP/2gAMAwEAAhEDEQA/AJDq1rfF3Imeg/1+lFy2oR564DKWWWbweV+Buf/Z">',
  576. },
  577. }
  578. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  579. assert_response(201)
  580. result = JSON.parse(@response.body)
  581. assert_equal(Hash, result.class)
  582. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  583. assert_equal('a new ticket #17', result['title'])
  584. assert_equal(@customer_without_org.id, result['customer_id'])
  585. assert_equal(@agent.id, result['updated_by_id'])
  586. assert_equal(@agent.id, result['created_by_id'])
  587. ticket = Ticket.find(result['id'])
  588. assert_equal(1, ticket.articles.count)
  589. assert_equal(2, ticket.articles.first.attachments.count)
  590. file = ticket.articles.first.attachments[0]
  591. assert_equal('d3c1e09bdefb92b6a06b791a24ca9599', Digest::MD5.hexdigest(file.content))
  592. assert_equal('image1.png', file.filename)
  593. assert_equal('image/png', file.preferences['Mime-Type'])
  594. assert_match(/#{ticket.id}\..+?@zammad.example.com/, file.preferences['Content-ID'])
  595. assert(file.preferences['Content-ID'])
  596. file = ticket.articles.first.attachments[1]
  597. assert_equal('006a2ca3793b550c8fe444acdeb39252', Digest::MD5.hexdigest(file.content))
  598. assert_equal('image2.jpeg', file.filename)
  599. assert_equal('image/jpeg', file.preferences['Mime-Type'])
  600. assert_match(/#{ticket.id}\..+?@zammad.example.com/, file.preferences['Content-ID'])
  601. assert(file.preferences['Content-ID'])
  602. end
  603. test '01.18 ticket create with agent - minimal article and inline attachments with customer' do
  604. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  605. params = {
  606. title: 'a new ticket #18',
  607. group: 'Users',
  608. customer_id: @customer_without_org.id,
  609. article: {
  610. content_type: 'text/html',
  611. subject: 'some test 123',
  612. body: 'some test 123 <img src="data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAJAAD/4QMtaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzJCOTE2NzlGQUEwMTFFNjg0M0NGQjU0OUU4MTFEOEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzJCOTE2N0FGQUEwMTFFNjg0M0NGQjU0OUU4MTFEOEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkI5MTY3N0ZBQTAxMUU2ODQzQ0ZCNTQ5RTgxMUQ4QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMkI5MTY3OEZBQTAxMUU2ODQzQ0ZCNTQ5RTgxMUQ4QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEABQRERoTGioZGSo1KCEoNTEpKCgpMUE4ODg4OEFEREREREREREREREREREREREREREREREREREREREREREREREQBFhoaIh0iKRoaKTkpIik5RDktLTlEREREOERERERERERERERERERERERERERERERERERERERERERERERERERERP/AABEIABAADAMBIgACEQEDEQH/xABbAAEBAAAAAAAAAAAAAAAAAAAEBQEBAQAAAAAAAAAAAAAAAAAABAUQAAEEAgMAAAAAAAAAAAAAAAABAhIDESIxBAURAAICAwAAAAAAAAAAAAAAAAESABNRoQP/2gAMAwEAAhEDEQA/AJDq1rfF3Imeg/1+lFy2oR564DKWWWbweV+Buf/Z"
  613. >',
  614. attachments: [
  615. 'filename' => 'some_file.txt',
  616. 'data' => 'dGVzdCAxMjM=',
  617. 'mime-type' => 'text/plain',
  618. ],
  619. },
  620. }
  621. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  622. assert_response(201)
  623. result = JSON.parse(@response.body)
  624. assert_equal(Hash, result.class)
  625. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  626. assert_equal('a new ticket #18', result['title'])
  627. assert_equal(@customer_without_org.id, result['customer_id'])
  628. assert_equal(@agent.id, result['updated_by_id'])
  629. assert_equal(@agent.id, result['created_by_id'])
  630. ticket = Ticket.find(result['id'])
  631. assert_equal(1, ticket.articles.count)
  632. assert_equal(2, ticket.articles.first.attachments.count)
  633. file = ticket.articles.first.attachments[0]
  634. assert_equal('006a2ca3793b550c8fe444acdeb39252', Digest::MD5.hexdigest(file.content))
  635. assert_equal('image1.jpeg', file.filename)
  636. assert_equal('image/jpeg', file.preferences['Mime-Type'])
  637. assert(file.preferences['Content-ID'])
  638. assert_match(/#{ticket.id}\..+?@zammad.example.com/, file.preferences['Content-ID'])
  639. file = ticket.articles.first.attachments[1]
  640. assert_equal('39d0d586a701e199389d954f2d592720', Digest::MD5.hexdigest(file.content))
  641. assert_equal('some_file.txt', file.filename)
  642. assert_equal('text/plain', file.preferences['Mime-Type'])
  643. assert_not(file.preferences['Content-ID'])
  644. end
  645. test '02.02 ticket create with agent' do
  646. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  647. params = {
  648. title: 'a new ticket #1',
  649. state: 'new',
  650. priority: '2 normal',
  651. group: 'Users',
  652. customer: 'tickets-customer1@example.com',
  653. article: {
  654. content_type: 'text/plain', # or text/html
  655. body: 'some body',
  656. },
  657. links: {
  658. Ticket: {
  659. parent: [1],
  660. }
  661. }
  662. }
  663. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  664. assert_response(201)
  665. result = JSON.parse(@response.body)
  666. assert_equal(Hash, result.class)
  667. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  668. assert_equal('a new ticket #1', result['title'])
  669. assert_equal(@agent.id, result['updated_by_id'])
  670. assert_equal(@agent.id, result['created_by_id'])
  671. links = Link.list(
  672. link_object: 'Ticket',
  673. link_object_value: result['id'],
  674. )
  675. assert_equal('child', links[0]['link_type'])
  676. assert_equal('Ticket', links[0]['link_object'])
  677. assert_equal(1, links[0]['link_object_value'])
  678. end
  679. test '02.03 ticket with wrong ticket id' do
  680. group = Group.create!(
  681. name: "GroupWithoutPermission-#{rand(9_999_999_999)}",
  682. active: true,
  683. updated_by_id: 1,
  684. created_by_id: 1,
  685. )
  686. ticket = Ticket.create!(
  687. title: 'ticket with wrong ticket id',
  688. group_id: group.id,
  689. customer_id: @customer_without_org.id,
  690. state: Ticket::State.lookup(name: 'new'),
  691. priority: Ticket::Priority.lookup(name: '2 normal'),
  692. updated_by_id: 1,
  693. created_by_id: 1,
  694. )
  695. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  696. get "/api/v1/tickets/#{ticket.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  697. assert_response(401)
  698. result = JSON.parse(@response.body)
  699. assert_equal(Hash, result.class)
  700. assert_equal('Not authorized', result['error'])
  701. params = {
  702. title: 'ticket with wrong ticket id - 2',
  703. }
  704. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  705. assert_response(401)
  706. result = JSON.parse(@response.body)
  707. assert_equal(Hash, result.class)
  708. assert_equal('Not authorized', result['error'])
  709. delete "/api/v1/tickets/#{ticket.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  710. assert_response(401)
  711. result = JSON.parse(@response.body)
  712. assert_equal(Hash, result.class)
  713. assert_equal('Not authorized', result['error'])
  714. end
  715. test '02.04 ticket with correct ticket id' do
  716. title = "ticket with corret ticket id testagent#{rand(999_999_999)}"
  717. ticket = Ticket.create!(
  718. title: title,
  719. group: Group.lookup(name: 'Users'),
  720. customer_id: @customer_without_org.id,
  721. state: Ticket::State.lookup(name: 'new'),
  722. priority: Ticket::Priority.lookup(name: '2 normal'),
  723. updated_by_id: 1,
  724. created_by_id: 1,
  725. )
  726. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  727. get "/api/v1/tickets/#{ticket.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  728. assert_response(200)
  729. result = JSON.parse(@response.body)
  730. assert_equal(Hash, result.class)
  731. assert_equal(ticket.id, result['id'])
  732. assert_equal(title, result['title'])
  733. assert_equal(ticket.customer_id, result['customer_id'])
  734. assert_equal(1, result['updated_by_id'])
  735. assert_equal(1, result['created_by_id'])
  736. params = {
  737. title: "#{title} - 2",
  738. customer_id: @agent.id,
  739. }
  740. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  741. assert_response(200)
  742. result = JSON.parse(@response.body)
  743. assert_equal(Hash, result.class)
  744. assert_equal(ticket.id, result['id'])
  745. assert_equal("#{title} - 2", result['title'])
  746. assert_equal(@agent.id, result['customer_id'])
  747. assert_equal(@agent.id, result['updated_by_id'])
  748. assert_equal(1, result['created_by_id'])
  749. params = {
  750. ticket_id: ticket.id,
  751. subject: 'some subject',
  752. body: 'some body',
  753. }
  754. post '/api/v1/ticket_articles', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  755. assert_response(201)
  756. article_result = JSON.parse(@response.body)
  757. assert_equal(Hash, article_result.class)
  758. assert_equal(ticket.id, article_result['ticket_id'])
  759. assert_equal('Tickets Agent', article_result['from'])
  760. assert_equal('some subject', article_result['subject'])
  761. assert_equal('some body', article_result['body'])
  762. assert_equal('text/plain', article_result['content_type'])
  763. assert_equal(false, article_result['internal'])
  764. assert_equal(@agent.id, article_result['created_by_id'])
  765. assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, article_result['sender_id'])
  766. assert_equal(Ticket::Article::Type.lookup(name: 'note').id, article_result['type_id'])
  767. Scheduler.worker(true)
  768. get "/api/v1/tickets/search?query=#{CGI.escape(title)}", params: {}, headers: @headers.merge('Authorization' => credentials)
  769. assert_response(200)
  770. result = JSON.parse(@response.body)
  771. assert_equal(Hash, result.class)
  772. assert_equal(ticket.id, result['tickets'][0])
  773. assert_equal(1, result['tickets_count'])
  774. params = {
  775. condition: {
  776. 'ticket.title' => {
  777. operator: 'contains',
  778. value: title,
  779. },
  780. },
  781. }
  782. post '/api/v1/tickets/search', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  783. assert_response(200)
  784. result = JSON.parse(@response.body)
  785. assert_equal(Hash, result.class)
  786. assert_equal(ticket.id, result['tickets'][0])
  787. assert_equal(1, result['tickets_count'])
  788. delete "/api/v1/ticket_articles/#{article_result['id']}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  789. assert_response(200)
  790. params = {
  791. from: 'something which should not be changed on server side',
  792. ticket_id: ticket.id,
  793. subject: 'some subject',
  794. body: 'some body',
  795. type: 'email',
  796. internal: true,
  797. }
  798. post '/api/v1/ticket_articles', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  799. assert_response(201)
  800. result = JSON.parse(@response.body)
  801. assert_equal(Hash, result.class)
  802. assert_equal(ticket.id, result['ticket_id'])
  803. assert_equal('"Tickets Agent via Zammad" <zammad@localhost>', result['from'])
  804. assert_equal('some subject', result['subject'])
  805. assert_equal('some body', result['body'])
  806. assert_equal('text/plain', result['content_type'])
  807. assert_equal(true, result['internal'])
  808. assert_equal(@agent.id, result['created_by_id'])
  809. assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, result['sender_id'])
  810. assert_equal(Ticket::Article::Type.lookup(name: 'email').id, result['type_id'])
  811. params = {
  812. subject: 'new subject',
  813. }
  814. put "/api/v1/ticket_articles/#{result['id']}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  815. assert_response(200)
  816. result = JSON.parse(@response.body)
  817. assert_equal(Hash, result.class)
  818. assert_equal(ticket.id, result['ticket_id'])
  819. assert_equal('"Tickets Agent via Zammad" <zammad@localhost>', result['from'])
  820. assert_equal('new subject', result['subject'])
  821. assert_equal('some body', result['body'])
  822. assert_equal('text/plain', result['content_type'])
  823. assert_equal(true, result['internal'])
  824. assert_equal(@agent.id, result['created_by_id'])
  825. assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, result['sender_id'])
  826. assert_equal(Ticket::Article::Type.lookup(name: 'email').id, result['type_id'])
  827. delete "/api/v1/ticket_articles/#{result['id']}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  828. assert_response(401)
  829. result = JSON.parse(@response.body)
  830. assert_equal(Hash, result.class)
  831. assert_equal('Not authorized (admin permission required)!', result['error'])
  832. delete "/api/v1/tickets/#{ticket.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  833. assert_response(401)
  834. result = JSON.parse(@response.body)
  835. assert_equal(Hash, result.class)
  836. assert_equal('Not authorized (admin permission required)!', result['error'])
  837. end
  838. test '02.05 ticket with correct ticket id' do
  839. ticket = Ticket.create!(
  840. title: 'ticket with corret ticket id',
  841. group: Group.lookup(name: 'Users'),
  842. customer_id: @customer_without_org.id,
  843. state: Ticket::State.lookup(name: 'new'),
  844. priority: Ticket::Priority.lookup(name: '2 normal'),
  845. updated_by_id: 1,
  846. created_by_id: 1,
  847. )
  848. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  849. get "/api/v1/tickets/#{ticket.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  850. assert_response(200)
  851. result = JSON.parse(@response.body)
  852. assert_equal(Hash, result.class)
  853. assert_equal(ticket.id, result['id'])
  854. assert_equal('ticket with corret ticket id', result['title'])
  855. assert_equal(ticket.customer_id, result['customer_id'])
  856. assert_equal(1, result['updated_by_id'])
  857. assert_equal(1, result['created_by_id'])
  858. params = {
  859. title: 'ticket with corret ticket id - 2',
  860. customer_id: @agent.id,
  861. }
  862. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  863. assert_response(200)
  864. result = JSON.parse(@response.body)
  865. assert_equal(Hash, result.class)
  866. assert_equal(ticket.id, result['id'])
  867. assert_equal('ticket with corret ticket id - 2', result['title'])
  868. assert_equal(@agent.id, result['customer_id'])
  869. assert_equal(@admin.id, result['updated_by_id'])
  870. assert_equal(1, result['created_by_id'])
  871. params = {
  872. from: 'something which should not be changed on server side',
  873. ticket_id: ticket.id,
  874. subject: 'some subject',
  875. body: 'some body',
  876. }
  877. post '/api/v1/ticket_articles', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  878. assert_response(201)
  879. result = JSON.parse(@response.body)
  880. assert_equal(Hash, result.class)
  881. assert_equal(ticket.id, result['ticket_id'])
  882. assert_equal('Tickets Admin', result['from'])
  883. assert_equal('some subject', result['subject'])
  884. assert_equal('some body', result['body'])
  885. assert_equal('text/plain', result['content_type'])
  886. assert_equal(false, result['internal'])
  887. assert_equal(@admin.id, result['created_by_id'])
  888. assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, result['sender_id'])
  889. assert_equal(Ticket::Article::Type.lookup(name: 'note').id, result['type_id'])
  890. params = {
  891. subject: 'new subject',
  892. internal: true,
  893. }
  894. put "/api/v1/ticket_articles/#{result['id']}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  895. assert_response(200)
  896. result = JSON.parse(@response.body)
  897. assert_equal(Hash, result.class)
  898. assert_equal(ticket.id, result['ticket_id'])
  899. assert_equal('Tickets Admin', result['from'])
  900. assert_equal('new subject', result['subject'])
  901. assert_equal('some body', result['body'])
  902. assert_equal('text/plain', result['content_type'])
  903. assert_equal(true, result['internal'])
  904. assert_equal(@admin.id, result['created_by_id'])
  905. assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, result['sender_id'])
  906. assert_equal(Ticket::Article::Type.lookup(name: 'note').id, result['type_id'])
  907. delete "/api/v1/ticket_articles/#{result['id']}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  908. assert_response(200)
  909. params = {
  910. ticket_id: ticket.id,
  911. subject: 'some subject',
  912. body: 'some body',
  913. type: 'email',
  914. }
  915. post '/api/v1/ticket_articles', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  916. assert_response(201)
  917. result = JSON.parse(@response.body)
  918. assert_equal(Hash, result.class)
  919. assert_equal(ticket.id, result['ticket_id'])
  920. assert_equal('"Tickets Admin via Zammad" <zammad@localhost>', result['from'])
  921. assert_equal('some subject', result['subject'])
  922. assert_equal('some body', result['body'])
  923. assert_equal('text/plain', result['content_type'])
  924. assert_equal(false, result['internal'])
  925. assert_equal(@admin.id, result['created_by_id'])
  926. assert_equal(Ticket::Article::Sender.lookup(name: 'Agent').id, result['sender_id'])
  927. assert_equal(Ticket::Article::Type.lookup(name: 'email').id, result['type_id'])
  928. delete "/api/v1/ticket_articles/#{result['id']}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  929. assert_response(200)
  930. delete "/api/v1/tickets/#{ticket.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  931. assert_response(200)
  932. end
  933. test '02.05 ticket pagination' do
  934. title = "ticket pagination #{rand(999_999_999)}"
  935. tickets = []
  936. (1..20).each do |count|
  937. ticket = Ticket.create!(
  938. title: "#{title} - #{count}",
  939. group: Group.lookup(name: 'Users'),
  940. customer_id: @customer_without_org.id,
  941. state: Ticket::State.lookup(name: 'new'),
  942. priority: Ticket::Priority.lookup(name: '2 normal'),
  943. updated_by_id: 1,
  944. created_by_id: 1,
  945. )
  946. Ticket::Article.create!(
  947. type: Ticket::Article::Type.lookup(name: 'note'),
  948. sender: Ticket::Article::Sender.lookup(name: 'Customer'),
  949. from: 'sender',
  950. subject: 'subject',
  951. body: 'some body',
  952. ticket_id: ticket.id,
  953. updated_by_id: 1,
  954. created_by_id: 1,
  955. )
  956. tickets.push ticket
  957. travel 2.seconds
  958. end
  959. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  960. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40", params: {}, headers: @headers.merge('Authorization' => credentials)
  961. assert_response(200)
  962. result = JSON.parse(@response.body)
  963. assert_equal(Hash, result.class)
  964. assert_equal(tickets[19].id, result['tickets'][0])
  965. assert_equal(tickets[0].id, result['tickets'][19])
  966. assert_equal(20, result['tickets_count'])
  967. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=10", params: {}, headers: @headers.merge('Authorization' => credentials)
  968. assert_response(200)
  969. result = JSON.parse(@response.body)
  970. assert_equal(Hash, result.class)
  971. assert_equal(tickets[19].id, result['tickets'][0])
  972. assert_equal(tickets[10].id, result['tickets'][9])
  973. assert_equal(10, result['tickets_count'])
  974. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40&page=1&per_page=5", params: {}, headers: @headers.merge('Authorization' => credentials)
  975. assert_response(200)
  976. result = JSON.parse(@response.body)
  977. assert_equal(Hash, result.class)
  978. assert_equal(tickets[19].id, result['tickets'][0])
  979. assert_equal(tickets[15].id, result['tickets'][4])
  980. assert_equal(5, result['tickets_count'])
  981. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40&page=2&per_page=5", params: {}, headers: @headers.merge('Authorization' => credentials)
  982. assert_response(200)
  983. result = JSON.parse(@response.body)
  984. assert_equal(Hash, result.class)
  985. assert_equal(tickets[14].id, result['tickets'][0])
  986. assert_equal(tickets[10].id, result['tickets'][4])
  987. assert_equal(5, result['tickets_count'])
  988. get '/api/v1/tickets?limit=40&page=1&per_page=5', params: {}, headers: @headers.merge('Authorization' => credentials)
  989. assert_response(200)
  990. result = JSON.parse(@response.body)
  991. assert_equal(Array, result.class)
  992. tickets = Ticket.order(:id).limit(5)
  993. assert_equal(tickets[0].id, result[0]['id'])
  994. assert_equal(tickets[4].id, result[4]['id'])
  995. assert_equal(5, result.count)
  996. get '/api/v1/tickets?limit=40&page=2&per_page=5', params: {}, headers: @headers.merge('Authorization' => credentials)
  997. assert_response(200)
  998. result = JSON.parse(@response.body)
  999. assert_equal(Array, result.class)
  1000. tickets = Ticket.order(:id).limit(10)
  1001. assert_equal(tickets[5].id, result[0]['id'])
  1002. assert_equal(tickets[9].id, result[4]['id'])
  1003. assert_equal(5, result.count)
  1004. end
  1005. test '03.01 ticket create with customer minimal' do
  1006. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1007. params = {
  1008. title: 'a new ticket #c1',
  1009. state: 'new',
  1010. priority: '2 normal',
  1011. group: 'Users',
  1012. article: {
  1013. body: 'some body',
  1014. },
  1015. }
  1016. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1017. assert_response(201)
  1018. result = JSON.parse(@response.body)
  1019. assert_equal(Hash, result.class)
  1020. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  1021. assert_equal('a new ticket #c1', result['title'])
  1022. assert_equal(@customer_without_org.id, result['customer_id'])
  1023. assert_equal(@customer_without_org.id, result['updated_by_id'])
  1024. assert_equal(@customer_without_org.id, result['created_by_id'])
  1025. end
  1026. test '03.02 ticket create with customer with wrong customer' do
  1027. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1028. params = {
  1029. title: 'a new ticket #c2',
  1030. state: 'new',
  1031. priority: '2 normal',
  1032. group: 'Users',
  1033. customer_id: @agent.id,
  1034. article: {
  1035. content_type: 'text/plain', # or text/html
  1036. body: 'some body',
  1037. sender: 'System',
  1038. },
  1039. }
  1040. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1041. assert_response(201)
  1042. result = JSON.parse(@response.body)
  1043. assert_equal(Hash, result.class)
  1044. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  1045. assert_equal('a new ticket #c2', result['title'])
  1046. assert_equal(@customer_without_org.id, result['customer_id'])
  1047. assert_equal(@customer_without_org.id, result['updated_by_id'])
  1048. assert_equal(@customer_without_org.id, result['created_by_id'])
  1049. end
  1050. test '03.03 ticket create with customer with wrong customer hash' do
  1051. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1052. params = {
  1053. title: 'a new ticket #c2',
  1054. state: 'new',
  1055. priority: '2 normal',
  1056. group: 'Users',
  1057. customer: {
  1058. firstname: @agent.firstname,
  1059. lastname: @agent.lastname,
  1060. email: @agent.email,
  1061. },
  1062. article: {
  1063. content_type: 'text/plain', # or text/html
  1064. body: 'some body',
  1065. sender: 'System',
  1066. },
  1067. }
  1068. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1069. assert_response(201)
  1070. result = JSON.parse(@response.body)
  1071. assert_equal(Hash, result.class)
  1072. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  1073. assert_equal('a new ticket #c2', result['title'])
  1074. assert_equal(@customer_without_org.id, result['customer_id'])
  1075. assert_equal(@customer_without_org.id, result['updated_by_id'])
  1076. assert_equal(@customer_without_org.id, result['created_by_id'])
  1077. end
  1078. test '03.04 ticket with wrong ticket id' do
  1079. ticket = Ticket.create!(
  1080. title: 'ticket with wrong ticket id',
  1081. group: Group.lookup(name: 'Users'),
  1082. customer_id: @agent.id,
  1083. state: Ticket::State.lookup(name: 'new'),
  1084. priority: Ticket::Priority.lookup(name: '2 normal'),
  1085. updated_by_id: 1,
  1086. created_by_id: 1,
  1087. )
  1088. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1089. get "/api/v1/tickets/#{ticket.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1090. assert_response(401)
  1091. result = JSON.parse(@response.body)
  1092. assert_equal(Hash, result.class)
  1093. assert_equal('Not authorized', result['error'])
  1094. params = {
  1095. title: 'ticket with wrong ticket id - 2',
  1096. }
  1097. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1098. assert_response(401)
  1099. result = JSON.parse(@response.body)
  1100. assert_equal(Hash, result.class)
  1101. assert_equal('Not authorized', result['error'])
  1102. delete "/api/v1/tickets/#{ticket.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  1103. assert_response(401)
  1104. result = JSON.parse(@response.body)
  1105. assert_equal(Hash, result.class)
  1106. assert_equal('Not authorized', result['error'])
  1107. end
  1108. test '03.05 ticket with correct ticket id' do
  1109. title = "ticket with corret ticket id testme#{rand(999_999_999)}"
  1110. ticket = Ticket.create!(
  1111. title: title,
  1112. group: Group.lookup(name: 'Users'),
  1113. customer_id: @customer_without_org.id,
  1114. state: Ticket::State.lookup(name: 'new'),
  1115. priority: Ticket::Priority.lookup(name: '2 normal'),
  1116. updated_by_id: 1,
  1117. created_by_id: 1,
  1118. )
  1119. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1120. get "/api/v1/tickets/#{ticket.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1121. assert_response(200)
  1122. result = JSON.parse(@response.body)
  1123. assert_equal(Hash, result.class)
  1124. assert_equal(ticket.id, result['id'])
  1125. assert_equal(title, result['title'])
  1126. assert_equal(ticket.customer_id, result['customer_id'])
  1127. assert_equal(1, result['updated_by_id'])
  1128. assert_equal(1, result['created_by_id'])
  1129. params = {
  1130. title: "#{title} - 2",
  1131. customer_id: @agent.id,
  1132. }
  1133. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1134. assert_response(200)
  1135. result = JSON.parse(@response.body)
  1136. assert_equal(Hash, result.class)
  1137. assert_equal(ticket.id, result['id'])
  1138. assert_equal("#{title} - 2", result['title'])
  1139. assert_equal(ticket.customer_id, result['customer_id'])
  1140. assert_equal(@customer_without_org.id, result['updated_by_id'])
  1141. assert_equal(1, result['created_by_id'])
  1142. params = {
  1143. ticket_id: ticket.id,
  1144. subject: 'some subject',
  1145. body: 'some body',
  1146. }
  1147. post '/api/v1/ticket_articles', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1148. assert_response(201)
  1149. article_result = JSON.parse(@response.body)
  1150. assert_equal(Hash, article_result.class)
  1151. assert_equal(ticket.id, article_result['ticket_id'])
  1152. assert_equal('Tickets Customer1', article_result['from'])
  1153. assert_equal('some subject', article_result['subject'])
  1154. assert_equal('some body', article_result['body'])
  1155. assert_equal('text/plain', article_result['content_type'])
  1156. assert_equal(@customer_without_org.id, article_result['created_by_id'])
  1157. assert_equal(Ticket::Article::Sender.lookup(name: 'Customer').id, article_result['sender_id'])
  1158. assert_equal(Ticket::Article::Type.lookup(name: 'note').id, article_result['type_id'])
  1159. Scheduler.worker(true)
  1160. get "/api/v1/tickets/search?query=#{CGI.escape(title)}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1161. assert_response(200)
  1162. result = JSON.parse(@response.body)
  1163. assert_equal(Hash, result.class)
  1164. assert_equal(ticket.id, result['tickets'][0])
  1165. assert_equal(1, result['tickets_count'])
  1166. params = {
  1167. condition: {
  1168. 'ticket.title' => {
  1169. operator: 'contains',
  1170. value: title,
  1171. },
  1172. },
  1173. }
  1174. post '/api/v1/tickets/search', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1175. assert_response(200)
  1176. result = JSON.parse(@response.body)
  1177. assert_equal(Hash, result.class)
  1178. assert_equal(ticket.id, result['tickets'][0])
  1179. assert_equal(1, result['tickets_count'])
  1180. delete "/api/v1/ticket_articles/#{article_result['id']}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  1181. assert_response(401)
  1182. result = JSON.parse(@response.body)
  1183. assert_equal(Hash, result.class)
  1184. assert_equal('Not authorized (admin permission required)!', result['error'])
  1185. params = {
  1186. ticket_id: ticket.id,
  1187. subject: 'some subject',
  1188. body: 'some body',
  1189. type: 'email',
  1190. sender: 'Agent',
  1191. }
  1192. post '/api/v1/ticket_articles', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1193. assert_response(201)
  1194. result = JSON.parse(@response.body)
  1195. assert_equal(Hash, result.class)
  1196. assert_equal(ticket.id, result['ticket_id'])
  1197. assert_equal('Tickets Customer1', result['from'])
  1198. assert_equal('some subject', result['subject'])
  1199. assert_equal('some body', result['body'])
  1200. assert_equal('text/plain', result['content_type'])
  1201. assert_equal(@customer_without_org.id, result['created_by_id'])
  1202. assert_equal(Ticket::Article::Sender.lookup(name: 'Customer').id, result['sender_id'])
  1203. assert_equal(Ticket::Article::Type.lookup(name: 'note').id, result['type_id'])
  1204. delete "/api/v1/ticket_articles/#{result['id']}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  1205. assert_response(401)
  1206. result = JSON.parse(@response.body)
  1207. assert_equal(Hash, result.class)
  1208. assert_equal('Not authorized (admin permission required)!', result['error'])
  1209. params = {
  1210. from: 'something which should not be changed on server side',
  1211. ticket_id: ticket.id,
  1212. subject: 'some subject',
  1213. body: 'some body',
  1214. type: 'web',
  1215. sender: 'Agent',
  1216. internal: true,
  1217. }
  1218. post '/api/v1/ticket_articles', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1219. assert_response(201)
  1220. result = JSON.parse(@response.body)
  1221. assert_equal(Hash, result.class)
  1222. assert_equal(ticket.id, result['ticket_id'])
  1223. assert_equal('Tickets Customer1 <tickets-customer1@example.com>', result['from'])
  1224. assert_equal('some subject', result['subject'])
  1225. assert_equal('some body', result['body'])
  1226. assert_equal('text/plain', result['content_type'])
  1227. assert_equal(false, result['internal'])
  1228. assert_equal(@customer_without_org.id, result['created_by_id'])
  1229. assert_equal(Ticket::Article::Sender.lookup(name: 'Customer').id, result['sender_id'])
  1230. assert_equal(Ticket::Article::Type.lookup(name: 'web').id, result['type_id'])
  1231. params = {
  1232. subject: 'new subject',
  1233. }
  1234. put "/api/v1/ticket_articles/#{result['id']}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1235. assert_response(401)
  1236. result = JSON.parse(@response.body)
  1237. assert_equal(Hash, result.class)
  1238. assert_equal('Not authorized (ticket.agent or admin permission required)!', result['error'])
  1239. delete "/api/v1/tickets/#{ticket.id}", params: {}.to_json, headers: @headers.merge('Authorization' => credentials)
  1240. assert_response(401)
  1241. result = JSON.parse(@response.body)
  1242. assert_equal(Hash, result.class)
  1243. assert_equal('Not authorized (admin permission required)!', result['error'])
  1244. end
  1245. test '03.6 ticket create with agent - minimal article with customer hash with article.origin_by' do
  1246. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1247. params = {
  1248. title: 'a new ticket #3.6',
  1249. group: 'Users',
  1250. customer: {
  1251. firstname: 'some firstname',
  1252. lastname: 'some lastname',
  1253. email: 'some_new_customer@example.com',
  1254. },
  1255. article: {
  1256. body: 'some test 123',
  1257. origin_by: @agent.login,
  1258. },
  1259. }
  1260. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1261. assert_response(201)
  1262. result = JSON.parse(@response.body)
  1263. assert_equal(Hash, result.class)
  1264. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  1265. assert_equal('a new ticket #3.6', result['title'])
  1266. assert_equal(@customer_without_org.id, result['customer_id'])
  1267. assert_equal(@customer_without_org.id, result['updated_by_id'])
  1268. assert_equal(@customer_without_org.id, result['created_by_id'])
  1269. ticket = Ticket.find(result['id'])
  1270. article = ticket.articles.first
  1271. assert_equal(@customer_without_org.id, article.updated_by_id)
  1272. assert_equal(@customer_without_org.id, article.created_by_id)
  1273. assert_equal(@customer_without_org.id, article.origin_by_id)
  1274. assert_equal('Customer', article.sender.name)
  1275. assert_equal('note', article.type.name)
  1276. assert_equal('Tickets Customer1', article.from)
  1277. end
  1278. test '03.6.1 ticket create with agent - minimal article with customer hash with article.origin_by' do
  1279. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1280. params = {
  1281. title: 'a new ticket #3.6.1',
  1282. group: 'Users',
  1283. customer: {
  1284. firstname: 'some firstname',
  1285. lastname: 'some lastname',
  1286. email: 'some_new_customer@example.com',
  1287. },
  1288. article: {
  1289. sender: 'Agent',
  1290. body: 'some test 123',
  1291. origin_by_id: @agent.id,
  1292. },
  1293. }
  1294. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1295. assert_response(201)
  1296. result = JSON.parse(@response.body)
  1297. assert_equal(Hash, result.class)
  1298. assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
  1299. assert_equal('a new ticket #3.6.1', result['title'])
  1300. assert_equal(@customer_without_org.id, result['customer_id'])
  1301. assert_equal(@customer_without_org.id, result['updated_by_id'])
  1302. assert_equal(@customer_without_org.id, result['created_by_id'])
  1303. ticket = Ticket.find(result['id'])
  1304. article = ticket.articles.first
  1305. assert_equal(@customer_without_org.id, article.updated_by_id)
  1306. assert_equal(@customer_without_org.id, article.created_by_id)
  1307. assert_equal(@customer_without_org.id, article.origin_by_id)
  1308. assert_equal('Customer', article.sender.name)
  1309. assert_equal('note', article.type.name)
  1310. assert_equal('Tickets Customer1', article.from)
  1311. end
  1312. test '04.01 ticket show and response format' do
  1313. title = "ticket testagent#{rand(999_999_999)}"
  1314. ticket = Ticket.create!(
  1315. title: title,
  1316. group: Group.lookup(name: 'Users'),
  1317. customer_id: @customer_without_org.id,
  1318. state: Ticket::State.lookup(name: 'new'),
  1319. priority: Ticket::Priority.lookup(name: '2 normal'),
  1320. updated_by_id: @agent.id,
  1321. created_by_id: @agent.id,
  1322. )
  1323. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1324. get "/api/v1/tickets/#{ticket.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1325. assert_response(200)
  1326. result = JSON.parse(@response.body)
  1327. assert_equal(Hash, result.class)
  1328. assert_equal(ticket.id, result['id'])
  1329. assert_equal(ticket.title, result['title'])
  1330. assert_not(result['group'])
  1331. assert_not(result['priority'])
  1332. assert_not(result['owner'])
  1333. assert_equal(ticket.customer_id, result['customer_id'])
  1334. assert_equal(@agent.id, result['updated_by_id'])
  1335. assert_equal(@agent.id, result['created_by_id'])
  1336. get "/api/v1/tickets/#{ticket.id}?expand=true", params: {}, headers: @headers.merge('Authorization' => credentials)
  1337. assert_response(200)
  1338. result = JSON.parse(@response.body)
  1339. assert_equal(Hash, result.class)
  1340. assert_equal(ticket.id, result['id'])
  1341. assert_equal(ticket.title, result['title'])
  1342. assert_equal(ticket.customer_id, result['customer_id'])
  1343. assert_equal(ticket.group.name, result['group'])
  1344. assert_equal(ticket.priority.name, result['priority'])
  1345. assert_equal(ticket.owner.login, result['owner'])
  1346. assert_equal(@agent.id, result['updated_by_id'])
  1347. assert_equal(@agent.id, result['created_by_id'])
  1348. get "/api/v1/tickets/#{ticket.id}?expand=false", params: {}, headers: @headers.merge('Authorization' => credentials)
  1349. assert_response(200)
  1350. result = JSON.parse(@response.body)
  1351. assert_equal(Hash, result.class)
  1352. assert_equal(ticket.id, result['id'])
  1353. assert_equal(ticket.title, result['title'])
  1354. assert_not(result['group'])
  1355. assert_not(result['priority'])
  1356. assert_not(result['owner'])
  1357. assert_equal(ticket.customer_id, result['customer_id'])
  1358. assert_equal(@agent.id, result['updated_by_id'])
  1359. assert_equal(@agent.id, result['created_by_id'])
  1360. get "/api/v1/tickets/#{ticket.id}?full=true", params: {}, headers: @headers.merge('Authorization' => credentials)
  1361. assert_response(200)
  1362. result = JSON.parse(@response.body)
  1363. assert_equal(Hash, result.class)
  1364. assert_equal(ticket.id, result['id'])
  1365. assert(result['assets'])
  1366. assert(result['assets']['Ticket'])
  1367. assert(result['assets']['Ticket'][ticket.id.to_s])
  1368. assert_equal(ticket.id, result['assets']['Ticket'][ticket.id.to_s]['id'])
  1369. assert_equal(ticket.title, result['assets']['Ticket'][ticket.id.to_s]['title'])
  1370. assert_equal(ticket.customer_id, result['assets']['Ticket'][ticket.id.to_s]['customer_id'])
  1371. assert(result['assets']['User'])
  1372. assert(result['assets']['User'][@agent.id.to_s])
  1373. assert_equal(@agent.id, result['assets']['User'][@agent.id.to_s]['id'])
  1374. assert_equal(@agent.firstname, result['assets']['User'][@agent.id.to_s]['firstname'])
  1375. assert_equal(@agent.lastname, result['assets']['User'][@agent.id.to_s]['lastname'])
  1376. assert(result['assets']['User'])
  1377. assert(result['assets']['User'][@customer_without_org.id.to_s])
  1378. assert_equal(@customer_without_org.id, result['assets']['User'][@customer_without_org.id.to_s]['id'])
  1379. assert_equal(@customer_without_org.firstname, result['assets']['User'][@customer_without_org.id.to_s]['firstname'])
  1380. assert_equal(@customer_without_org.lastname, result['assets']['User'][@customer_without_org.id.to_s]['lastname'])
  1381. get "/api/v1/tickets/#{ticket.id}?full=false", params: {}, headers: @headers.merge('Authorization' => credentials)
  1382. assert_response(200)
  1383. result = JSON.parse(@response.body)
  1384. assert_equal(Hash, result.class)
  1385. assert_equal(ticket.id, result['id'])
  1386. assert_equal(ticket.title, result['title'])
  1387. assert_not(result['group'])
  1388. assert_not(result['priority'])
  1389. assert_not(result['owner'])
  1390. assert_equal(ticket.customer_id, result['customer_id'])
  1391. assert_equal(@agent.id, result['updated_by_id'])
  1392. assert_equal(@agent.id, result['created_by_id'])
  1393. end
  1394. test '04.02 ticket index and response format' do
  1395. title = "ticket testagent#{rand(999_999_999)}"
  1396. ticket = Ticket.create!(
  1397. title: title,
  1398. group: Group.lookup(name: 'Users'),
  1399. customer_id: @customer_without_org.id,
  1400. state: Ticket::State.lookup(name: 'new'),
  1401. priority: Ticket::Priority.lookup(name: '2 normal'),
  1402. updated_by_id: @agent.id,
  1403. created_by_id: @agent.id,
  1404. )
  1405. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1406. get '/api/v1/tickets', params: {}, headers: @headers.merge('Authorization' => credentials)
  1407. assert_response(200)
  1408. result = JSON.parse(@response.body)
  1409. assert_equal(Array, result.class)
  1410. assert_equal(Hash, result[0].class)
  1411. assert_equal(1, result[0]['id'])
  1412. assert_equal(ticket.id, result[1]['id'])
  1413. assert_equal(ticket.title, result[1]['title'])
  1414. assert_not(result[1]['group'])
  1415. assert_not(result[1]['priority'])
  1416. assert_not(result[1]['owner'])
  1417. assert_equal(ticket.customer_id, result[1]['customer_id'])
  1418. assert_equal(@agent.id, result[1]['updated_by_id'])
  1419. assert_equal(@agent.id, result[1]['created_by_id'])
  1420. get '/api/v1/tickets?expand=true', params: {}, headers: @headers.merge('Authorization' => credentials)
  1421. assert_response(200)
  1422. result = JSON.parse(@response.body)
  1423. assert_equal(Array, result.class)
  1424. assert_equal(Hash, result[0].class)
  1425. assert_equal(1, result[0]['id'])
  1426. assert_equal(ticket.id, result[1]['id'])
  1427. assert_equal(ticket.title, result[1]['title'])
  1428. assert_equal(ticket.customer_id, result[1]['customer_id'])
  1429. assert_equal(ticket.group.name, result[1]['group'])
  1430. assert_equal(ticket.priority.name, result[1]['priority'])
  1431. assert_equal(ticket.owner.login, result[1]['owner'])
  1432. assert_equal(@agent.id, result[1]['updated_by_id'])
  1433. assert_equal(@agent.id, result[1]['created_by_id'])
  1434. get '/api/v1/tickets?expand=false', params: {}, headers: @headers.merge('Authorization' => credentials)
  1435. assert_response(200)
  1436. result = JSON.parse(@response.body)
  1437. assert_equal(Array, result.class)
  1438. assert_equal(Hash, result[0].class)
  1439. assert_equal(1, result[0]['id'])
  1440. assert_equal(ticket.id, result[1]['id'])
  1441. assert_equal(ticket.title, result[1]['title'])
  1442. assert_not(result[1]['group'])
  1443. assert_not(result[1]['priority'])
  1444. assert_not(result[1]['owner'])
  1445. assert_equal(ticket.customer_id, result[1]['customer_id'])
  1446. assert_equal(@agent.id, result[1]['updated_by_id'])
  1447. assert_equal(@agent.id, result[1]['created_by_id'])
  1448. get '/api/v1/tickets?full=true', params: {}, headers: @headers.merge('Authorization' => credentials)
  1449. assert_response(200)
  1450. result = JSON.parse(@response.body)
  1451. assert_equal(Hash, result.class)
  1452. assert_equal(Array, result['record_ids'].class)
  1453. assert_equal(1, result['record_ids'][0])
  1454. assert_equal(ticket.id, result['record_ids'][1])
  1455. assert(result['assets'])
  1456. assert(result['assets']['Ticket'])
  1457. assert(result['assets']['Ticket'][ticket.id.to_s])
  1458. assert_equal(ticket.id, result['assets']['Ticket'][ticket.id.to_s]['id'])
  1459. assert_equal(ticket.title, result['assets']['Ticket'][ticket.id.to_s]['title'])
  1460. assert_equal(ticket.customer_id, result['assets']['Ticket'][ticket.id.to_s]['customer_id'])
  1461. assert(result['assets']['User'])
  1462. assert(result['assets']['User'][@agent.id.to_s])
  1463. assert_equal(@agent.id, result['assets']['User'][@agent.id.to_s]['id'])
  1464. assert_equal(@agent.firstname, result['assets']['User'][@agent.id.to_s]['firstname'])
  1465. assert_equal(@agent.lastname, result['assets']['User'][@agent.id.to_s]['lastname'])
  1466. assert(result['assets']['User'])
  1467. assert(result['assets']['User'][@customer_without_org.id.to_s])
  1468. assert_equal(@customer_without_org.id, result['assets']['User'][@customer_without_org.id.to_s]['id'])
  1469. assert_equal(@customer_without_org.firstname, result['assets']['User'][@customer_without_org.id.to_s]['firstname'])
  1470. assert_equal(@customer_without_org.lastname, result['assets']['User'][@customer_without_org.id.to_s]['lastname'])
  1471. get '/api/v1/tickets?full=false', params: {}, headers: @headers.merge('Authorization' => credentials)
  1472. assert_response(200)
  1473. result = JSON.parse(@response.body)
  1474. assert_equal(Array, result.class)
  1475. assert_equal(Hash, result[0].class)
  1476. assert_equal(1, result[0]['id'])
  1477. assert_equal(ticket.id, result[1]['id'])
  1478. assert_equal(ticket.title, result[1]['title'])
  1479. assert_not(result[1]['group'])
  1480. assert_not(result[1]['priority'])
  1481. assert_not(result[1]['owner'])
  1482. assert_equal(ticket.customer_id, result[1]['customer_id'])
  1483. assert_equal(@agent.id, result[1]['updated_by_id'])
  1484. assert_equal(@agent.id, result[1]['created_by_id'])
  1485. end
  1486. test '04.03 ticket create and response format' do
  1487. title = "ticket testagent#{rand(999_999_999)}"
  1488. params = {
  1489. title: title,
  1490. group: 'Users',
  1491. customer_id: @customer_without_org.id,
  1492. state: 'new',
  1493. priority: '2 normal',
  1494. article: {
  1495. body: 'some test 123',
  1496. },
  1497. }
  1498. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1499. post '/api/v1/tickets', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1500. assert_response(201)
  1501. result = JSON.parse(@response.body)
  1502. assert_equal(Hash, result.class)
  1503. ticket = Ticket.find(result['id'])
  1504. assert_equal(ticket.state_id, result['state_id'])
  1505. assert_not(result['state'])
  1506. assert_equal(ticket.priority_id, result['priority_id'])
  1507. assert_not(result['priority'])
  1508. assert_equal(ticket.group_id, result['group_id'])
  1509. assert_not(result['group'])
  1510. assert_equal(title, result['title'])
  1511. assert_equal(@customer_without_org.id, result['customer_id'])
  1512. assert_equal(@agent.id, result['updated_by_id'])
  1513. assert_equal(@agent.id, result['created_by_id'])
  1514. post '/api/v1/tickets?expand=true', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1515. assert_response(201)
  1516. result = JSON.parse(@response.body)
  1517. assert_equal(Hash, result.class)
  1518. ticket = Ticket.find(result['id'])
  1519. assert_equal(ticket.state_id, result['state_id'])
  1520. assert_equal(ticket.state.name, result['state'])
  1521. assert_equal(ticket.priority_id, result['priority_id'])
  1522. assert_equal(ticket.priority.name, result['priority'])
  1523. assert_equal(ticket.group_id, result['group_id'])
  1524. assert_equal(ticket.group.name, result['group'])
  1525. assert_equal(title, result['title'])
  1526. assert_equal(@customer_without_org.id, result['customer_id'])
  1527. assert_equal(@agent.id, result['updated_by_id'])
  1528. assert_equal(@agent.id, result['created_by_id'])
  1529. post '/api/v1/tickets?full=true', params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1530. assert_response(201)
  1531. result = JSON.parse(@response.body)
  1532. assert_equal(Hash, result.class)
  1533. ticket = Ticket.find(result['id'])
  1534. assert(result['assets'])
  1535. assert(result['assets']['Ticket'])
  1536. assert(result['assets']['Ticket'][ticket.id.to_s])
  1537. assert_equal(ticket.id, result['assets']['Ticket'][ticket.id.to_s]['id'])
  1538. assert_equal(title, result['assets']['Ticket'][ticket.id.to_s]['title'])
  1539. assert_equal(ticket.customer_id, result['assets']['Ticket'][ticket.id.to_s]['customer_id'])
  1540. assert(result['assets']['User'])
  1541. assert(result['assets']['User'][@agent.id.to_s])
  1542. assert_equal(@agent.id, result['assets']['User'][@agent.id.to_s]['id'])
  1543. assert_equal(@agent.firstname, result['assets']['User'][@agent.id.to_s]['firstname'])
  1544. assert_equal(@agent.lastname, result['assets']['User'][@agent.id.to_s]['lastname'])
  1545. assert(result['assets']['User'])
  1546. assert(result['assets']['User'][@customer_without_org.id.to_s])
  1547. assert_equal(@customer_without_org.id, result['assets']['User'][@customer_without_org.id.to_s]['id'])
  1548. assert_equal(@customer_without_org.firstname, result['assets']['User'][@customer_without_org.id.to_s]['firstname'])
  1549. assert_equal(@customer_without_org.lastname, result['assets']['User'][@customer_without_org.id.to_s]['lastname'])
  1550. end
  1551. test '04.04 ticket update and response formats' do
  1552. title = "ticket testagent#{rand(999_999_999)}"
  1553. ticket = Ticket.create!(
  1554. title: title,
  1555. group: Group.lookup(name: 'Users'),
  1556. customer_id: @customer_without_org.id,
  1557. state: Ticket::State.lookup(name: 'new'),
  1558. priority: Ticket::Priority.lookup(name: '2 normal'),
  1559. updated_by_id: @agent.id,
  1560. created_by_id: @agent.id,
  1561. )
  1562. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1563. params = {
  1564. title: 'a update ticket #1',
  1565. }
  1566. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1567. assert_response(200)
  1568. result = JSON.parse(@response.body)
  1569. assert_equal(Hash, result.class)
  1570. ticket = Ticket.find(result['id'])
  1571. assert_equal(ticket.state_id, result['state_id'])
  1572. assert_not(result['state'])
  1573. assert_equal(ticket.priority_id, result['priority_id'])
  1574. assert_not(result['priority'])
  1575. assert_equal(ticket.group_id, result['group_id'])
  1576. assert_not(result['group'])
  1577. assert_equal('a update ticket #1', result['title'])
  1578. assert_equal(@customer_without_org.id, result['customer_id'])
  1579. assert_equal(@agent.id, result['updated_by_id'])
  1580. assert_equal(@agent.id, result['created_by_id'])
  1581. params = {
  1582. title: 'a update ticket #2',
  1583. }
  1584. put "/api/v1/tickets/#{ticket.id}?expand=true", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1585. assert_response(200)
  1586. result = JSON.parse(@response.body)
  1587. assert_equal(Hash, result.class)
  1588. ticket = Ticket.find(result['id'])
  1589. assert_equal(ticket.state_id, result['state_id'])
  1590. assert_equal(ticket.state.name, result['state'])
  1591. assert_equal(ticket.priority_id, result['priority_id'])
  1592. assert_equal(ticket.priority.name, result['priority'])
  1593. assert_equal(ticket.group_id, result['group_id'])
  1594. assert_equal(ticket.group.name, result['group'])
  1595. assert_equal('a update ticket #2', result['title'])
  1596. assert_equal(@customer_without_org.id, result['customer_id'])
  1597. assert_equal(@agent.id, result['updated_by_id'])
  1598. assert_equal(@agent.id, result['created_by_id'])
  1599. params = {
  1600. title: 'a update ticket #3',
  1601. }
  1602. put "/api/v1/tickets/#{ticket.id}?full=true", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1603. assert_response(200)
  1604. result = JSON.parse(@response.body)
  1605. assert_equal(Hash, result.class)
  1606. ticket = Ticket.find(result['id'])
  1607. assert(result['assets'])
  1608. assert(result['assets']['Ticket'])
  1609. assert(result['assets']['Ticket'][ticket.id.to_s])
  1610. assert_equal(ticket.id, result['assets']['Ticket'][ticket.id.to_s]['id'])
  1611. assert_equal('a update ticket #3', result['assets']['Ticket'][ticket.id.to_s]['title'])
  1612. assert_equal(ticket.customer_id, result['assets']['Ticket'][ticket.id.to_s]['customer_id'])
  1613. assert(result['assets']['User'])
  1614. assert(result['assets']['User'][@agent.id.to_s])
  1615. assert_equal(@agent.id, result['assets']['User'][@agent.id.to_s]['id'])
  1616. assert_equal(@agent.firstname, result['assets']['User'][@agent.id.to_s]['firstname'])
  1617. assert_equal(@agent.lastname, result['assets']['User'][@agent.id.to_s]['lastname'])
  1618. assert(result['assets']['User'])
  1619. assert(result['assets']['User'][@customer_without_org.id.to_s])
  1620. assert_equal(@customer_without_org.id, result['assets']['User'][@customer_without_org.id.to_s]['id'])
  1621. assert_equal(@customer_without_org.firstname, result['assets']['User'][@customer_without_org.id.to_s]['firstname'])
  1622. assert_equal(@customer_without_org.lastname, result['assets']['User'][@customer_without_org.id.to_s]['lastname'])
  1623. end
  1624. test '05.01 ticket split with html - check attachments' do
  1625. ticket = Ticket.create!(
  1626. title: 'some title',
  1627. group: Group.lookup(name: 'Users'),
  1628. customer_id: @customer_without_org.id,
  1629. state: Ticket::State.lookup(name: 'new'),
  1630. priority: Ticket::Priority.lookup(name: '2 normal'),
  1631. updated_by_id: @agent.id,
  1632. created_by_id: @agent.id,
  1633. )
  1634. article = Ticket::Article.create!(
  1635. type: Ticket::Article::Type.lookup(name: 'note'),
  1636. sender: Ticket::Article::Sender.lookup(name: 'Customer'),
  1637. from: 'sender',
  1638. subject: 'subject',
  1639. body: '<b>test</b> <img src="cid:15.274327094.140938@ZAMMAD.example.com"/> test <img src="cid:15.274327094.140938.3@ZAMMAD.example.com"/>',
  1640. content_type: 'text/html',
  1641. ticket_id: ticket.id,
  1642. updated_by_id: 1,
  1643. created_by_id: 1,
  1644. )
  1645. Store.add(
  1646. object: 'Ticket::Article',
  1647. o_id: article.id,
  1648. data: 'content_file1_normally_should_be_an_image',
  1649. filename: 'some_file1.jpg',
  1650. preferences: {
  1651. 'Content-Type' => 'image/jpeg',
  1652. 'Mime-Type' => 'image/jpeg',
  1653. 'Content-ID' => '15.274327094.140938@zammad.example.com',
  1654. 'Content-Disposition' => 'inline',
  1655. },
  1656. created_by_id: 1,
  1657. )
  1658. Store.add(
  1659. object: 'Ticket::Article',
  1660. o_id: article.id,
  1661. data: 'content_file2_normally_should_be_an_image',
  1662. filename: 'some_file2.jpg',
  1663. preferences: {
  1664. 'Content-Type' => 'image/jpeg',
  1665. 'Mime-Type' => 'image/jpeg',
  1666. 'Content-ID' => '15.274327094.140938.2@zammad.example.com',
  1667. 'Content-Disposition' => 'inline',
  1668. },
  1669. created_by_id: 1,
  1670. )
  1671. Store.add(
  1672. object: 'Ticket::Article',
  1673. o_id: article.id,
  1674. data: 'content_file3_normally_should_be_an_image',
  1675. filename: 'some_file3.jpg',
  1676. preferences: {
  1677. 'Content-Type' => 'image/jpeg',
  1678. 'Mime-Type' => 'image/jpeg',
  1679. 'Content-ID' => '15.274327094.140938.3@zammad.example.com',
  1680. },
  1681. created_by_id: 1,
  1682. )
  1683. Store.add(
  1684. object: 'Ticket::Article',
  1685. o_id: article.id,
  1686. data: 'content_file4_normally_should_be_an_image',
  1687. filename: 'some_file4.jpg',
  1688. preferences: {
  1689. 'Content-Type' => 'image/jpeg',
  1690. 'Mime-Type' => 'image/jpeg',
  1691. 'Content-ID' => '15.274327094.140938.4@zammad.example.com',
  1692. },
  1693. created_by_id: 1,
  1694. )
  1695. Store.add(
  1696. object: 'Ticket::Article',
  1697. o_id: article.id,
  1698. data: 'content_file1_normally_should_be_an_pdf',
  1699. filename: 'Rechnung_RE-2018-200.pdf',
  1700. preferences: {
  1701. 'Content-Type' => 'application/octet-stream; name="Rechnung_RE-2018-200.pdf"',
  1702. 'Mime-Type' => 'application/octet-stream',
  1703. 'Content-ID' => '8AB0BEC88984EE4EBEF643C79C8E0346@zammad.example.com',
  1704. 'Content-Description' => 'Rechnung_RE-2018-200.pdf',
  1705. 'Content-Disposition' => 'attachment',
  1706. },
  1707. created_by_id: 1,
  1708. )
  1709. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1710. get "/api/v1/ticket_split?ticket_id=#{ticket.id}&article_id=#{article.id}&form_id=new_form_id123", params: {}, headers: @headers.merge('Authorization' => credentials)
  1711. assert_response(200)
  1712. result = JSON.parse(@response.body)
  1713. assert_equal(Hash, result.class)
  1714. assert(result['assets'])
  1715. assert(result['assets']['Ticket'])
  1716. assert(result['assets']['Ticket'][ticket.id.to_s])
  1717. assert(result['assets']['TicketArticle'][article.id.to_s])
  1718. assert(result['attachments'])
  1719. assert_equal(result['attachments'].count, 3)
  1720. get "/api/v1/ticket_split?ticket_id=#{ticket.id}&article_id=#{article.id}&form_id=new_form_id123", params: {}, headers: @headers.merge('Authorization' => credentials)
  1721. assert_response(200)
  1722. result = JSON.parse(@response.body)
  1723. assert_equal(Hash, result.class)
  1724. assert(result['assets'])
  1725. assert(result['assets']['Ticket'])
  1726. assert(result['assets']['Ticket'][ticket.id.to_s])
  1727. assert(result['assets']['TicketArticle'][article.id.to_s])
  1728. assert(result['attachments'])
  1729. assert_equal(result['attachments'].count, 0)
  1730. end
  1731. test '05.02 ticket split with plain - check attachments' do
  1732. ticket = Ticket.create!(
  1733. title: 'some title',
  1734. group: Group.lookup(name: 'Users'),
  1735. customer_id: @customer_without_org.id,
  1736. state: Ticket::State.lookup(name: 'new'),
  1737. priority: Ticket::Priority.lookup(name: '2 normal'),
  1738. updated_by_id: @agent.id,
  1739. created_by_id: @agent.id,
  1740. )
  1741. article = Ticket::Article.create!(
  1742. type: Ticket::Article::Type.lookup(name: 'note'),
  1743. sender: Ticket::Article::Sender.lookup(name: 'Customer'),
  1744. from: 'sender',
  1745. subject: 'subject',
  1746. body: '<b>test</b> <img src="cid:15.274327094.140938@zammad.example.com"/>',
  1747. content_type: 'text/plain',
  1748. ticket_id: ticket.id,
  1749. updated_by_id: 1,
  1750. created_by_id: 1,
  1751. )
  1752. Store.add(
  1753. object: 'Ticket::Article',
  1754. o_id: article.id,
  1755. data: 'content_file1_normally_should_be_an_image',
  1756. filename: 'some_file1.jpg',
  1757. preferences: {
  1758. 'Content-Type' => 'image/jpeg',
  1759. 'Mime-Type' => 'image/jpeg',
  1760. 'Content-ID' => '15.274327094.140938@zammad.example.com',
  1761. 'Content-Disposition' => 'inline',
  1762. },
  1763. created_by_id: 1,
  1764. )
  1765. Store.add(
  1766. object: 'Ticket::Article',
  1767. o_id: article.id,
  1768. data: 'content_file1_normally_should_be_an_image',
  1769. filename: 'some_file2.jpg',
  1770. preferences: {
  1771. 'Content-Type' => 'image/jpeg',
  1772. 'Mime-Type' => 'image/jpeg',
  1773. 'Content-ID' => '15.274327094.140938.2@zammad.example.com',
  1774. 'Content-Disposition' => 'inline',
  1775. },
  1776. created_by_id: 1,
  1777. )
  1778. Store.add(
  1779. object: 'Ticket::Article',
  1780. o_id: article.id,
  1781. data: 'content_file1_normally_should_be_an_pdf',
  1782. filename: 'Rechnung_RE-2018-200.pdf',
  1783. preferences: {
  1784. 'Content-Type' => 'application/octet-stream; name="Rechnung_RE-2018-200.pdf"',
  1785. 'Mime-Type' => 'application/octet-stream',
  1786. 'Content-ID' => '8AB0BEC88984EE4EBEF643C79C8E0346@zammad.example.com',
  1787. 'Content-Description' => 'Rechnung_RE-2018-200.pdf',
  1788. 'Content-Disposition' => 'attachment',
  1789. },
  1790. created_by_id: 1,
  1791. )
  1792. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1793. get "/api/v1/ticket_split?ticket_id=#{ticket.id}&article_id=#{article.id}&form_id=new_form_id123", params: {}, headers: @headers.merge('Authorization' => credentials)
  1794. assert_response(200)
  1795. result = JSON.parse(@response.body)
  1796. assert_equal(Hash, result.class)
  1797. assert(result['assets'])
  1798. assert(result['assets']['Ticket'])
  1799. assert(result['assets']['Ticket'][ticket.id.to_s])
  1800. assert(result['assets']['TicketArticle'][article.id.to_s])
  1801. assert(result['attachments'])
  1802. assert_equal(result['attachments'].count, 3)
  1803. get "/api/v1/ticket_split?ticket_id=#{ticket.id}&article_id=#{article.id}&form_id=new_form_id123", params: {}, headers: @headers.merge('Authorization' => credentials)
  1804. assert_response(200)
  1805. result = JSON.parse(@response.body)
  1806. assert_equal(Hash, result.class)
  1807. assert(result['assets'])
  1808. assert(result['assets']['Ticket'])
  1809. assert(result['assets']['Ticket'][ticket.id.to_s])
  1810. assert(result['assets']['TicketArticle'][article.id.to_s])
  1811. assert(result['attachments'])
  1812. assert_equal(result['attachments'].count, 0)
  1813. end
  1814. test '06.01 - ticket with follow up possible set to new_ticket' do
  1815. group = Group.create!(
  1816. name: "GroupWithNoFollowUp-#{rand(9_999_999_999)}",
  1817. active: true,
  1818. updated_by_id: 1,
  1819. created_by_id: 1,
  1820. follow_up_possible: 'new_ticket' # disable follow up possible
  1821. )
  1822. ticket = Ticket.create!(
  1823. title: 'ticket with wrong ticket id',
  1824. group_id: group.id,
  1825. customer_id: @customer_without_org.id,
  1826. state: Ticket::State.lookup(name: 'closed'), # set the ticket to closed
  1827. priority: Ticket::Priority.lookup(name: '2 normal'),
  1828. updated_by_id: 1,
  1829. created_by_id: 1,
  1830. )
  1831. state = Ticket::State.find_by(name: 'open') # try to open a ticket from a closed state
  1832. # customer
  1833. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-customer1@example.com', 'customer1pw')
  1834. params = {
  1835. state_id: state.id, # set the state id
  1836. }
  1837. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1838. assert_response(422)
  1839. result = JSON.parse(@response.body)
  1840. assert_equal(Hash, result.class)
  1841. assert_equal('Cannot follow up on a closed ticket. Please create a new ticket.', result['error'])
  1842. ticket = Ticket.create!(
  1843. title: 'ticket with wrong ticket id',
  1844. group_id: group.id,
  1845. customer_id: @customer_without_org.id,
  1846. state: Ticket::State.lookup(name: 'closed'), # set the ticket to closed
  1847. priority: Ticket::Priority.lookup(name: '2 normal'),
  1848. updated_by_id: 1,
  1849. created_by_id: 1,
  1850. )
  1851. # admin
  1852. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin@example.com', 'adminpw')
  1853. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1854. assert_response(422)
  1855. result = JSON.parse(@response.body)
  1856. assert_equal(Hash, result.class)
  1857. assert_equal('Cannot follow up on a closed ticket. Please create a new ticket.', result['error'])
  1858. ticket = Ticket.create!(
  1859. title: 'ticket with wrong ticket id',
  1860. group_id: group.id,
  1861. customer_id: @customer_without_org.id,
  1862. state: Ticket::State.lookup(name: 'closed'), # set the ticket to closed
  1863. priority: Ticket::Priority.lookup(name: '2 normal'),
  1864. updated_by_id: 1,
  1865. created_by_id: 1,
  1866. )
  1867. # agent
  1868. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1869. put "/api/v1/tickets/#{ticket.id}", params: params.to_json, headers: @headers.merge('Authorization' => credentials)
  1870. assert_response(422)
  1871. result = JSON.parse(@response.body)
  1872. assert_equal(Hash, result.class)
  1873. assert_equal('Cannot follow up on a closed ticket. Please create a new ticket.', result['error'])
  1874. end
  1875. test '07.01 ticket merge' do
  1876. group_no_permission = Group.create!(
  1877. name: 'GroupWithNoPermission',
  1878. active: true,
  1879. updated_by_id: 1,
  1880. created_by_id: 1,
  1881. )
  1882. ticket1 = Ticket.create!(
  1883. title: 'ticket merge1',
  1884. group: Group.lookup(name: 'Users'),
  1885. customer_id: @customer_without_org.id,
  1886. state: Ticket::State.lookup(name: 'new'),
  1887. priority: Ticket::Priority.lookup(name: '2 normal'),
  1888. updated_by_id: 1,
  1889. created_by_id: 1,
  1890. )
  1891. ticket2 = Ticket.create!(
  1892. title: 'ticket merge2',
  1893. group: Group.lookup(name: 'Users'),
  1894. customer_id: @customer_without_org.id,
  1895. state: Ticket::State.lookup(name: 'new'),
  1896. priority: Ticket::Priority.lookup(name: '2 normal'),
  1897. updated_by_id: 1,
  1898. created_by_id: 1,
  1899. )
  1900. ticket3 = Ticket.create!(
  1901. title: 'ticket merge2',
  1902. group: group_no_permission,
  1903. customer_id: @customer_without_org.id,
  1904. state: Ticket::State.lookup(name: 'new'),
  1905. priority: Ticket::Priority.lookup(name: '2 normal'),
  1906. updated_by_id: 1,
  1907. created_by_id: 1,
  1908. )
  1909. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1910. get "/api/v1/ticket_merge/#{ticket2.id}/#{ticket1.id}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1911. assert_response(200)
  1912. result = JSON.parse(@response.body)
  1913. assert_equal(Hash, result.class)
  1914. assert_equal('failed', result['result'])
  1915. assert_equal('No such master ticket number!', result['message'])
  1916. get "/api/v1/ticket_merge/#{ticket3.id}/#{ticket1.number}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1917. assert_response(401)
  1918. result = JSON.parse(@response.body)
  1919. assert_equal(Hash, result.class)
  1920. assert_equal('Not authorized', result['error'])
  1921. assert_equal('Not authorized', result['error_human'])
  1922. get "/api/v1/ticket_merge/#{ticket1.id}/#{ticket3.number}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1923. assert_response(401)
  1924. result = JSON.parse(@response.body)
  1925. assert_equal(Hash, result.class)
  1926. assert_equal('Not authorized', result['error'])
  1927. assert_equal('Not authorized', result['error_human'])
  1928. get "/api/v1/ticket_merge/#{ticket1.id}/#{ticket2.number}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1929. assert_response(200)
  1930. result = JSON.parse(@response.body)
  1931. assert_equal(Hash, result.class)
  1932. assert_equal('success', result['result'])
  1933. assert_equal(ticket2.id, result['master_ticket']['id'])
  1934. end
  1935. test '07.02 ticket merge - change permission' do
  1936. group_change_permission = Group.create!(
  1937. name: 'GroupWithChangePermission',
  1938. active: true,
  1939. updated_by_id: 1,
  1940. created_by_id: 1,
  1941. )
  1942. ticket1 = Ticket.create!(
  1943. title: 'ticket merge1',
  1944. group: group_change_permission,
  1945. customer_id: @customer_without_org.id,
  1946. state: Ticket::State.lookup(name: 'new'),
  1947. priority: Ticket::Priority.lookup(name: '2 normal'),
  1948. updated_by_id: 1,
  1949. created_by_id: 1,
  1950. )
  1951. ticket2 = Ticket.create!(
  1952. title: 'ticket merge2',
  1953. group: group_change_permission,
  1954. customer_id: @customer_without_org.id,
  1955. state: Ticket::State.lookup(name: 'new'),
  1956. priority: Ticket::Priority.lookup(name: '2 normal'),
  1957. updated_by_id: 1,
  1958. created_by_id: 1,
  1959. )
  1960. @agent.group_names_access_map = { group_change_permission.name => %w[read change] }
  1961. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
  1962. get "/api/v1/ticket_merge/#{ticket1.id}/#{ticket2.number}", params: {}, headers: @headers.merge('Authorization' => credentials)
  1963. assert_response(200)
  1964. result = JSON.parse(@response.body)
  1965. assert_equal(Hash, result.class)
  1966. assert_equal('success', result['result'])
  1967. assert_equal(ticket2.id, result['master_ticket']['id'])
  1968. end
  1969. test '08.01 ticket search sorted' do
  1970. title = "ticket pagination #{rand(999_999_999)}"
  1971. tickets = []
  1972. ticket1 = Ticket.create!(
  1973. title: "#{title} A",
  1974. group: Group.lookup(name: 'Users'),
  1975. customer_id: @customer_without_org.id,
  1976. state: Ticket::State.lookup(name: 'new'),
  1977. priority: Ticket::Priority.lookup(name: '2 normal'),
  1978. updated_by_id: 1,
  1979. created_by_id: 1,
  1980. )
  1981. Ticket::Article.create!(
  1982. type: Ticket::Article::Type.lookup(name: 'note'),
  1983. sender: Ticket::Article::Sender.lookup(name: 'Customer'),
  1984. from: 'sender',
  1985. subject: 'subject',
  1986. body: 'some body',
  1987. ticket_id: ticket1.id,
  1988. updated_by_id: 1,
  1989. created_by_id: 1,
  1990. )
  1991. travel 2.seconds
  1992. ticket2 = Ticket.create!(
  1993. title: "#{title} B",
  1994. group: Group.lookup(name: 'Users'),
  1995. customer_id: @customer_without_org.id,
  1996. state: Ticket::State.lookup(name: 'new'),
  1997. priority: Ticket::Priority.lookup(name: '3 hoch'),
  1998. updated_by_id: 1,
  1999. created_by_id: 1,
  2000. )
  2001. Ticket::Article.create!(
  2002. type: Ticket::Article::Type.lookup(name: 'note'),
  2003. sender: Ticket::Article::Sender.lookup(name: 'Customer'),
  2004. from: 'sender',
  2005. subject: 'subject',
  2006. body: 'some body',
  2007. ticket_id: ticket2.id,
  2008. updated_by_id: 1,
  2009. created_by_id: 1,
  2010. )
  2011. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  2012. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40", params: {}, headers: @headers.merge('Authorization' => credentials)
  2013. assert_response(200)
  2014. result = JSON.parse(@response.body)
  2015. assert_equal(Hash, result.class)
  2016. assert_equal([ticket2.id, ticket1.id], result['tickets'])
  2017. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  2018. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40", params: { sort_by: 'created_at', order_by: 'asc' }, headers: @headers.merge('Authorization' => credentials)
  2019. assert_response(200)
  2020. result = JSON.parse(@response.body)
  2021. assert_equal(Hash, result.class)
  2022. assert_equal([ticket1.id, ticket2.id], result['tickets'])
  2023. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  2024. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40", params: { sort_by: 'title', order_by: 'asc' }, headers: @headers.merge('Authorization' => credentials)
  2025. assert_response(200)
  2026. result = JSON.parse(@response.body)
  2027. assert_equal(Hash, result.class)
  2028. assert_equal([ticket1.id, ticket2.id], result['tickets'])
  2029. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  2030. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40", params: { sort_by: 'title', order_by: 'desc' }, headers: @headers.merge('Authorization' => credentials)
  2031. assert_response(200)
  2032. result = JSON.parse(@response.body)
  2033. assert_equal(Hash, result.class)
  2034. assert_equal([ticket2.id, ticket1.id], result['tickets'])
  2035. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  2036. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40", params: { sort_by: %w[created_at updated_at], order_by: %w[asc asc] }, headers: @headers.merge('Authorization' => credentials)
  2037. assert_response(200)
  2038. result = JSON.parse(@response.body)
  2039. assert_equal(Hash, result.class)
  2040. assert_equal([ticket1.id, ticket2.id], result['tickets'])
  2041. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-admin', 'adminpw')
  2042. get "/api/v1/tickets/search?query=#{CGI.escape(title)}&limit=40", params: { sort_by: %w[created_at updated_at], order_by: %w[desc asc] }, headers: @headers.merge('Authorization' => credentials)
  2043. assert_response(200)
  2044. result = JSON.parse(@response.body)
  2045. assert_equal(Hash, result.class)
  2046. assert_equal([ticket2.id, ticket1.id], result['tickets'])
  2047. end
  2048. end