from datetime import timedelta from django.test import TestCase from django.utils import timezone from labs.models import ( User, UserCreditSummary, UserCreditDetail, CreditTransaction, ) from labs.billing.user import ( INITIAL_FREE_CREDITS_AMOUNT, INITIAL_FREE_CREDITS_EXPIRES_IN_DAYS, ) from labs.billing.utils import round_to_end_of_day class TestBillingUser(TestCase): def test_init_user_credit_record(self): user = User.objects.create_user(email="test@test.com") user_credit_summary = UserCreditSummary.objects.get(user=user) self.assertEqual(user_credit_summary.free_credits, INITIAL_FREE_CREDITS_AMOUNT) self.assertEqual(user_credit_summary.paid_credits, 0) self.assertEqual(UserCreditDetail.objects.filter(user=user).count(), 2) paid_credit_detail = UserCreditDetail.objects.get( user=user, credit_type=UserCreditDetail.CreditType.PAID ) self.assertEqual(paid_credit_detail.amount, 0) free_credit_detail = UserCreditDetail.objects.get( user=user, credit_type=UserCreditDetail.CreditType.FREE ) self.assertEqual(free_credit_detail.amount, INITIAL_FREE_CREDITS_AMOUNT) self.assertEqual(free_credit_detail.initial_amount, INITIAL_FREE_CREDITS_AMOUNT) self.assertEqual( free_credit_detail.expires_at, round_to_end_of_day( timezone.now() + timedelta(days=INITIAL_FREE_CREDITS_EXPIRES_IN_DAYS) ), ) transaction = CreditTransaction.objects.get(user=user) self.assertEqual( transaction.transaction_type, CreditTransaction.TransactionType.BONUS ) self.assertEqual(transaction.paid_credits, 0) self.assertEqual(transaction.free_credits, INITIAL_FREE_CREDITS_AMOUNT)