import lxml.html from django.test import TestCase from django.urls import reverse from apps.applets.models import Applet, UserApplet from apps.lyric.models import User class GameboardViewTest(TestCase): def setUp(self): self.user = User.objects.create(email="gamer@test.io") self.client.force_login(self.user) Applet.objects.get_or_create(slug="new-game", defaults={"name": "New Game", "context": "gameboard"}) Applet.objects.get_or_create(slug="my-games", defaults={"name": "My Games", "context": "gameboard"}) Applet.objects.get_or_create(slug="game-kit", defaults={"name": "Game Kit", "context": "gameboard"}) response = self.client.get("/gameboard/") self.parsed = lxml.html.fromstring(response.content) def test_gameboard_requires_login(self): self.client.logout() response = self.client.get("/gameboard/") self.assertRedirects( response, "/?next=/gameboard/", fetch_redirect_response=False ) def test_gameboard_renders(self): response = self.client.get("/gameboard/") self.assertEqual(response.status_code, 200) def test_gameboard_shows_my_games_applet(self): [_] = self.parsed.cssselect("#id_applet_my_games") def test_gameboard_shows_new_game_applet(self): [_] = self.parsed.cssselect("#id_applet_new_game") def test_gameboard_shows_game_kit(self): [_] = self.parsed.cssselect("#id_game_kit") def test_gameboard_shows_game_gear(self): [_] = self.parsed.cssselect(".gear-btn") def test_my_games_has_no_game_items_for_new_user(self): game_items = self.parsed.cssselect("#id_applet_my_games .game-item") self.assertEqual(len(game_items), 0) def test_game_kit_has_coin_on_a_string(self): [_] = self.parsed.cssselect("#id_game_kit #id_kit_coin_on_a_string") def test_game_kit_has_free_token(self): [_] = self.parsed.cssselect("#id_game_kit #id_kit_free_token") def test_game_kit_has_card_deck_placeholder(self): [_] = self.parsed.cssselect("#id_game_kit #id_kit_card_deck") def test_game_kit_has_dice_set_placeholder(self): [_] = self.parsed.cssselect("#id_game_kit #id_kit_dice_set") class ToggleGameAppletsViewTest(TestCase): def setUp(self): self.user = User.objects.create(email="gamer@test.io") self.client.force_login(self.user) self.new_game, _ = Applet.objects.get_or_create( slug="new-game", defaults={"name": "New Game", "context": "gameboard"} ) self.my_games, _ = Applet.objects.get_or_create( slug="my-games", defaults={"name": "My Games", "context": "gameboard"} ) self.url = reverse("toggle_game_applets") def test_unauthenticated_user_is_redirected(self): self.client.logout() response = self.client.post(self.url) self.assertRedirects( response, f"/?next={self.url}", fetch_redirect_response=False ) def test_unchecked_applet_gets_user_applet_with_visible_false(self): self.client.post(self.url, {"applets": ["new-game"]}) ua = UserApplet.objects.get(user=self.user, applet=self.my_games) self.assertFalse(ua.visible) def test_redirects_on_normal_post(self): response = self.client.post(self.url, {"applets": ["new-game", "my-games"]}) self.assertRedirects( response, reverse("gameboard"), fetch_redirect_response=False ) def test_returns_200_on_htmx_post(self): response = self.client.post( self.url, {"applets": ["new-game", "my-games"]}, HTTP_HX_REQUEST="true", ) self.assertEqual(response.status_code, 200) def test_does_not_affect_dash_applets(self): dash_applet, _ = Applet.objects.get_or_create( slug="username", defaults={"name": "Username", "context": "dashboard"} ) self.client.post(self.url, {"applets": ["new-game", "my-games"]}) self.assertFalse(UserApplet.objects.filter(user=self.user, applet=dash_applet).exists())