from datetime import timedelta from rest_framework import status from rest_framework.test import APITestCase from django.test.utils import override_settings from django.utils import timezone from pingcap_sso.models import ( User, PointDailyCheckIn, UserAwardedPoint ) @override_settings( SMS_BACKEND='sms.backends.dummy.SmsBackend', TRUSTED_HOSTS=['tidb.io'], # Just for disable django-rest-framework's throttle CACHES={ 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', } } ) class PointCheckInTest(APITestCase): CHECKIN_PATH = '/api/points/daily-checkin' def setUp(self): self.user1 = User( username=User.generate_random_username(), company_name='company_name', phone='13666666666', email='user1@mail.com', ) self.user1.save() self.user2 = User( username=User.generate_random_username(), company_name='company_name', phone='13666666667', email='user2@mail.com' ) self.user2.save() self.client.force_login(self.user1) self.today = timezone.localdate() def test_checkin_success(self): response = self.client.post(self.CHECKIN_PATH) self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals( response.data['data'], { 'continues_checkin_count': 1, 'points': 2, 'tomorrow_points': 3 } ) self.assertEquals( UserAwardedPoint.objects.filter( target_user=self.user1, points=2, experience=2, digest='连续签到 1 天', award_type=None, created_at__date=self.today ).count(), 1 ) self.assertEquals(self.user1.point_stat.points, 2) self.assertEquals(self.user1.point_stat.experience, 2) def test_checkin_confilct(self): response = self.client.post(self.CHECKIN_PATH) self.assertEquals(response.status_code, status.HTTP_200_OK) response = self.client.post(self.CHECKIN_PATH) self.assertEquals(response.status_code, status.HTTP_409_CONFLICT) self.assertEquals( UserAwardedPoint.objects.filter( target_user=self.user1, points=2, experience=2, digest='连续签到 1 天', award_type=None, created_at__date=self.today ).count(), 1 ) self.assertEquals(self.user1.point_stat.points, 2) self.assertEquals(self.user1.point_stat.experience, 2) def test_continues_checkin_2days(self): PointDailyCheckIn.objects.create( user=self.user1, date=(self.today - timedelta(days=1)) ) response = self.client.post(self.CHECKIN_PATH) self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals( response.data['data'], { 'continues_checkin_count': 2, 'points': 3, 'tomorrow_points': 5 } ) self.assertEquals( UserAwardedPoint.objects.filter( target_user=self.user1, points=3, experience=3, digest='连续签到 2 天', award_type=None, created_at__date=self.today ).count(), 1 ) self.assertEquals(self.user1.point_stat.points, 3) self.assertEquals(self.user1.point_stat.experience, 3) def test_continues_checkin_3days(self): PointDailyCheckIn.objects.create( user=self.user1, date=(self.today - timedelta(days=1)) ) PointDailyCheckIn.objects.create( user=self.user1, date=(self.today - timedelta(days=2)) ) response = self.client.post(self.CHECKIN_PATH) self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals( response.data['data'], { 'continues_checkin_count': 3, 'points': 5, 'tomorrow_points': 5 } ) self.assertEquals( UserAwardedPoint.objects.filter( target_user=self.user1, points=5, experience=5, digest='连续签到 3 天及以上', award_type=None, created_at__date=self.today ).count(), 1 ) self.assertEquals(self.user1.point_stat.points, 5) self.assertEquals(self.user1.point_stat.experience, 5) def test_continues_checkin_4days(self): PointDailyCheckIn.objects.create( user=self.user1, date=(self.today - timedelta(days=1)) ) PointDailyCheckIn.objects.create( user=self.user1, date=(self.today - timedelta(days=2)) ) PointDailyCheckIn.objects.create( user=self.user1, date=(self.today - timedelta(days=3)) ) response = self.client.post(self.CHECKIN_PATH) self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals( response.data['data'], { 'continues_checkin_count': 3, 'points': 5, 'tomorrow_points': 5 } ) self.assertEquals( UserAwardedPoint.objects.filter( target_user=self.user1, points=5, experience=5, digest='连续签到 3 天及以上', award_type=None, created_at__date=self.today ).count(), 1 ) self.assertEquals(self.user1.point_stat.points, 5) self.assertEquals(self.user1.point_stat.experience, 5) def test_not_continues_checink_2days(self): PointDailyCheckIn.objects.create( user=self.user1, date=(self.today - timedelta(days=2)) ) response = self.client.post(self.CHECKIN_PATH) self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals( response.data['data'], { 'continues_checkin_count': 1, 'points': 2, 'tomorrow_points': 3 } ) self.assertEquals( UserAwardedPoint.objects.filter( target_user=self.user1, points=2, experience=2, digest='连续签到 1 天', award_type=None, created_at__date=self.today ).count(), 1 ) self.assertEquals(self.user1.point_stat.points, 2) self.assertEquals(self.user1.point_stat.experience, 2)