notification_factory_renderer_test.rb 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. # encoding: utf-8
  2. require 'test_helper'
  3. class NotificationFactoryRendererTest < ActiveSupport::TestCase
  4. # RSpec incoming!
  5. def described_class
  6. NotificationFactory::Renderer
  7. end
  8. group = Group.new(name: 'Users')
  9. owner = User.new(firstname: 'Owner<b>xxx</b>', lastname: 'Agent1<b>yyy</b>')
  10. current_user = User.new(firstname: 'CurrentUser<b>xxx</b>', lastname: 'Agent2<b>yyy</b>')
  11. recipient = User.new(firstname: 'Recipient<b>xxx</b>', lastname: 'Customer1<b>yyy</b>')
  12. state = Ticket::State.new(name: 'new')
  13. ticket = Ticket.new(
  14. id: 1,
  15. title: '<b>Welcome to Zammad!</b>',
  16. group: group,
  17. owner: owner,
  18. state: state,
  19. created_by: current_user,
  20. updated_by: current_user,
  21. created_at: Time.zone.parse('2016-11-12 12:00:00 UTC'),
  22. updated_at: Time.zone.parse('2016-11-12 14:00:00 UTC'),
  23. )
  24. article_html1 = Ticket::Article.new(
  25. body: 'test <b>hello</b><br>some new line',
  26. content_type: 'text/html',
  27. )
  28. article_plain1 = Ticket::Article.new(
  29. body: "test <b>hello</b>\nsome new line",
  30. content_type: 'text/plain',
  31. )
  32. article_plain2 = Ticket::Article.new(
  33. body: "test <b>hello</b>\nsome new line",
  34. )
  35. test 'replace object attribute' do
  36. template = "\#{ticket.title}"
  37. result = described_class.new(
  38. {
  39. ticket: ticket,
  40. },
  41. 'en-us',
  42. template,
  43. ).render
  44. assert_equal(CGI.escapeHTML(ticket.title), result)
  45. template = "\#{ticket.created_at}"
  46. result = described_class.new(
  47. {
  48. ticket: ticket,
  49. },
  50. 'en-us',
  51. template,
  52. ).render
  53. assert_equal(ticket.created_at.to_s, result)
  54. template = "\#{ticket.created_by.firstname}"
  55. result = described_class.new(
  56. {
  57. ticket: ticket,
  58. },
  59. 'en-us',
  60. template,
  61. ).render
  62. assert_equal('CurrentUser&lt;b&gt;xxx&lt;/b&gt;', result)
  63. template = "\#{ticket.updated_at}"
  64. result = described_class.new(
  65. {
  66. ticket: ticket,
  67. },
  68. 'en-us',
  69. template,
  70. ).render
  71. assert_equal(ticket.updated_at.to_s, result)
  72. template = "\#{ticket.updated_by.firstname}"
  73. result = described_class.new(
  74. {
  75. ticket: ticket,
  76. },
  77. 'en-us',
  78. template,
  79. ).render
  80. assert_equal('CurrentUser&lt;b&gt;xxx&lt;/b&gt;', result)
  81. template = "\#{ticket.owner.firstname}"
  82. result = described_class.new(
  83. {
  84. ticket: ticket,
  85. },
  86. 'en-us',
  87. template,
  88. ).render
  89. assert_equal('Owner&lt;b&gt;xxx&lt;/b&gt;', result)
  90. template = "\#{ticket. title}"
  91. result = described_class.new(
  92. {
  93. ticket: ticket,
  94. },
  95. 'en-us',
  96. template,
  97. ).render
  98. assert_equal(CGI.escapeHTML(ticket.title), result)
  99. template = "\#{ticket.\n title}"
  100. result = described_class.new(
  101. {
  102. ticket: ticket,
  103. },
  104. 'en-us',
  105. template,
  106. ).render
  107. assert_equal(CGI.escapeHTML(ticket.title), result)
  108. template = "\#{ticket.\t title}"
  109. result = described_class.new(
  110. {
  111. ticket: ticket,
  112. },
  113. 'en-us',
  114. template,
  115. ).render
  116. assert_equal(CGI.escapeHTML(ticket.title), result)
  117. template = "\#{ticket.\t\n title\t}"
  118. result = described_class.new(
  119. {
  120. ticket: ticket,
  121. },
  122. 'en-us',
  123. template,
  124. ).render
  125. assert_equal(CGI.escapeHTML(ticket.title), result)
  126. template = "\#{ticket.\" title\t}"
  127. result = described_class.new(
  128. {
  129. ticket: ticket,
  130. },
  131. 'en-us',
  132. template,
  133. ).render
  134. assert_equal(CGI.escapeHTML(ticket.title), result)
  135. template = "some test<br>\#{article.body}"
  136. result = described_class.new(
  137. {
  138. article: article_html1,
  139. },
  140. 'en-us',
  141. template,
  142. ).render
  143. assert_equal('some test<br>&gt; test hello<br>&gt; some new line<br>', result)
  144. result = described_class.new(
  145. {
  146. article: article_plain1,
  147. },
  148. 'en-us',
  149. template,
  150. ).render
  151. assert_equal('some test<br>&gt; test &lt;b&gt;hello&lt;/b&gt;<br>&gt; some new line<br>', result)
  152. result = described_class.new(
  153. {
  154. article: article_plain2,
  155. },
  156. 'en-us',
  157. template,
  158. ).render
  159. assert_equal('some test<br>&gt; test &lt;b&gt;hello&lt;/b&gt;<br>&gt; some new line<br>', result)
  160. end
  161. test 'config' do
  162. setting = 'fqdn'
  163. template = "\#{config.#{setting}}"
  164. result = described_class.new(
  165. {
  166. ticket: ticket,
  167. },
  168. 'en-us',
  169. template,
  170. ).render
  171. assert_equal(Setting.get(setting), result)
  172. setting1 = 'fqdn'
  173. setting2 = 'product_name'
  174. template = "some \#{config.#{setting1}} and \#{config.#{setting2}}"
  175. result = described_class.new(
  176. {
  177. ticket: ticket,
  178. },
  179. 'en-us',
  180. template,
  181. ).render
  182. assert_equal("some #{Setting.get(setting1)} and #{Setting.get(setting2)}", result)
  183. setting1 = 'fqdn'
  184. setting2 = 'product_name'
  185. template = "some \#{ config.#{setting1}} and \#{\tconfig.#{setting2}}"
  186. result = described_class.new(
  187. {
  188. ticket: ticket,
  189. },
  190. 'en-us',
  191. template,
  192. ).render
  193. assert_equal("some #{Setting.get(setting1)} and #{Setting.get(setting2)}", result)
  194. end
  195. test 'translation' do
  196. #template = "<%= t 'new' %>"
  197. template = "\#{t('new')}"
  198. result = described_class.new(
  199. {
  200. ticket: ticket,
  201. },
  202. 'de-de',
  203. template,
  204. ).render
  205. assert_equal('neu', result)
  206. template = "some text \#{t('new')} and \#{t('open')}"
  207. result = described_class.new(
  208. {
  209. ticket: ticket,
  210. },
  211. 'de-de',
  212. template,
  213. ).render
  214. assert_equal('some text neu and offen', result)
  215. template = "some text \#{t('new') } and \#{ t('open')}"
  216. result = described_class.new(
  217. {
  218. ticket: ticket,
  219. },
  220. 'de-de',
  221. template,
  222. ).render
  223. assert_equal('some text neu and offen', result)
  224. template = "some text \#{\nt('new') } and \#{ t('open')\t}"
  225. result = described_class.new(
  226. {
  227. ticket: ticket,
  228. },
  229. 'de-de',
  230. template,
  231. ).render
  232. assert_equal('some text neu and offen', result)
  233. end
  234. test 'chained function calls' do
  235. template = "\#{t(ticket.state.name)}"
  236. result = described_class.new(
  237. {
  238. ticket: ticket,
  239. },
  240. 'de-de',
  241. template,
  242. ).render
  243. assert_equal('neu', result)
  244. end
  245. test 'not existing object and attribute' do
  246. template = "\#{}"
  247. result = described_class.new(
  248. {
  249. ticket: ticket,
  250. },
  251. 'en-us',
  252. template,
  253. ).render
  254. assert_equal(CGI.escapeHTML('#{no such object}'), result)
  255. template = "\#{notexsiting.notexsiting}"
  256. result = described_class.new(
  257. {
  258. ticket: ticket,
  259. },
  260. 'en-us',
  261. template,
  262. ).render
  263. assert_equal(CGI.escapeHTML('#{notexsiting / no such object}'), result)
  264. template = "\#{ticket.notexsiting}"
  265. result = described_class.new(
  266. {
  267. ticket: ticket,
  268. },
  269. 'en-us',
  270. template,
  271. ).render
  272. assert_equal(CGI.escapeHTML('#{ticket.notexsiting / no such method}'), result)
  273. template = "\#{ticket.}"
  274. result = described_class.new(
  275. {
  276. ticket: ticket,
  277. },
  278. 'en-us',
  279. template,
  280. ).render
  281. assert_equal(CGI.escapeHTML('#{ticket. / no such method}'), result)
  282. template = "\#{ticket.title.notexsiting}"
  283. result = described_class.new(
  284. {
  285. ticket: ticket,
  286. },
  287. 'en-us',
  288. template,
  289. ).render
  290. assert_equal(CGI.escapeHTML('#{ticket.title.notexsiting / no such method}'), result)
  291. template = "\#{ticket.notexsiting.notexsiting}"
  292. result = described_class.new(
  293. {
  294. ticket: ticket,
  295. },
  296. 'en-us',
  297. template,
  298. ).render
  299. assert_equal(CGI.escapeHTML('#{ticket.notexsiting / no such method}'), result)
  300. template = "\#{notexsiting}"
  301. result = described_class.new(
  302. {
  303. ticket: ticket,
  304. },
  305. 'en-us',
  306. template,
  307. ).render
  308. assert_equal(CGI.escapeHTML('#{notexsiting / no such object}'), result)
  309. template = "\#{notexsiting.}"
  310. result = described_class.new(
  311. {
  312. ticket: ticket,
  313. },
  314. 'en-us',
  315. template,
  316. ).render
  317. assert_equal(CGI.escapeHTML('#{notexsiting / no such object}'), result)
  318. template = "\#{string}"
  319. result = described_class.new(
  320. {
  321. string: 'some string',
  322. },
  323. 'en-us',
  324. template,
  325. ).render
  326. assert_equal(CGI.escapeHTML('some string'), result)
  327. template = "\#{fixum}"
  328. result = described_class.new(
  329. {
  330. fixum: 123,
  331. },
  332. 'en-us',
  333. template,
  334. ).render
  335. assert_equal(CGI.escapeHTML('123'), result)
  336. template = "\#{float}"
  337. result = described_class.new(
  338. {
  339. float: 123.99,
  340. },
  341. 'en-us',
  342. template,
  343. ).render
  344. assert_equal(CGI.escapeHTML('123.99'), result)
  345. end
  346. test 'data key validation' do
  347. template = "\#{ticket.title `echo 1`}"
  348. result = described_class.new(
  349. {
  350. ticket: ticket,
  351. },
  352. 'en-us',
  353. template,
  354. ).render
  355. assert_equal(CGI.escapeHTML('#{ticket.title`echo1` / not allowed}'), result)
  356. template = "\#{ticket.destroy}"
  357. result = described_class.new(
  358. {
  359. ticket: ticket,
  360. },
  361. 'en-us',
  362. template,
  363. ).render
  364. assert_equal(CGI.escapeHTML('#{ticket.destroy / not allowed}'), result)
  365. template = "\#{ticket.save}"
  366. result = described_class.new(
  367. {
  368. ticket: ticket,
  369. },
  370. 'en-us',
  371. template,
  372. ).render
  373. assert_equal(CGI.escapeHTML('#{ticket.save / not allowed}'), result)
  374. template = "\#{ticket.update}"
  375. result = described_class.new(
  376. {
  377. ticket: ticket,
  378. },
  379. 'en-us',
  380. template,
  381. ).render
  382. assert_equal(CGI.escapeHTML('#{ticket.update / not allowed}'), result)
  383. template = "\#{ticket.create}"
  384. result = described_class.new(
  385. {
  386. ticket: ticket,
  387. },
  388. 'en-us',
  389. template,
  390. ).render
  391. assert_equal(CGI.escapeHTML('#{ticket.create / not allowed}'), result)
  392. template = "\#{ticket.delete}"
  393. result = described_class.new(
  394. {
  395. ticket: ticket,
  396. },
  397. 'en-us',
  398. template,
  399. ).render
  400. assert_equal(CGI.escapeHTML('#{ticket.delete / not allowed}'), result)
  401. template = "\#{ticket.remove}"
  402. result = described_class.new(
  403. {
  404. ticket: ticket,
  405. },
  406. 'en-us',
  407. template,
  408. ).render
  409. assert_equal(CGI.escapeHTML('#{ticket.remove / not allowed}'), result)
  410. template = "\#{ticket.drop}"
  411. result = described_class.new(
  412. {
  413. ticket: ticket,
  414. },
  415. 'en-us',
  416. template,
  417. ).render
  418. assert_equal(CGI.escapeHTML('#{ticket.drop / not allowed}'), result)
  419. template = "\#{ticket.create}"
  420. result = described_class.new(
  421. {
  422. ticket: ticket,
  423. },
  424. 'en-us',
  425. template,
  426. ).render
  427. assert_equal(CGI.escapeHTML('#{ticket.create / not allowed}'), result)
  428. template = "\#{ticket.new}"
  429. result = described_class.new(
  430. {
  431. ticket: ticket,
  432. },
  433. 'en-us',
  434. template,
  435. ).render
  436. assert_equal(CGI.escapeHTML('#{ticket.new / not allowed}'), result)
  437. template = "\#{ticket.update_att}"
  438. result = described_class.new(
  439. {
  440. ticket: ticket,
  441. },
  442. 'en-us',
  443. template,
  444. ).render
  445. assert_equal(CGI.escapeHTML('#{ticket.update_att / not allowed}'), result)
  446. template = "\#{ticket.all}"
  447. result = described_class.new(
  448. {
  449. ticket: ticket,
  450. },
  451. 'en-us',
  452. template,
  453. ).render
  454. assert_equal(CGI.escapeHTML('#{ticket.all / not allowed}'), result)
  455. template = "\#{ticket.find}"
  456. result = described_class.new(
  457. {
  458. ticket: ticket,
  459. },
  460. 'en-us',
  461. template,
  462. ).render
  463. assert_equal(CGI.escapeHTML('#{ticket.find / not allowed}'), result)
  464. template = "\#{ticket.where}"
  465. result = described_class.new(
  466. {
  467. ticket: ticket,
  468. },
  469. 'en-us',
  470. template,
  471. ).render
  472. assert_equal(CGI.escapeHTML('#{ticket.where / not allowed}'), result)
  473. template = "\#{ticket. destroy}"
  474. result = described_class.new(
  475. {
  476. ticket: ticket,
  477. },
  478. 'en-us',
  479. template,
  480. ).render
  481. assert_equal(CGI.escapeHTML('#{ticket.destroy / not allowed}'), result)
  482. template = "\#{ticket.\n destroy}"
  483. result = described_class.new(
  484. {
  485. ticket: ticket,
  486. },
  487. 'en-us',
  488. template,
  489. ).render
  490. assert_equal(CGI.escapeHTML("\#{ticket.destroy / not allowed}"), result)
  491. template = "\#{ticket.\t destroy}"
  492. result = described_class.new(
  493. {
  494. ticket: ticket,
  495. },
  496. 'en-us',
  497. template,
  498. ).render
  499. assert_equal(CGI.escapeHTML("\#{ticket.destroy / not allowed}"), result)
  500. template = "\#{ticket.\r destroy}"
  501. result = described_class.new(
  502. {
  503. ticket: ticket,
  504. },
  505. 'en-us',
  506. template,
  507. ).render
  508. assert_equal(CGI.escapeHTML("\#{ticket.destroy / not allowed}"), result)
  509. end
  510. end