from __future__ import annotations from datetime import datetime from datetime import timedelta from django.test import TestCase from django.utils import timezone from twitch.models import Channel from twitch.models import ChatBadgeSet from twitch.models import DropBenefit from twitch.models import DropCampaign from twitch.models import Game from twitch.models import Organization from twitch.models import RewardCampaign from twitch.models import TimeBasedDrop from twitch.sitemaps import TwitchSitemapGenerator class StaticViewSitemapLastModTests(TestCase): """Tests for StaticViewSitemap lastmod method.""" def setUp(self) -> None: """Set up StaticViewSitemap instance for testing.""" self.sitemap = TwitchSitemapGenerator() def test_search_is_none(self) -> None: """Test that lastmod for search sitemap item is None.""" assert self.sitemap.lastmod("twitch:search") is None def test_campaigns_latest(self) -> None: """Test that lastmod for campaign list sitemap item reflects latest updated_at among DropCampaigns.""" game: Game = Game.objects.create(twitch_id="g1") older: datetime = timezone.now() - timedelta(days=2) newer: datetime = timezone.now() - timedelta(days=1) c1: DropCampaign = DropCampaign.objects.create(twitch_id="dc1", name="c1", game=game) c2: DropCampaign = DropCampaign.objects.create(twitch_id="dc2", name="c2", game=game) DropCampaign.objects.filter(pk=c1.pk).update(updated_at=older) DropCampaign.objects.filter(pk=c2.pk).update(updated_at=newer) assert self.sitemap.lastmod("twitch:campaign_list") == newer assert self.sitemap.lastmod("twitch:dashboard") == newer def test_reward_campaigns_latest(self) -> None: """Test that lastmod for reward campaign list sitemap item reflects latest updated_at among RewardCampaigns.""" older: datetime = timezone.now() - timedelta(days=3) newer: datetime = timezone.now() - timedelta(days=1) r1: RewardCampaign = RewardCampaign.objects.create(twitch_id="r1", name="r1") r2: RewardCampaign = RewardCampaign.objects.create(twitch_id="r2", name="r2") RewardCampaign.objects.filter(pk=r1.pk).update(updated_at=older) RewardCampaign.objects.filter(pk=r2.pk).update(updated_at=newer) assert self.sitemap.lastmod("twitch:reward_campaign_list") == newer def test_games_latest(self) -> None: """Test that lastmod for games grid sitemap item reflects latest updated_at among Games.""" older: datetime = timezone.now() - timedelta(days=4) newer: datetime = timezone.now() - timedelta(days=1) g1: Game = Game.objects.create(twitch_id="g2") g2: Game = Game.objects.create(twitch_id="g3") Game.objects.filter(pk=g1.pk).update(updated_at=older) Game.objects.filter(pk=g2.pk).update(updated_at=newer) assert self.sitemap.lastmod("twitch:games_grid") == newer def test_orgs_latest(self) -> None: """Test that lastmod for org list sitemap item reflects latest updated_at among Organizations.""" older: datetime = timezone.now() - timedelta(days=5) newer: datetime = timezone.now() - timedelta(days=1) o1: Organization = Organization.objects.create(twitch_id="o1", name="Org1") o2: Organization = Organization.objects.create(twitch_id="o2", name="Org2") Organization.objects.filter(pk=o1.pk).update(updated_at=older) Organization.objects.filter(pk=o2.pk).update(updated_at=newer) assert self.sitemap.lastmod("twitch:org_list") == newer def test_channel_list_none(self) -> None: """Test that lastmod for channel list sitemap item is None since Channel doesn't have updated_at.""" Channel.objects.create(twitch_id="ch1", name="n1", display_name="D1") assert self.sitemap.lastmod("twitch:channel_list") is None def test_badge_list_latest(self) -> None: """Test that lastmod for badge list sitemap item reflects latest updated_at among ChatBadgeSets.""" older: datetime = timezone.now() - timedelta(days=6) newer: datetime = timezone.now() - timedelta(days=1) b1: ChatBadgeSet = ChatBadgeSet.objects.create(set_id="s1") b2: ChatBadgeSet = ChatBadgeSet.objects.create(set_id="s2") ChatBadgeSet.objects.filter(pk=b1.pk).update(updated_at=older) ChatBadgeSet.objects.filter(pk=b2.pk).update(updated_at=newer) assert self.sitemap.lastmod("twitch:badge_list") == newer def test_emote_gallery_uses_campaign_updated(self) -> None: """Test that lastmod for emote gallery sitemap item reflects latest updated_at among DropCampaigns associated with emote benefits.""" # noqa: E501 game: Game = Game.objects.create(twitch_id="g_emote") campaign: DropCampaign = DropCampaign.objects.create(twitch_id="dc_emote", name="em", game=game) benefit: DropBenefit = DropBenefit.objects.create( twitch_id="b_emote", distribution_type="EMOTE", image_asset_url="http://example.com/e.png", ) drop: TimeBasedDrop = TimeBasedDrop.objects.create(twitch_id="tbd_emote", name="drop1", campaign=campaign) drop.benefits.add(benefit) newer: datetime = timezone.now() - timedelta(hours=1) DropCampaign.objects.filter(pk=campaign.pk).update(updated_at=newer) assert self.sitemap.lastmod("twitch:emote_gallery") == newer