the racalc cronjob reports erronous partly recalculations now. A lot of code cleanups
104 lines
3.7 KiB
Python
104 lines
3.7 KiB
Python
"""
|
|
This file demonstrates writing tests using the unittest module. These will pass
|
|
when you run "manage.py test".
|
|
|
|
Replace this with more appropriate tests for your application.
|
|
"""
|
|
import random
|
|
|
|
from django.test import TestCase
|
|
from mahjong_ranking.models import Hanchan, KyuDanRanking
|
|
|
|
|
|
class KyuDanTest(TestCase):
|
|
"""
|
|
Unittest to check if the hanchan calculation works against the rulebook.
|
|
"""
|
|
equal_attrs = ('dan', 'dan_points', 'kyu', 'kyu_points', 'good_hanchans',
|
|
'won_hanchans', 'hanchan_count')
|
|
|
|
fixtures = [
|
|
'test_membership.json',
|
|
'test_events.json',
|
|
'test_hanchans.json',
|
|
'test_event_rankings.json',
|
|
'test_kyu_dan_rankings.json'
|
|
]
|
|
|
|
def _test_recalc(self):
|
|
"""
|
|
Test if a Kyu/Dan Ranking recalculation gives the same result as stored.
|
|
|
|
:return:
|
|
"""
|
|
|
|
for ranking in KyuDanRanking.objects.all():
|
|
original = {a: getattr(ranking, a) for a in self.equal_attrs}
|
|
ranking.recalculate()
|
|
for attr in self.equal_attrs:
|
|
self.assertEqual(
|
|
original[attr],
|
|
getattr(ranking, attr),
|
|
"Recalculation was different! user: {user}, attribute: "
|
|
"{attr}, original: {original}, recalc: {recalc}".format(
|
|
user=ranking.user, attr=attr, original=original[attr],
|
|
recalc=getattr(ranking, attr))
|
|
)
|
|
|
|
def test_partial_recalc(self):
|
|
"""
|
|
Test if partial recalclulation gives the same results.
|
|
|
|
:return:
|
|
"""
|
|
|
|
for ranking in KyuDanRanking.objects.all():
|
|
original = {a: getattr(ranking, a) for a in self.equal_attrs}
|
|
confirmed_hanchans = Hanchan.objects.confirmed_hanchans(
|
|
user=ranking.user,
|
|
since=ranking.legacy_date
|
|
)
|
|
if not confirmed_hanchans.count():
|
|
continue
|
|
rnd = random.randrange(confirmed_hanchans.count())
|
|
since = confirmed_hanchans[rnd].start
|
|
ranking.recalculate(hanchan_start=since)
|
|
for attr in self.equal_attrs:
|
|
self.assertEqual(
|
|
original[attr],
|
|
getattr(ranking, attr),
|
|
"partial Recalculation was different! user: {user}, "
|
|
"attribute: {attr}, original: {original}, recalc: "
|
|
"{recalc}".format(
|
|
user=ranking.user, attr=attr, original=original[attr],
|
|
recalc=getattr(ranking, attr))
|
|
)
|
|
|
|
def test_points_sum(self):
|
|
"""
|
|
Test if the sum of the kyu / dan points equals the value in the Ranking.
|
|
|
|
:return: None
|
|
"""
|
|
for ranking in KyuDanRanking.objects.all():
|
|
dan_kyu = 'dan_points' if ranking.dan else 'kyu_points'
|
|
points = {
|
|
'dan_points': ranking.legacy_dan_points or 0,
|
|
'kyu_points': ranking.legacy_kyu_points or 0
|
|
}
|
|
confirmed_hanchans = Hanchan.objects.confirmed_hanchans(
|
|
user=ranking.user,
|
|
since=ranking.legacy_date
|
|
)
|
|
for hanchan in confirmed_hanchans:
|
|
hanchan.get_playerdata(ranking.user)
|
|
points[dan_kyu] += getattr(hanchan, dan_kyu) or 0
|
|
|
|
self.assertEqual(
|
|
points[dan_kyu],
|
|
getattr(ranking, dan_kyu),
|
|
"{dan_kyu} for {player} won't compute! ranking: {ranking}, sum: {sum}".format(
|
|
dan_kyu=dan_kyu, player=ranking.user,
|
|
ranking=getattr(ranking, dan_kyu), sum=points[dan_kyu])
|
|
)
|