karma_test.rb 17 KB

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