trabajo-afectivo/test/unit/karma_test.rb

522 lines
18 KiB
Ruby

# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
require 'test_helper'
class KarmaTest < ActiveSupport::TestCase
test 'basic' do
groups = Group.all
roles = Role.where(name: 'Agent')
agent1 = User.create!(
login: 'karma-agent1@example.com',
firstname: 'Karma',
lastname: 'Agent1',
email: 'karma-agent1@example.com',
password: 'agentpw',
active: true,
roles: roles,
groups: groups,
updated_by_id: 1,
created_by_id: 1,
)
agent2 = User.create!(
login: 'karma-agent2@example.com',
firstname: 'Karma',
lastname: 'Agent2',
email: 'karma-agent2@example.com',
password: 'agentpw',
active: true,
roles: roles,
groups: groups,
updated_by_id: 1,
created_by_id: 1,
)
customer1 = User.create!(
login: 'karma-customer1@example.com',
firstname: 'Karma',
lastname: 'Customer1',
email: 'karma-customer1@example.com',
password: 'customerpw',
active: true,
roles: roles,
groups: groups,
updated_by_id: 1,
created_by_id: 1,
)
ticket1 = Ticket.create!(
title: 'karma test 1',
group: Group.lookup(name: 'Users'),
customer: customer1,
state: Ticket::State.lookup(name: 'new'),
priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: agent1.id,
created_by_id: agent1.id,
updated_at: 10.hours.ago,
created_at: 10.hours.ago,
)
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'agent phone 1 / init',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Agent'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: agent1.id,
created_by_id: agent1.id,
updated_at: 10.hours.ago,
created_at: 10.hours.ago,
)
assert(ticket1)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10, Karma.score_by_user(agent1))
assert_equal(0, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
karma_user = Karma::User.by_user(agent1)
assert_equal('Beginner', karma_user.level)
assert_equal(10, karma_user.score)
karma_user = Karma::User.by_user(agent2)
assert_equal('Beginner', karma_user.level)
assert_equal(0, karma_user.score)
ticket1.state = Ticket::State.lookup(name: 'pending reminder')
ticket1.updated_by_id = agent1.id
ticket1.updated_at = 9.hours.ago
ticket1.created_at = 9.hours.ago
ticket1.save!
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2, Karma.score_by_user(agent1))
assert_equal(0, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
karma_user = Karma::User.by_user(agent1)
assert_equal('Beginner', karma_user.level)
assert_equal(12, karma_user.score)
karma_user = Karma::User.by_user(agent2)
assert_equal('Beginner', karma_user.level)
assert_equal(0, karma_user.score)
ticket1.state = Ticket::State.lookup(name: 'pending close')
ticket1.updated_by_id = agent1.id
ticket1.updated_at = 9.hours.ago
ticket1.created_at = 9.hours.ago
ticket1.save!
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2, Karma.score_by_user(agent1))
assert_equal(0, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
ticket1.state = Ticket::State.lookup(name: 'closed')
ticket1.updated_by_id = agent2.id
ticket1.updated_at = 9.hours.ago
ticket1.created_at = 9.hours.ago
ticket1.save!
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2, Karma.score_by_user(agent1))
assert_equal(0, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
ticket1.state = Ticket::State.lookup(name: 'open')
ticket1.save!
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'reply: some subject',
message_id: 'some@id',
body: 'agent phone 2',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Agent'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: agent2.id,
created_by_id: agent2.id,
updated_at: Time.zone.now - (9.hours + 15.minutes),
created_at: Time.zone.now - (9.hours + 15.minutes),
)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2, Karma.score_by_user(agent1))
assert_equal(0, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
ticket1.state = Ticket::State.lookup(name: 'closed')
ticket1.save!
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2, Karma.score_by_user(agent1))
assert_equal(5, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'customer phone',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Customer'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: customer1.id,
created_by_id: customer1.id,
updated_at: 8.hours.ago,
created_at: 8.hours.ago,
)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2, Karma.score_by_user(agent1))
assert_equal(5, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'agent phone 3',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Agent'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: agent1.id,
created_by_id: agent1.id,
updated_at: Time.zone.now - (7.hours + 30.minutes),
created_at: Time.zone.now - (7.hours + 30.minutes),
)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
assert_equal(5, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'some message',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Agent'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: agent1.id,
created_by_id: agent1.id,
updated_at: Time.zone.now - (7.hours + 15.minutes),
created_at: Time.zone.now - (7.hours + 15.minutes),
)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
assert_equal(5, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'some message',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Customer'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: customer1.id,
created_by_id: customer1.id,
updated_at: 7.hours.ago,
created_at: 7.hours.ago,
)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
assert_equal(5, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'some message',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Agent'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: agent2.id,
created_by_id: agent2.id,
updated_at: Time.zone.now - (2.hours + 30.minutes),
created_at: Time.zone.now - (2.hours + 30.minutes),
)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
assert_equal(5 + 10, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket::Article.create!(
ticket_id: ticket1.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'some message',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Agent'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: agent1.id,
created_by_id: agent1.id,
updated_at: Time.zone.now - (2.hours + 45.minutes),
created_at: Time.zone.now - (2.hours + 45.minutes),
)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25, Karma.score_by_user(agent1))
assert_equal(5 + 10, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
ticket1.tag_add('Tag1', agent1.id)
# travel 5.seconds
ticket1.tag_add('Tag2', agent1.id)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25 + 4, Karma.score_by_user(agent1))
assert_equal(5 + 10, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
ticket1.tag_add('Tag3', agent1.id)
ticket1.tag_add('Tag4', agent2.id)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25 + 4, Karma.score_by_user(agent1))
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
ticket2 = Ticket.create!(
title: 'karma test 1',
group: Group.lookup(name: 'Users'),
customer: customer1,
state: Ticket::State.lookup(name: 'new'),
owner_id: agent1.id,
priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: agent1.id,
created_by_id: agent1.id,
updated_at: 10.hours.ago,
created_at: 10.hours.ago,
)
Ticket::Article.create!(
ticket_id: ticket2.id,
from: 'some_sender@example.com',
to: 'some_recipient@example.com',
subject: 'some subject',
message_id: 'some@id',
body: 'some message',
internal: false,
sender: Ticket::Article::Sender.lookup(name: 'Agent'),
type: Ticket::Article::Type.lookup(name: 'phone'),
updated_by_id: agent1.id,
created_by_id: agent1.id,
updated_at: 2.hours.ago,
created_at: 2.hours.ago,
)
assert(ticket2)
# execute object transaction
TransactionDispatcher.commit
Scheduler.worker(true)
assert_equal(10 + 2 + 25 + 4 + 10, Karma.score_by_user(agent1))
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
ticket2.state = Ticket::State.lookup(name: 'pending reminder')
ticket2.pending_time = 1.day.ago
ticket2.save!
Ticket.process_pending
assert_equal(10 + 2 + 25 + 4 + 10, Karma.score_by_user(agent1))
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
ticket2.state = Ticket::State.lookup(name: 'pending reminder')
ticket2.pending_time = 3.days.ago
ticket2.save!
Ticket.process_pending
assert_equal(10 + 2 + 25 + 4 + 10 - 5, Karma.score_by_user(agent1))
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket.process_pending
assert_equal(10 + 2 + 25 + 4 + 10 - 5, Karma.score_by_user(agent1))
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
calendar1 = Calendar.create!(
name: 'EU 1 - karma test',
timezone: 'Europe/Berlin',
business_hours: {
mon: {
active: true,
timeframes: [ ['00:00', '23:59'] ]
},
tue: {
active: true,
timeframes: [ ['00:00', '23:59'] ]
},
wed: {
active: true,
timeframes: [ ['00:00', '23:59'] ]
},
thu: {
active: true,
timeframes: [ ['00:00', '23:59'] ]
},
fri: {
active: true,
timeframes: [ ['00:00', '23:59'] ]
},
sat: {
active: true,
timeframes: [ ['00:00', '23:59'] ]
},
sun: {
active: true,
timeframes: [ ['00:00', '23:59'] ]
},
},
default: true,
ical_url: nil,
updated_by_id: 1,
created_by_id: 1,
)
sla1 = Sla.create!(
name: 'test sla 1',
condition: {},
first_response_time: 20,
update_time: 60,
solution_time: 120,
calendar_id: calendar1.id,
updated_by_id: 1,
created_by_id: 1,
)
ticket2.state = Ticket::State.lookup(name: 'open')
ticket2.save!
TransactionDispatcher.commit
Scheduler.worker(true)
# Scheduler.worker(true)
# Ticket::Escalation.rebuild_all
Ticket.process_escalation
assert_equal(10 + 2 + 25 + 4 + 10 - 5 - 5, Karma.score_by_user(agent1))
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
Ticket.process_escalation
assert_equal(10 + 2 + 25 + 4 + 10 - 5 - 5, Karma.score_by_user(agent1))
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
# check min score
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
Karma::ActivityLog.add('ticket escalated', ticket2.owner, 'Ticket', ticket2.id, true)
assert_equal(0, Karma.score_by_user(agent1), 'block - score, min is 0')
assert_equal(5 + 10 + 4, Karma.score_by_user(agent2))
assert_equal(0, Karma.score_by_user(customer1))
# test score/level
assert_equal('Beginner', Karma::User.level_by_score(0))
assert_equal('Beginner', Karma::User.level_by_score(400))
assert_equal('Beginner', Karma::User.level_by_score(499))
assert_equal('Newbie', Karma::User.level_by_score(500))
assert_equal('Newbie', Karma::User.level_by_score(1999))
assert_equal('Intermediate', Karma::User.level_by_score(2000))
assert_equal('Intermediate', Karma::User.level_by_score(4999))
assert_equal('Professional', Karma::User.level_by_score(5000))
assert_equal('Professional', Karma::User.level_by_score(6999))
assert_equal('Expert', Karma::User.level_by_score(7000))
assert_equal('Expert', Karma::User.level_by_score(8999))
assert_equal('Master', Karma::User.level_by_score(9000))
assert_equal('Master', Karma::User.level_by_score(18_999))
assert_equal('Evangelist', Karma::User.level_by_score(19_000))
assert_equal('Evangelist', Karma::User.level_by_score(49_999))
assert_equal('Hero', Karma::User.level_by_score(50_000))
# cleanup
ticket1.destroy!
ticket2.destroy!
calendar1.destroy!
sla1.destroy!
end
end