karma_test.rb 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. require 'test_helper'
  3. class KarmaTest < ActiveSupport::TestCase
  4. include BackgroundJobsHelper
  5. test 'basic' do
  6. groups = Group.all
  7. roles = Role.where(name: 'Agent')
  8. agent1 = User.create!(
  9. login: 'karma-agent1@example.com',
  10. firstname: 'Karma',
  11. lastname: 'Agent1',
  12. email: 'karma-agent1@example.com',
  13. password: 'agentpw',
  14. active: true,
  15. roles: roles,
  16. groups: groups,
  17. updated_by_id: 1,
  18. created_by_id: 1,
  19. )
  20. agent2 = User.create!(
  21. login: 'karma-agent2@example.com',
  22. firstname: 'Karma',
  23. lastname: 'Agent2',
  24. email: 'karma-agent2@example.com',
  25. password: 'agentpw',
  26. active: true,
  27. roles: roles,
  28. groups: groups,
  29. updated_by_id: 1,
  30. created_by_id: 1,
  31. )
  32. customer1 = User.create!(
  33. login: 'karma-customer1@example.com',
  34. firstname: 'Karma',
  35. lastname: 'Customer1',
  36. email: 'karma-customer1@example.com',
  37. password: 'customerpw',
  38. active: true,
  39. roles: roles,
  40. groups: groups,
  41. updated_by_id: 1,
  42. created_by_id: 1,
  43. )
  44. ticket1 = Ticket.create!(
  45. title: 'karma test 1',
  46. group: Group.lookup(name: 'Users'),
  47. customer: customer1,
  48. state: Ticket::State.lookup(name: 'new'),
  49. priority: Ticket::Priority.lookup(name: '2 normal'),
  50. updated_by_id: agent1.id,
  51. created_by_id: agent1.id,
  52. updated_at: 10.hours.ago,
  53. created_at: 10.hours.ago,
  54. )
  55. Ticket::Article.create!(
  56. ticket_id: ticket1.id,
  57. from: 'some_sender@example.com',
  58. to: 'some_recipient@example.com',
  59. subject: 'some subject',
  60. message_id: 'some@id',
  61. body: 'agent phone 1 / init',
  62. internal: false,
  63. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  64. type: Ticket::Article::Type.lookup(name: 'phone'),
  65. updated_by_id: agent1.id,
  66. created_by_id: agent1.id,
  67. updated_at: 10.hours.ago,
  68. created_at: 10.hours.ago,
  69. )
  70. assert(ticket1)
  71. perform_enqueued_jobs commit_transaction: true
  72. assert_equal(10, Karma.score_by_user(agent1))
  73. assert_equal(0, Karma.score_by_user(agent2))
  74. assert_equal(0, Karma.score_by_user(customer1))
  75. karma_user = Karma::User.by_user(agent1)
  76. assert_equal('Beginner', karma_user.level)
  77. assert_equal(10, karma_user.score)
  78. karma_user = Karma::User.by_user(agent2)
  79. assert_equal('Beginner', karma_user.level)
  80. assert_equal(0, karma_user.score)
  81. ticket1.state = Ticket::State.lookup(name: 'pending reminder')
  82. ticket1.updated_by_id = agent1.id
  83. ticket1.updated_at = 9.hours.ago
  84. ticket1.created_at = 9.hours.ago
  85. ticket1.save!
  86. perform_enqueued_jobs commit_transaction: true
  87. assert_equal(10 + 2, Karma.score_by_user(agent1))
  88. assert_equal(0, Karma.score_by_user(agent2))
  89. assert_equal(0, Karma.score_by_user(customer1))
  90. karma_user = Karma::User.by_user(agent1)
  91. assert_equal('Beginner', karma_user.level)
  92. assert_equal(12, karma_user.score)
  93. karma_user = Karma::User.by_user(agent2)
  94. assert_equal('Beginner', karma_user.level)
  95. assert_equal(0, karma_user.score)
  96. ticket1.state = Ticket::State.lookup(name: 'pending close')
  97. ticket1.updated_by_id = agent1.id
  98. ticket1.updated_at = 9.hours.ago
  99. ticket1.created_at = 9.hours.ago
  100. ticket1.save!
  101. perform_enqueued_jobs commit_transaction: true
  102. assert_equal(10 + 2, Karma.score_by_user(agent1))
  103. assert_equal(0, Karma.score_by_user(agent2))
  104. assert_equal(0, Karma.score_by_user(customer1))
  105. ticket1.state = Ticket::State.lookup(name: 'closed')
  106. ticket1.updated_by_id = agent2.id
  107. ticket1.updated_at = 9.hours.ago
  108. ticket1.created_at = 9.hours.ago
  109. ticket1.save!
  110. perform_enqueued_jobs commit_transaction: true
  111. assert_equal(10 + 2, Karma.score_by_user(agent1))
  112. assert_equal(0, Karma.score_by_user(agent2))
  113. assert_equal(0, Karma.score_by_user(customer1))
  114. ticket1.state = Ticket::State.lookup(name: 'open')
  115. ticket1.save!
  116. Ticket::Article.create!(
  117. ticket_id: ticket1.id,
  118. from: 'some_sender@example.com',
  119. to: 'some_recipient@example.com',
  120. subject: 'reply: some subject',
  121. message_id: 'some@id',
  122. body: 'agent phone 2',
  123. internal: false,
  124. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  125. type: Ticket::Article::Type.lookup(name: 'phone'),
  126. updated_by_id: agent2.id,
  127. created_by_id: agent2.id,
  128. updated_at: Time.zone.now - (9.hours + 15.minutes),
  129. created_at: Time.zone.now - (9.hours + 15.minutes),
  130. )
  131. perform_enqueued_jobs commit_transaction: true
  132. assert_equal(10 + 2, Karma.score_by_user(agent1))
  133. assert_equal(0, Karma.score_by_user(agent2))
  134. assert_equal(0, Karma.score_by_user(customer1))
  135. perform_enqueued_jobs commit_transaction: true
  136. ticket1.state = Ticket::State.lookup(name: 'closed')
  137. ticket1.save!
  138. perform_enqueued_jobs commit_transaction: true
  139. assert_equal(10 + 2, Karma.score_by_user(agent1))
  140. assert_equal(5, Karma.score_by_user(agent2))
  141. assert_equal(0, Karma.score_by_user(customer1))
  142. Ticket::Article.create!(
  143. ticket_id: ticket1.id,
  144. from: 'some_sender@example.com',
  145. to: 'some_recipient@example.com',
  146. subject: 'some subject',
  147. message_id: 'some@id',
  148. body: 'customer phone',
  149. internal: false,
  150. sender: Ticket::Article::Sender.lookup(name: 'Customer'),
  151. type: Ticket::Article::Type.lookup(name: 'phone'),
  152. updated_by_id: customer1.id,
  153. created_by_id: customer1.id,
  154. updated_at: 8.hours.ago,
  155. created_at: 8.hours.ago,
  156. )
  157. perform_enqueued_jobs commit_transaction: true
  158. assert_equal(10 + 2, Karma.score_by_user(agent1))
  159. assert_equal(5, Karma.score_by_user(agent2))
  160. assert_equal(0, Karma.score_by_user(customer1))
  161. Ticket::Article.create!(
  162. ticket_id: ticket1.id,
  163. from: 'some_sender@example.com',
  164. to: 'some_recipient@example.com',
  165. subject: 'some subject',
  166. message_id: 'some@id',
  167. body: 'agent phone 3',
  168. internal: false,
  169. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  170. type: Ticket::Article::Type.lookup(name: 'phone'),
  171. updated_by_id: agent1.id,
  172. created_by_id: agent1.id,
  173. updated_at: Time.zone.now - (7.hours + 30.minutes),
  174. created_at: Time.zone.now - (7.hours + 30.minutes),
  175. )
  176. perform_enqueued_jobs commit_transaction: true
  177. assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
  178. assert_equal(5, Karma.score_by_user(agent2))
  179. assert_equal(0, Karma.score_by_user(customer1))
  180. Ticket::Article.create!(
  181. ticket_id: ticket1.id,
  182. from: 'some_sender@example.com',
  183. to: 'some_recipient@example.com',
  184. subject: 'some subject',
  185. message_id: 'some@id',
  186. body: 'some message',
  187. internal: false,
  188. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  189. type: Ticket::Article::Type.lookup(name: 'phone'),
  190. updated_by_id: agent1.id,
  191. created_by_id: agent1.id,
  192. updated_at: Time.zone.now - (7.hours + 15.minutes),
  193. created_at: Time.zone.now - (7.hours + 15.minutes),
  194. )
  195. perform_enqueued_jobs commit_transaction: true
  196. assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
  197. assert_equal(5, Karma.score_by_user(agent2))
  198. assert_equal(0, Karma.score_by_user(customer1))
  199. Ticket::Article.create!(
  200. ticket_id: ticket1.id,
  201. from: 'some_sender@example.com',
  202. to: 'some_recipient@example.com',
  203. subject: 'some subject',
  204. message_id: 'some@id',
  205. body: 'some message',
  206. internal: false,
  207. sender: Ticket::Article::Sender.lookup(name: 'Customer'),
  208. type: Ticket::Article::Type.lookup(name: 'phone'),
  209. updated_by_id: customer1.id,
  210. created_by_id: customer1.id,
  211. updated_at: 7.hours.ago,
  212. created_at: 7.hours.ago,
  213. )
  214. perform_enqueued_jobs commit_transaction: true
  215. assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
  216. assert_equal(5, Karma.score_by_user(agent2))
  217. assert_equal(0, Karma.score_by_user(customer1))
  218. Ticket::Article.create!(
  219. ticket_id: ticket1.id,
  220. from: 'some_sender@example.com',
  221. to: 'some_recipient@example.com',
  222. subject: 'some subject',
  223. message_id: 'some@id',
  224. body: 'some message',
  225. internal: false,
  226. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  227. type: Ticket::Article::Type.lookup(name: 'phone'),
  228. updated_by_id: agent2.id,
  229. created_by_id: agent2.id,
  230. updated_at: Time.zone.now - (2.hours + 30.minutes),
  231. created_at: Time.zone.now - (2.hours + 30.minutes),
  232. )
  233. perform_enqueued_jobs commit_transaction: true
  234. assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
  235. assert_equal(5 + 10, Karma.score_by_user(agent2))
  236. assert_equal(0, Karma.score_by_user(customer1))
  237. Ticket::Article.create!(
  238. ticket_id: ticket1.id,
  239. from: 'some_sender@example.com',
  240. to: 'some_recipient@example.com',
  241. subject: 'some subject',
  242. message_id: 'some@id',
  243. body: 'some message',
  244. internal: false,
  245. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  246. type: Ticket::Article::Type.lookup(name: 'phone'),
  247. updated_by_id: agent1.id,
  248. created_by_id: agent1.id,
  249. updated_at: Time.zone.now - (2.hours + 45.minutes),
  250. created_at: Time.zone.now - (2.hours + 45.minutes),
  251. )
  252. perform_enqueued_jobs commit_transaction: true
  253. assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
  254. assert_equal(5 + 10, Karma.score_by_user(agent2))
  255. assert_equal(0, Karma.score_by_user(customer1))
  256. ticket1.tag_add('Tag1', agent1.id)
  257. # travel 5.seconds
  258. ticket1.tag_add('Tag2', agent1.id)
  259. perform_enqueued_jobs commit_transaction: true
  260. assert_equal(10 + 2 + 25 + 4, Karma.score_by_user(agent1))
  261. assert_equal(5 + 10, Karma.score_by_user(agent2))
  262. assert_equal(0, Karma.score_by_user(customer1))
  263. ticket1.tag_add('Tag3', agent1.id)
  264. ticket1.tag_add('Tag4', agent2.id)
  265. perform_enqueued_jobs commit_transaction: true
  266. assert_equal(10 + 2 + 25 + 4, Karma.score_by_user(agent1))
  267. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  268. assert_equal(0, Karma.score_by_user(customer1))
  269. ticket2 = Ticket.create!(
  270. title: 'karma test 1',
  271. group: Group.lookup(name: 'Users'),
  272. customer: customer1,
  273. state: Ticket::State.lookup(name: 'new'),
  274. owner_id: agent1.id,
  275. priority: Ticket::Priority.lookup(name: '2 normal'),
  276. updated_by_id: agent1.id,
  277. created_by_id: agent1.id,
  278. updated_at: 10.hours.ago,
  279. created_at: 10.hours.ago,
  280. )
  281. Ticket::Article.create!(
  282. ticket_id: ticket2.id,
  283. from: 'some_sender@example.com',
  284. to: 'some_recipient@example.com',
  285. subject: 'some subject',
  286. message_id: 'some@id',
  287. body: 'some message',
  288. internal: false,
  289. sender: Ticket::Article::Sender.lookup(name: 'Agent'),
  290. type: Ticket::Article::Type.lookup(name: 'phone'),
  291. updated_by_id: agent1.id,
  292. created_by_id: agent1.id,
  293. updated_at: 2.hours.ago,
  294. created_at: 2.hours.ago,
  295. )
  296. assert(ticket2)
  297. perform_enqueued_jobs commit_transaction: true
  298. assert_equal(10 + 2 + 25 + 4 + 10, Karma.score_by_user(agent1))
  299. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  300. assert_equal(0, Karma.score_by_user(customer1))
  301. ticket2.state = Ticket::State.lookup(name: 'pending reminder')
  302. ticket2.pending_time = 1.day.ago
  303. ticket2.save!
  304. Ticket.process_pending
  305. assert_equal(10 + 2 + 25 + 4 + 10, Karma.score_by_user(agent1))
  306. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  307. assert_equal(0, Karma.score_by_user(customer1))
  308. ticket2.state = Ticket::State.lookup(name: 'pending reminder')
  309. ticket2.pending_time = 3.days.ago
  310. ticket2.save!
  311. Ticket.process_pending
  312. assert_equal(10 + 2 + 25 + 4 + 10 - 5, Karma.score_by_user(agent1))
  313. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  314. assert_equal(0, Karma.score_by_user(customer1))
  315. Ticket.process_pending
  316. assert_equal(10 + 2 + 25 + 4 + 10 - 5, Karma.score_by_user(agent1))
  317. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  318. assert_equal(0, Karma.score_by_user(customer1))
  319. calendar1 = Calendar.create!(
  320. name: 'EU 1 - karma test',
  321. timezone: 'Europe/Berlin',
  322. business_hours: {
  323. mon: {
  324. active: true,
  325. timeframes: [ ['00:00', '23:59'] ]
  326. },
  327. tue: {
  328. active: true,
  329. timeframes: [ ['00:00', '23:59'] ]
  330. },
  331. wed: {
  332. active: true,
  333. timeframes: [ ['00:00', '23:59'] ]
  334. },
  335. thu: {
  336. active: true,
  337. timeframes: [ ['00:00', '23:59'] ]
  338. },
  339. fri: {
  340. active: true,
  341. timeframes: [ ['00:00', '23:59'] ]
  342. },
  343. sat: {
  344. active: true,
  345. timeframes: [ ['00:00', '23:59'] ]
  346. },
  347. sun: {
  348. active: true,
  349. timeframes: [ ['00:00', '23:59'] ]
  350. },
  351. },
  352. default: true,
  353. ical_url: nil,
  354. updated_by_id: 1,
  355. created_by_id: 1,
  356. )
  357. sla1 = Sla.create!(
  358. name: 'test sla 1',
  359. condition: {},
  360. first_response_time: 20,
  361. update_time: 60,
  362. solution_time: 120,
  363. calendar_id: calendar1.id,
  364. updated_by_id: 1,
  365. created_by_id: 1,
  366. )
  367. ticket2.state = Ticket::State.lookup(name: 'open')
  368. ticket2.save!
  369. perform_enqueued_jobs commit_transaction: true
  370. Ticket.process_escalation
  371. assert_equal(10 + 2 + 25 + 4 + 10 - 5 - 5, Karma.score_by_user(agent1))
  372. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  373. assert_equal(0, Karma.score_by_user(customer1))
  374. Ticket.process_escalation
  375. assert_equal(10 + 2 + 25 + 4 + 10 - 5 - 5, Karma.score_by_user(agent1))
  376. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  377. assert_equal(0, Karma.score_by_user(customer1))
  378. # check min score
  379. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  380. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  381. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  382. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  383. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  384. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  385. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  386. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  387. Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
  388. assert_equal(0, Karma.score_by_user(agent1), 'block - score, min is 0')
  389. assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
  390. assert_equal(0, Karma.score_by_user(customer1))
  391. # test score/level
  392. assert_equal('Beginner', Karma::User.level_by_score(0))
  393. assert_equal('Beginner', Karma::User.level_by_score(400))
  394. assert_equal('Beginner', Karma::User.level_by_score(499))
  395. assert_equal('Newbie', Karma::User.level_by_score(500))
  396. assert_equal('Newbie', Karma::User.level_by_score(1999))
  397. assert_equal('Intermediate', Karma::User.level_by_score(2000))
  398. assert_equal('Intermediate', Karma::User.level_by_score(4999))
  399. assert_equal('Professional', Karma::User.level_by_score(5000))
  400. assert_equal('Professional', Karma::User.level_by_score(6999))
  401. assert_equal('Expert', Karma::User.level_by_score(7000))
  402. assert_equal('Expert', Karma::User.level_by_score(8999))
  403. assert_equal('Master', Karma::User.level_by_score(9000))
  404. assert_equal('Master', Karma::User.level_by_score(18_999))
  405. assert_equal('Evangelist', Karma::User.level_by_score(19_000))
  406. assert_equal('Evangelist', Karma::User.level_by_score(49_999))
  407. assert_equal('Hero', Karma::User.level_by_score(50_000))
  408. # cleanup
  409. ticket1.destroy!
  410. ticket2.destroy!
  411. calendar1.destroy!
  412. sla1.destroy!
  413. end
  414. end