mirror of
https://github.com/bringout/oca-ocb-vertical-industry.git
synced 2026-04-21 04:52:05 +02:00
19.0 vanilla
This commit is contained in:
parent
4607ccbd2e
commit
825ff6514e
487 changed files with 184979 additions and 195262 deletions
|
|
@ -1,6 +1,8 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import datetime
|
||||
from freezegun import freeze_time
|
||||
from datetime import timedelta
|
||||
|
||||
from odoo.addons.gamification.tests.common import TransactionCaseGamification
|
||||
from odoo.exceptions import UserError
|
||||
|
|
@ -12,7 +14,7 @@ class TestGamificationCommon(TransactionCaseGamification):
|
|||
def setUp(self):
|
||||
super(TestGamificationCommon, self).setUp()
|
||||
employees_group = self.env.ref('base.group_user')
|
||||
self.user_ids = employees_group.users
|
||||
self.user_ids = employees_group.all_user_ids
|
||||
|
||||
# Push demo user into the challenge before creating a new one
|
||||
self.env.ref('gamification.challenge_base_discover')._update_all()
|
||||
|
|
@ -20,7 +22,7 @@ class TestGamificationCommon(TransactionCaseGamification):
|
|||
'name': 'R2D2',
|
||||
'login': 'r2d2@openerp.com',
|
||||
'email': 'r2d2@openerp.com',
|
||||
'groups_id': [(6, 0, [employees_group.id])]
|
||||
'group_ids': [(6, 0, [employees_group.id])]
|
||||
})
|
||||
self.badge_good_job = self.env.ref('gamification.badge_good_job')
|
||||
|
||||
|
|
@ -61,22 +63,22 @@ class test_challenge(TestGamificationCommon):
|
|||
badge_ids = self.env['gamification.badge.user'].search([('badge_id', '=', badge_id), ('user_id', '=', demo.id)])
|
||||
self.assertEqual(len(badge_ids), 1, "Demo user has not received the badge")
|
||||
|
||||
@mute_logger('odoo.models.unlink')
|
||||
@mute_logger('odoo.models.unlink', 'odoo.addons.mail', 'odoo.addons.auth_signup')
|
||||
def test_20_update_all_goals_filter(self):
|
||||
# Enroll two internal and two portal users in the challenge
|
||||
(
|
||||
portal_login_before_update,
|
||||
portal_login_after_update,
|
||||
internal_login_before_update,
|
||||
internal_login_after_update,
|
||||
portal_last_active_old,
|
||||
portal_last_active_recent,
|
||||
internal_last_active_old,
|
||||
internal_last_active_recent,
|
||||
) = all_test_users = self.env['res.users'].create([
|
||||
{
|
||||
'name': f'{kind} {age} login',
|
||||
'login': f'{kind}_{age}',
|
||||
'email': f'{kind}_{age}',
|
||||
'groups_id': [(6, 0, groups_id)],
|
||||
'group_ids': [(6, 0, group_ids)],
|
||||
}
|
||||
for kind, groups_id in (
|
||||
for kind, group_ids in (
|
||||
('Portal', []),
|
||||
('Internal', [self.env.ref('base.group_user').id]),
|
||||
)
|
||||
|
|
@ -90,21 +92,23 @@ class test_challenge(TestGamificationCommon):
|
|||
'user_ids': [(6, 0, all_test_users.ids)]
|
||||
})
|
||||
|
||||
# Setup user access logs
|
||||
self.env['res.users.log'].search([('create_uid', 'in', challenge.user_ids.ids)]).unlink()
|
||||
now = datetime.datetime.now()
|
||||
# Setup user presence
|
||||
challenge.user_ids.presence_ids.unlink()
|
||||
|
||||
# Create "old" log in records
|
||||
self.env['res.users.log'].create([
|
||||
{"create_uid": internal_login_before_update.id, 'create_date': now - datetime.timedelta(minutes=3)},
|
||||
{"create_uid": portal_login_before_update.id, 'create_date': now - datetime.timedelta(minutes=3)},
|
||||
])
|
||||
for user in (
|
||||
portal_last_active_old,
|
||||
portal_last_active_recent,
|
||||
internal_last_active_old,
|
||||
internal_last_active_recent,
|
||||
):
|
||||
self.env["mail.presence"]._update_presence(user, 20 * 60 * 1000) # 20 min
|
||||
|
||||
# Reset goal objective values
|
||||
all_test_users.partner_id.tz = False
|
||||
|
||||
# Regenerate all goals
|
||||
self.env["gamification.goal"].search([]).unlink()
|
||||
self.env['gamification.goal'].search([]).unlink()
|
||||
self.assertFalse(self.env['gamification.goal'].search([]))
|
||||
|
||||
challenge.action_check()
|
||||
|
|
@ -114,29 +118,166 @@ class test_challenge(TestGamificationCommon):
|
|||
self.assertEqual(len(goal_ids), 4)
|
||||
self.assertEqual(set(goal_ids.mapped('state')), {'inprogress'})
|
||||
|
||||
# Create more recent log in records
|
||||
self.env['res.users.log'].create([
|
||||
{"create_uid": internal_login_after_update.id, 'create_date': now + datetime.timedelta(minutes=3)},
|
||||
{"create_uid": portal_login_after_update.id, 'create_date': now + datetime.timedelta(minutes=3)},
|
||||
])
|
||||
# +1 second to avoid microsecond inaccuracy when comparing to write_date in _update_all
|
||||
current_date = datetime.datetime.now() + timedelta(seconds=1)
|
||||
with freeze_time(current_date):
|
||||
# Update presence for 2 users
|
||||
self.env["mail.presence"]._update_presence(internal_last_active_recent)
|
||||
self.env["mail.presence"]._update_presence(portal_last_active_recent)
|
||||
|
||||
# Update goal objective checked by goal definition
|
||||
all_test_users.partner_id.write({'tz': 'Europe/Paris'})
|
||||
all_test_users.flush_recordset()
|
||||
|
||||
# Update goals as done by _cron_update
|
||||
challenge._update_all()
|
||||
unchanged_goal_id = self.env['gamification.goal'].search([
|
||||
unchanged_goal_ids = self.env['gamification.goal'].search([
|
||||
('challenge_id', '=', challenge.id),
|
||||
('state', '=', 'inprogress'), # others were updated to "reached"
|
||||
('user_id', 'in', challenge.user_ids.ids),
|
||||
])
|
||||
# Check that even though login record for internal user is older than goal update, their goal was reached.
|
||||
# Check that goals of users not recently active were not updated
|
||||
self.assertEqual(
|
||||
portal_login_before_update,
|
||||
unchanged_goal_id.user_id,
|
||||
"Only portal user last logged in before last challenge update should not have been updated.",
|
||||
portal_last_active_old | internal_last_active_old,
|
||||
unchanged_goal_ids.user_id,
|
||||
)
|
||||
|
||||
def test_30_create_challenge_with_sum_goal(self):
|
||||
challenge = self.env['gamification.challenge'].create({
|
||||
'name': 'test',
|
||||
'state': 'draft',
|
||||
'user_domain': '[("active", "=", True)]', #Include all active users to get a least one participant
|
||||
'reward_id': 1,
|
||||
})
|
||||
|
||||
model = self.env['ir.model'].search([('model', '=', 'gamification.badge')])[0]
|
||||
field = self.env['ir.model.fields'].search([('model', '=', 'gamification.badge'), ('name', '=', 'rule_max_number')])[0]
|
||||
|
||||
sum_goal = self.env['gamification.goal.definition'].create({
|
||||
'name': 'test',
|
||||
'computation_mode': 'sum',
|
||||
'model_id': model.id,
|
||||
'field_id': field.id
|
||||
})
|
||||
|
||||
self.env['gamification.challenge.line'].create({
|
||||
'challenge_id': challenge.id,
|
||||
'definition_id': sum_goal.id,
|
||||
'condition': 'higher',
|
||||
'target_goal': 1
|
||||
})
|
||||
|
||||
challenge.action_start()
|
||||
|
||||
self.assertEqual(
|
||||
challenge.state,
|
||||
'inprogress',
|
||||
"Challenge failed to start",
|
||||
)
|
||||
|
||||
def test_40_create_challenge_with_sum_goal(self):
|
||||
challenge = self.env['gamification.challenge'].create({
|
||||
'name': 'Test Challenge',
|
||||
'state': 'draft',
|
||||
'user_domain': '[("active", "=", True)]',
|
||||
'reward_id': 1,
|
||||
})
|
||||
|
||||
model = self.env['ir.model'].search([('model', '=', 'gamification.badge')], limit=1)
|
||||
|
||||
field = self.env['ir.model.fields'].search([
|
||||
('model', '=', 'gamification.badge'),
|
||||
('name', '=', 'name')
|
||||
], limit=1)
|
||||
|
||||
self.assertNotIn(field.ttype, {'integer', 'float', 'monetary'}, "Field should not be numeric")
|
||||
|
||||
sum_goal = self.env['gamification.goal.definition'].create({
|
||||
'name': 'Test Definition',
|
||||
'computation_mode': 'sum',
|
||||
'model_id': model.id,
|
||||
'field_id': field.id,
|
||||
})
|
||||
|
||||
existing_badges_count = len(self.env['gamification.badge'].with_user(self.user_demo.id).search([]))
|
||||
|
||||
self.env['gamification.challenge.line'].create({
|
||||
'challenge_id': challenge.id,
|
||||
'definition_id': sum_goal.id,
|
||||
'condition': 'higher',
|
||||
'target_goal': existing_badges_count + 1,
|
||||
})
|
||||
|
||||
challenge.action_start()
|
||||
self.assertEqual(challenge.state, 'inprogress', "Challenge failed to start")
|
||||
|
||||
goal = self.env['gamification.goal'].search([
|
||||
('user_id', '=', self.user_demo.id),
|
||||
('definition_id', '=', sum_goal.id)
|
||||
])
|
||||
self.assertLess(goal.current, goal.target_goal, "Current goal should be less than the target goal")
|
||||
self.assertEqual(goal.state, 'inprogress')
|
||||
|
||||
badge = self.env['gamification.badge'].create({
|
||||
'name': self.user_demo.name + " triggered",
|
||||
'rule_auth': 'users',
|
||||
'rule_auth_user_ids': self.user_demo,
|
||||
})
|
||||
|
||||
badge_user_wizard = self.env['gamification.badge.user.wizard'].create({
|
||||
'user_id': self.user_demo.id,
|
||||
'badge_id': badge.id,
|
||||
})
|
||||
badge_user_wizard.action_grant_badge()
|
||||
|
||||
goal.update_goal()
|
||||
self.assertEqual(goal.current, goal.target_goal, "Current goal should be equal to the target goal")
|
||||
self.assertEqual(goal.state, 'reached')
|
||||
|
||||
def test_send_report_in_ranking(self):
|
||||
gamification_model = self.env['ir.model']._get_id('gamification.badge')
|
||||
field = self.env['ir.model.fields'].search([('model', '=', 'gamification.badge'), ('name', '=', 'rule_max_number')], limit=1)
|
||||
|
||||
sum_goal = self.env['gamification.goal.definition'].create({
|
||||
'name': 'test1',
|
||||
'computation_mode': 'sum',
|
||||
'model_id': gamification_model,
|
||||
'field_id': field.id
|
||||
})
|
||||
|
||||
challenge = self.env['gamification.challenge'].create({
|
||||
'name': 'test1',
|
||||
'state': 'draft',
|
||||
'user_domain': '[("active", "=", True)]',
|
||||
'reward_id': 1,
|
||||
'visibility_mode': 'ranking'
|
||||
})
|
||||
|
||||
self.env['gamification.challenge.line'].create({
|
||||
'challenge_id': challenge.id,
|
||||
'definition_id': sum_goal.id,
|
||||
'condition': 'higher',
|
||||
'target_goal': 1
|
||||
})
|
||||
|
||||
challenge.action_start()
|
||||
current_date = datetime.datetime.now()
|
||||
|
||||
with freeze_time(current_date):
|
||||
challenge.action_report_progress()
|
||||
|
||||
self.assertEqual(
|
||||
challenge.state,
|
||||
'inprogress',
|
||||
"Challenge failed to start",
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
challenge.last_report_date,
|
||||
current_date.date(),
|
||||
"Challenge last report date is not as expected"
|
||||
)
|
||||
|
||||
|
||||
class test_badge_wizard(TestGamificationCommon):
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from datetime import date
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from freezegun import freeze_time
|
||||
from itertools import chain, repeat
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo import exceptions, fields
|
||||
from odoo import exceptions, fields, _
|
||||
from odoo.addons.mail.tests.common import mail_new_test_user
|
||||
from odoo.tests import common
|
||||
|
||||
|
|
@ -29,19 +31,21 @@ class TestKarmaTrackingCommon(common.TransactionCase):
|
|||
)
|
||||
cls.env['gamification.karma.tracking'].search([]).unlink()
|
||||
|
||||
cls.test_date = fields.Date.today() + relativedelta(month=4, day=1)
|
||||
cls.test_date = datetime(2021, 6, 1)
|
||||
cls.first_day_of_test_date_month = '2021-06-01'
|
||||
cls.first_day_of_test_date_next_month = '2021-07-01'
|
||||
|
||||
@classmethod
|
||||
def _create_trackings(cls, user, karma, steps, track_date, days_delta=1):
|
||||
old_value = user.karma
|
||||
for step in range(steps):
|
||||
for _step in range(steps):
|
||||
new_value = old_value + karma
|
||||
cls.env['gamification.karma.tracking'].create([{
|
||||
'user_id': user.id,
|
||||
'old_value': old_value,
|
||||
'new_value': new_value,
|
||||
'consolidated': False,
|
||||
'tracking_date': fields.Date.to_string(track_date)
|
||||
'tracking_date': fields.Datetime.to_string(track_date)
|
||||
}])
|
||||
old_value = new_value
|
||||
track_date = track_date + relativedelta(days=days_delta)
|
||||
|
|
@ -77,25 +81,67 @@ class TestKarmaTrackingCommon(common.TransactionCase):
|
|||
results = self.env['res.users']._get_tracking_karma_gain_position([])
|
||||
self.assertEqual(len(results), 0)
|
||||
|
||||
@freeze_time('2021-02-02')
|
||||
def test_consolidation_cron(self):
|
||||
self.patcher = patch('odoo.addons.gamification.models.gamification_karma_tracking.fields.Date', wraps=fields.Date)
|
||||
self.mock_datetime = self.startPatcher(self.patcher)
|
||||
self.mock_datetime.today.return_value = date(self.test_date.year, self.test_date.month + 1, self.test_date.day)
|
||||
Tracking = self.env['gamification.karma.tracking']
|
||||
|
||||
self._create_trackings(self.test_user, 20, 2, self.test_date, days_delta=30)
|
||||
self._create_trackings(self.test_user_2, 10, 20, self.test_date, days_delta=2)
|
||||
self.env['gamification.karma.tracking']._consolidate_last_month()
|
||||
consolidated = self.env['gamification.karma.tracking'].search([
|
||||
('user_id', 'in', (self.test_user | self.test_user_2).ids),
|
||||
('consolidated', '=', True),
|
||||
('tracking_date', '=', self.test_date)
|
||||
# Sanity check
|
||||
self.assertFalse(Tracking.search_count([('user_id', 'in', (self.test_user | self.test_user_2).ids)]))
|
||||
|
||||
test_date = datetime(2020, 12, 15)
|
||||
first_day_of_test_date_month = '2020-12-01'
|
||||
first_day_of_test_date_next_month = '2021-01-01'
|
||||
|
||||
self._create_trackings(self.test_user, karma=20, steps=2, track_date=test_date, days_delta=30)
|
||||
self._create_trackings(self.test_user_2, karma=10, steps=20, track_date=test_date, days_delta=2)
|
||||
|
||||
# Sanity check
|
||||
self.assertEqual(Tracking.search_count([('user_id', '=', self.test_user.id)]), 2)
|
||||
self.assertEqual(Tracking.search_count([('user_id', '=', self.test_user_2.id)]), 20)
|
||||
self.assertEqual(self.test_user.karma, 40)
|
||||
self.assertEqual(self.test_user_2.karma, 200)
|
||||
|
||||
with self.assertQueryCount(7), patch.object(self.registry['res.users'], 'write') as patched_user_write:
|
||||
Tracking._consolidate_cron()
|
||||
|
||||
# consolidation should not change user karma
|
||||
self.assertFalse(patched_user_write.called, "User karma didn't change during consolidation, it should not be updated")
|
||||
self.assertEqual(self.test_user.karma, 40)
|
||||
self.assertEqual(self.test_user_2.karma, 200)
|
||||
|
||||
consolidated_1 = Tracking.search([
|
||||
('user_id', '=', self.test_user.id),
|
||||
('tracking_date', '>=', first_day_of_test_date_month),
|
||||
('tracking_date', '<', first_day_of_test_date_next_month),
|
||||
])
|
||||
self.assertEqual(len(consolidated), 2)
|
||||
unconsolidated = self.env['gamification.karma.tracking'].search([
|
||||
('user_id', 'in', (self.test_user | self.test_user_2).ids),
|
||||
self.assertEqual(len(consolidated_1), 1)
|
||||
self.assertTrue(consolidated_1.consolidated)
|
||||
self.assertEqual(consolidated_1.old_value, 0)
|
||||
self.assertEqual(consolidated_1.new_value, 20)
|
||||
self.assertEqual(consolidated_1.reason, 'Consolidation from 2020-12-01 to 2020-12-31')
|
||||
|
||||
consolidated_2 = Tracking.search([
|
||||
('user_id', '=', self.test_user_2.id),
|
||||
('tracking_date', '>=', first_day_of_test_date_month),
|
||||
('tracking_date', '<', first_day_of_test_date_next_month),
|
||||
])
|
||||
self.assertEqual(len(consolidated_2), 1)
|
||||
self.assertTrue(consolidated_2.consolidated)
|
||||
self.assertEqual(consolidated_2.old_value, 0)
|
||||
self.assertEqual(consolidated_2.new_value, 10 * 9) # 9 records have been consolidated
|
||||
self.assertEqual(consolidated_2.reason, 'Consolidation from 2020-12-01 to 2020-12-31')
|
||||
|
||||
unconsolidated_1 = Tracking.search_count([
|
||||
('user_id', '=', self.test_user.id),
|
||||
('consolidated', '=', False),
|
||||
])
|
||||
self.assertEqual(len(unconsolidated), 6) # 5 for test user 2, 1 for test user
|
||||
self.assertEqual(unconsolidated_1, 1)
|
||||
|
||||
unconsolidated_2 = Tracking.search_count([
|
||||
('user_id', '=', self.test_user_2.id),
|
||||
('consolidated', '=', False),
|
||||
])
|
||||
self.assertEqual(unconsolidated_2, 11)
|
||||
|
||||
def test_consolidation_monthly(self):
|
||||
Tracking = self.env['gamification.karma.tracking']
|
||||
|
|
@ -107,11 +153,12 @@ class TestKarmaTrackingCommon(common.TransactionCase):
|
|||
Tracking._process_consolidate(self.test_date)
|
||||
consolidated = Tracking.search([
|
||||
('user_id', '=', self.test_user_2.id),
|
||||
('consolidated', '=', True),
|
||||
('tracking_date', '=', self.test_date)
|
||||
('tracking_date', '>=', self.first_day_of_test_date_month),
|
||||
('tracking_date', '<', self.first_day_of_test_date_next_month),
|
||||
])
|
||||
self.assertEqual(len(consolidated), 1)
|
||||
self.assertEqual(consolidated.old_value, base_test_user_2_karma) # 15 2-days span, from 1 to 29 included = 15 steps -> 150 karma
|
||||
self.assertTrue(consolidated.consolidated)
|
||||
self.assertEqual(consolidated.old_value, base_test_user_2_karma)
|
||||
self.assertEqual(consolidated.new_value, base_test_user_2_karma + 150) # 15 2-days span, from 1 to 29 included = 15 steps -> 150 karma
|
||||
|
||||
remaining = Tracking.search([
|
||||
|
|
@ -130,7 +177,7 @@ class TestKarmaTrackingCommon(common.TransactionCase):
|
|||
self.assertEqual(len(consolidated), 2)
|
||||
self.assertEqual(consolidated[0].new_value, base_test_user_2_karma + 200) # 5 remaining 2-days span, from 1 to 9 included = 5 steps -> 50 karma
|
||||
self.assertEqual(consolidated[0].old_value, base_test_user_2_karma + 150) # coming from previous iteration
|
||||
self.assertEqual(consolidated[0].tracking_date, self.test_date + relativedelta(months=1)) # tracking set at beginning of month
|
||||
self.assertEqual(consolidated[0].tracking_date.date(), self.test_date.date() + relativedelta(months=1)) # tracking set at beginning of month
|
||||
self.assertEqual(consolidated[-1].new_value, base_test_user_2_karma + 150) # previously created one still present
|
||||
self.assertEqual(consolidated[-1].old_value, base_test_user_2_karma) # previously created one still present
|
||||
|
||||
|
|
@ -149,7 +196,7 @@ class TestKarmaTrackingCommon(common.TransactionCase):
|
|||
self.assertEqual(current_user_trackings[-1].old_value, base_test_user_karma)
|
||||
|
||||
def test_user_as_erp_manager(self):
|
||||
self.test_user.write({'groups_id': [
|
||||
self.test_user.write({'group_ids': [
|
||||
(4, self.env.ref('base.group_partner_manager').id),
|
||||
(4, self.env.ref('base.group_erp_manager').id)
|
||||
]})
|
||||
|
|
@ -160,14 +207,20 @@ class TestKarmaTrackingCommon(common.TransactionCase):
|
|||
with self.assertRaises(exceptions.AccessError):
|
||||
user.read(['karma_tracking_ids'])
|
||||
|
||||
user.write({'karma': 60})
|
||||
user.add_karma(10)
|
||||
user._add_karma(38, source=self.test_user_2)
|
||||
self.assertEqual(user.karma, 70)
|
||||
trackings = self.env['gamification.karma.tracking'].sudo().search([('user_id', '=', user.id)])
|
||||
self.assertEqual(len(trackings), 3) # create + write + add_karma
|
||||
trackings = self.env['gamification.karma.tracking'].sudo().search(
|
||||
[('user_id', '=', user.id)], order="create_date ASC, id ASC")
|
||||
self.assertEqual(len(trackings), 2) # create + add_karma
|
||||
self.assertEqual(trackings[0].origin_ref, self.test_user)
|
||||
self.assertEqual(trackings[0].reason, "User Creation (Test User #%i)" % self.test_user.id)
|
||||
self.assertEqual(trackings[1].origin_ref, self.test_user_2)
|
||||
self.assertIn("Add Manually", trackings[1].reason)
|
||||
self.assertIn(self.test_user_2.display_name, trackings[1].reason)
|
||||
self.assertIn(str(self.test_user_2.id), trackings[1].reason)
|
||||
|
||||
def test_user_tracking(self):
|
||||
self.test_user.write({'groups_id': [
|
||||
self.test_user.write({'group_ids': [
|
||||
(4, self.env.ref('base.group_partner_manager').id),
|
||||
(4, self.env.ref('base.group_system').id)
|
||||
]})
|
||||
|
|
@ -180,17 +233,61 @@ class TestKarmaTrackingCommon(common.TransactionCase):
|
|||
self.assertEqual(user.karma_tracking_ids.old_value, 0)
|
||||
self.assertEqual(user.karma_tracking_ids.new_value, 32)
|
||||
|
||||
user.write({'karma': 60})
|
||||
user.add_karma(10)
|
||||
user._add_karma(38)
|
||||
self.assertEqual(user.karma, 70)
|
||||
self.assertEqual(len(user.karma_tracking_ids), 3)
|
||||
self.assertEqual(user.karma_tracking_ids[2].old_value, 60)
|
||||
self.assertEqual(user.karma_tracking_ids[2].new_value, 70)
|
||||
self.assertEqual(len(user.karma_tracking_ids), 2)
|
||||
self.assertEqual(user.karma_tracking_ids[1].old_value, 32)
|
||||
self.assertEqual(user.karma_tracking_ids[1].new_value, 60)
|
||||
self.assertEqual(user.karma_tracking_ids[1].new_value, 70)
|
||||
self.assertIn(_('Add Manually'), user.karma_tracking_ids[1].reason)
|
||||
self.assertIn(self.test_user.display_name, user.karma_tracking_ids[1].reason)
|
||||
self.assertIn(str(self.test_user.id), user.karma_tracking_ids[1].reason)
|
||||
self.assertEqual(user.karma_tracking_ids[0].old_value, 0)
|
||||
self.assertEqual(user.karma_tracking_ids[0].new_value, 32)
|
||||
|
||||
user._add_karma(69, user, _('Test Reason'))
|
||||
self.assertEqual(len(user.karma_tracking_ids), 3)
|
||||
self.assertIn(_('Test Reason'), user.karma_tracking_ids[2].reason)
|
||||
self.assertEqual(user.karma, 139)
|
||||
|
||||
# add manually karma to a user (e.g. from the technical view)
|
||||
tracking = self.env['gamification.karma.tracking'].create({
|
||||
'user_id': user.id,
|
||||
'new_value': 150,
|
||||
'consolidated': False,
|
||||
})
|
||||
self.assertEqual(tracking.old_value, 139)
|
||||
self.assertEqual(tracking.gain, 11)
|
||||
self.assertEqual(user.karma, 150)
|
||||
|
||||
# write directly on the karma field, should generate <gamification.karma.tracking>
|
||||
self.test_user_2.karma = 100 # won't change
|
||||
last_tracking_3 = self.test_user_2.karma_tracking_ids[-1]
|
||||
|
||||
users = (user | self.test_user | self.test_user_2).with_user(self.test_user)
|
||||
with self.assertQueryCount(8):
|
||||
users.karma = 100
|
||||
|
||||
tracking_1 = user.karma_tracking_ids[-1]
|
||||
tracking_2 = self.test_user.karma_tracking_ids[-1]
|
||||
tracking_3 = self.test_user_2.karma_tracking_ids[-1]
|
||||
|
||||
self.assertEqual(user.karma, 100)
|
||||
self.assertEqual(self.test_user.karma, 100)
|
||||
self.assertEqual(tracking_1.new_value, 100)
|
||||
self.assertEqual(tracking_1.old_value, 150)
|
||||
self.assertEqual(tracking_1.gain, -50)
|
||||
self.assertEqual(tracking_1.reason, "Add Manually (Test User #%i)" % self.test_user.id)
|
||||
self.assertEqual(tracking_1.origin_ref, self.test_user)
|
||||
self.assertEqual(tracking_2.new_value, 100)
|
||||
self.assertEqual(tracking_2.old_value, 0)
|
||||
self.assertEqual(tracking_2.gain, 100)
|
||||
self.assertEqual(tracking_2.reason, "Add Manually (Test User #%i)" % self.test_user.id)
|
||||
self.assertEqual(tracking_2.origin_ref, self.test_user)
|
||||
self.assertEqual(last_tracking_3, tracking_3, "Shouldn't have created a new tracking for the third user")
|
||||
self.assertEqual(tracking_3.new_value, 100)
|
||||
self.assertEqual(tracking_3.old_value, 0)
|
||||
self.assertEqual(tracking_3.gain, 100)
|
||||
|
||||
|
||||
class TestComputeRankCommon(common.TransactionCase):
|
||||
|
||||
|
|
@ -286,7 +383,7 @@ class TestComputeRankCommon(common.TransactionCase):
|
|||
nonlocal number_of_users
|
||||
number_of_users = len(_self & self.users)
|
||||
|
||||
patch_bulk = patch('odoo.addons.gamification.models.res_users.Users._recompute_rank', _patched_recompute_rank)
|
||||
patch_bulk = patch('odoo.addons.gamification.models.res_users.ResUsers._recompute_rank', _patched_recompute_rank)
|
||||
self.startPatcher(patch_bulk)
|
||||
self.rank_3.karma_min = 700
|
||||
self.assertEqual(number_of_users, 7, "Should just recompute for the 7 users between 500 and 700")
|
||||
|
|
@ -297,7 +394,7 @@ class TestComputeRankCommon(common.TransactionCase):
|
|||
def _patched_check_in_bulk(*args, **kwargs):
|
||||
raise
|
||||
|
||||
patch_bulk = patch('odoo.addons.gamification.models.res_users.Users._recompute_rank_bulk', _patched_check_in_bulk)
|
||||
patch_bulk = patch('odoo.addons.gamification.models.res_users.ResUsers._recompute_rank_bulk', _patched_check_in_bulk)
|
||||
self.startPatcher(patch_bulk)
|
||||
|
||||
# call on 5 users should not trigger the bulk function
|
||||
|
|
@ -307,3 +404,19 @@ class TestComputeRankCommon(common.TransactionCase):
|
|||
with self.assertRaises(Exception):
|
||||
self.users[0:50]._recompute_rank()
|
||||
|
||||
def test_get_next_rank(self):
|
||||
""" Test the computation of the next user rank.
|
||||
|
||||
The test is based on the users and ranks defined in the setup ("|" represents rank switches (karma_min)):
|
||||
(user idx, user karma): (0, -1) | (1, 25)...(8, 235) | (9, 265)...(16, 475) | (17, 505)...(33, 985) | (34, 1015)
|
||||
"""
|
||||
# user idx, karma:
|
||||
for user, expected_next_rank in chain(
|
||||
((self.users[0], self.rank_1),),
|
||||
zip(self.users[1:8], repeat(self.rank_2)),
|
||||
zip(self.users[9:16], repeat(self.rank_3)),
|
||||
zip(self.users[17:33], repeat(self.rank_4)),
|
||||
((self.users[34], self.env['gamification.karma.rank']),),
|
||||
):
|
||||
user.next_rank_id = False # Force the computation of the next rank
|
||||
self.assertEqual(user._get_next_rank(), expected_next_rank)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue