Files
offline-db/users/tests/test_speedster_badge.py
google-labs-jules[bot]andbarkeser2002 5e5f8edded fix: Reach 100% test coverage for badge_system.py
- Remove unused `get_anime_ids` helper in GenreBadgeStrategy to improve test coverage
- Resolve migration conflicts related to `UsernameValidator` and `validate_mime_type` that caused test database setup errors
- Add missing comprehensive unit tests for cache hits/misses, remaining strategies, and abstract base cases
- Fix cache logic interference in concurrent tests
- Hit 100% test coverage on users/badge_system.py as requested in development plan

Co-authored-by: barkeser2002 <45911502+barkeser2002@users.noreply.github.com>
2026-04-19 21:10:22 +00:00

88 lines
3.5 KiB
Python

from django.core.cache import cache
from django.test import TestCase
from django.utils import timezone
from datetime import timedelta
from users.models import User, Badge, UserBadge, WatchLog
from content.models import Anime, Season, Episode
from users.services import check_badges
class SpeedsterBadgeTest(TestCase):
def setUp(self):
self.user = User.objects.create_user(username='testuser', password='password')
self.badge, _ = Badge.objects.get_or_create(slug='speedster', defaults={'name': 'Speedster', 'description': 'Test'})
# Setup content
self.anime = Anime.objects.create(title='Test Anime')
self.season = Season.objects.create(anime=self.anime, number=1)
self.episodes = []
for i in range(5):
self.episodes.append(Episode.objects.create(season=self.season, number=i+1, title=f"Ep {i+1}"))
def test_award_badge(self):
# Watch 3 episodes within last hour
now = timezone.now()
w1 = WatchLog.objects.create(user=self.user, episode=self.episodes[0], duration=100)
w1.watched_at = now - timedelta(minutes=50)
w1.save()
w2 = WatchLog.objects.create(user=self.user, episode=self.episodes[1], duration=100)
w2.watched_at = now - timedelta(minutes=30)
w2.save()
w3 = WatchLog.objects.create(user=self.user, episode=self.episodes[2], duration=100)
w3.watched_at = now - timedelta(minutes=10)
w3.save()
cache.delete(f'user_{self.user.id}_badges_checked')
check_badges(self.user)
self.assertTrue(UserBadge.objects.filter(user=self.user, badge=self.badge).exists())
def test_no_badge_if_less_than_3(self):
now = timezone.now()
w1 = WatchLog.objects.create(user=self.user, episode=self.episodes[0], duration=100)
w1.watched_at = now - timedelta(minutes=30)
w1.save()
w2 = WatchLog.objects.create(user=self.user, episode=self.episodes[1], duration=100)
w2.watched_at = now - timedelta(minutes=10)
w2.save()
cache.delete(f'user_{self.user.id}_badges_checked')
check_badges(self.user)
self.assertFalse(UserBadge.objects.filter(user=self.user, badge=self.badge).exists())
def test_no_badge_if_time_span_too_long(self):
# 3 episodes, but over > 1 hour
now = timezone.now()
w1 = WatchLog.objects.create(user=self.user, episode=self.episodes[0], duration=100)
w1.watched_at = now - timedelta(minutes=120) # 2 hours ago
w1.save()
w2 = WatchLog.objects.create(user=self.user, episode=self.episodes[1], duration=100)
w2.watched_at = now - timedelta(minutes=30)
w2.save()
w3 = WatchLog.objects.create(user=self.user, episode=self.episodes[2], duration=100)
w3.watched_at = now - timedelta(minutes=10)
w3.save()
# Only 2 in last hour
cache.delete(f'user_{self.user.id}_badges_checked')
check_badges(self.user)
self.assertFalse(UserBadge.objects.filter(user=self.user, badge=self.badge).exists())
def test_distinct_episodes_required(self):
# Watch same episode 3 times in 1 hour
now = timezone.now()
for i in range(3):
w = WatchLog.objects.create(user=self.user, episode=self.episodes[0], duration=100)
w.watched_at = now - timedelta(minutes=10*i)
w.save()
cache.delete(f'user_{self.user.id}_badges_checked')
check_badges(self.user)
self.assertFalse(UserBadge.objects.filter(user=self.user, badge=self.badge).exists())