2026-03-08 15:14:41 -04:00
|
|
|
import lxml.html
|
|
|
|
|
|
2026-03-12 14:23:09 -04:00
|
|
|
from django.test import TestCase
|
2026-03-08 15:14:41 -04:00
|
|
|
|
2026-03-11 00:58:24 -04:00
|
|
|
from apps.applets.models import Applet, UserApplet
|
2026-03-08 15:14:41 -04:00
|
|
|
from apps.lyric.models import Token, User, Wallet
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WalletViewTest(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.user = User.objects.create(email="capman@test.io")
|
|
|
|
|
self.client.force_login(self.user)
|
|
|
|
|
response = self.client.get("/dashboard/wallet/")
|
|
|
|
|
self.parsed = lxml.html.fromstring(response.content)
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_requires_login(self):
|
|
|
|
|
self.client.logout()
|
|
|
|
|
response = self.client.get("/dashboard/wallet/")
|
|
|
|
|
self.assertRedirects(
|
|
|
|
|
response, "/?next=/dashboard/wallet/", fetch_redirect_response=False
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_renders(self):
|
|
|
|
|
[el] = self.parsed.cssselect("#id_writs_balance")
|
|
|
|
|
self.assertEqual(el.text_content().strip(), "144")
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_shows_esteem_balance(self):
|
|
|
|
|
[el] = self.parsed.cssselect("#id_esteem_balance")
|
|
|
|
|
self.assertEqual(el.text_content().strip(), "0")
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_shows_coin_on_a_string(self):
|
|
|
|
|
[_] = self.parsed.cssselect("#id_coin_on_a_string")
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_shows_free_token(self):
|
|
|
|
|
[_] = self.parsed.cssselect("#id_free_token_0")
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_shows_payment_methods_section(self):
|
|
|
|
|
[_] = self.parsed.cssselect("#id_add_payment_method")
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_shows_stripe_payment_element(self):
|
|
|
|
|
[_] = self.parsed.cssselect("#id_stripe_payment_element")
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_shows_tithe_token_shop(self):
|
|
|
|
|
[_] = self.parsed.cssselect("#id_tithe_token_shop")
|
|
|
|
|
|
|
|
|
|
def test_tithe_token_shop_shows_bundle(self):
|
|
|
|
|
bundles = self.parsed.cssselect("#id_tithe_token_shop .token-bundle")
|
|
|
|
|
self.assertGreater(len(bundles), 0)
|
|
|
|
|
|
2026-03-11 00:58:24 -04:00
|
|
|
|
|
|
|
|
class WalletViewAppletContextTest(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.user = User.objects.create(email="walletctx@test.io")
|
|
|
|
|
Applet.objects.get_or_create(
|
|
|
|
|
slug="wallet-balances",
|
|
|
|
|
defaults={"name": "Wallet Balances", "grid_cols": 3, "grid_rows": 3, "context": "wallet"},
|
|
|
|
|
)
|
|
|
|
|
Applet.objects.get_or_create(
|
|
|
|
|
slug="wallet-tokens",
|
|
|
|
|
defaults={"name": "Wallet Tokens", "grid_cols": 3, "grid_rows": 3, "context": "wallet"},
|
|
|
|
|
)
|
|
|
|
|
Applet.objects.get_or_create(
|
|
|
|
|
slug="wallet-payment",
|
|
|
|
|
defaults={"name": "Payment Methods", "grid_cols": 6, "grid_rows": 2, "context": "wallet"},
|
|
|
|
|
)
|
|
|
|
|
self.client.force_login(self.user)
|
|
|
|
|
|
|
|
|
|
def test_wallet_view_passes_applets_context(self):
|
|
|
|
|
response = self.client.get("/dashboard/wallet/")
|
|
|
|
|
slugs = [e["applet"].slug for e in response.context["applets"]]
|
|
|
|
|
self.assertIn("wallet-balances", slugs)
|
|
|
|
|
self.assertIn("wallet-tokens", slugs)
|
|
|
|
|
self.assertIn("wallet-payment", slugs)
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_renders_applets_container(self):
|
|
|
|
|
response = self.client.get("/dashboard/wallet/")
|
|
|
|
|
parsed = lxml.html.fromstring(response.content)
|
|
|
|
|
[_] = parsed.cssselect("#id_wallet_applets_container")
|
|
|
|
|
|
|
|
|
|
def test_wallet_page_renders_gear_button(self):
|
|
|
|
|
response = self.client.get("/dashboard/wallet/")
|
|
|
|
|
parsed = lxml.html.fromstring(response.content)
|
|
|
|
|
[_] = parsed.cssselect(".gear-btn")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ToggleWalletAppletsTest(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.user = User.objects.create(email="wallettoggle@test.io")
|
|
|
|
|
self.balances = Applet.objects.get_or_create(
|
|
|
|
|
slug="wallet-balances",
|
|
|
|
|
defaults={"name": "Wallet Balances", "grid_cols": 3, "grid_rows": 3, "context": "wallet"},
|
|
|
|
|
)[0]
|
|
|
|
|
self.tokens = Applet.objects.get_or_create(
|
|
|
|
|
slug="wallet-tokens",
|
|
|
|
|
defaults={"name": "Wallet Tokens", "grid_cols": 3, "grid_rows": 3, "context": "wallet"},
|
|
|
|
|
)[0]
|
|
|
|
|
Applet.objects.get_or_create(
|
|
|
|
|
slug="wallet-payment",
|
|
|
|
|
defaults={"name": "Payment Methods", "grid_cols": 6, "grid_rows": 2, "context": "wallet"},
|
|
|
|
|
)
|
|
|
|
|
self.client.force_login(self.user)
|
|
|
|
|
|
|
|
|
|
def test_toggle_requires_login(self):
|
|
|
|
|
self.client.logout()
|
|
|
|
|
response = self.client.post("/dashboard/wallet/toggle-applets", {})
|
|
|
|
|
self.assertRedirects(
|
|
|
|
|
response, "/?next=/dashboard/wallet/toggle-applets",
|
|
|
|
|
fetch_redirect_response=False,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_toggle_redirects_to_wallet(self):
|
|
|
|
|
response = self.client.post(
|
|
|
|
|
"/dashboard/wallet/toggle-applets", {"applets": ["wallet-balances"]}
|
|
|
|
|
)
|
|
|
|
|
self.assertRedirects(response, "/dashboard/wallet/", fetch_redirect_response=False)
|
|
|
|
|
|
|
|
|
|
def test_toggle_hides_unchecked_applet(self):
|
|
|
|
|
self.client.post(
|
|
|
|
|
"/dashboard/wallet/toggle-applets", {"applets": ["wallet-balances"]}
|
|
|
|
|
)
|
|
|
|
|
ua = UserApplet.objects.get(user=self.user, applet=self.tokens)
|
|
|
|
|
self.assertFalse(ua.visible)
|
|
|
|
|
|
|
|
|
|
def test_toggle_shows_checked_applet(self):
|
|
|
|
|
UserApplet.objects.create(user=self.user, applet=self.balances, visible=False)
|
|
|
|
|
self.client.post(
|
|
|
|
|
"/dashboard/wallet/toggle-applets", {"applets": ["wallet-balances"]}
|
|
|
|
|
)
|
|
|
|
|
ua = UserApplet.objects.get(user=self.user, applet=self.balances)
|
|
|
|
|
self.assertTrue(ua.visible)
|
|
|
|
|
|
|
|
|
|
def test_toggle_htmx_returns_container_partial(self):
|
|
|
|
|
response = self.client.post(
|
|
|
|
|
"/dashboard/wallet/toggle-applets",
|
|
|
|
|
{"applets": ["wallet-balances"]},
|
|
|
|
|
HTTP_HX_REQUEST="true",
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "id_wallet_applets_container")
|