This commit is contained in:
2026-10-30 14:48:57 -04:00
parent 06cfb9367d
commit 0e342734a6
7 changed files with 118 additions and 29 deletions
@@ -15,7 +15,7 @@ from django.utils import timezone
from members import billing, views
from members.models import Account, CryptoInvoice, ManagedGroup, Subscription
from members.service_groups import configured_groups, service_names, validate_service_groups
from members.service_groups import configured_groups, service_access_catalog, service_names, validate_service_groups
from ldap3 import Connection, MOCK_SYNC, Server
BASE = "ou=groups,dc=example,dc=org"
@@ -93,6 +93,8 @@ class ServiceDisplayTests(TestCase):
for key, tier in tiers.items():
self.assertEqual(tier["description"], deployed[key]["description"])
self.assertEqual(tier["benefits"], deployed[key]["benefits"])
self.assertIn(f"{tier['label']}-tier giveaways", tier["benefits"])
self.assertFalse(any("exclusive to" in benefit.casefold() for benefit in tier["benefits"]))
def test_homepage_lists_services_with_clear_access_labels(self):
root = Path(__file__).absolute().parents[3]
@@ -142,13 +144,38 @@ class ServiceDisplayTests(TestCase):
def test_home_displays_exact_level_services_without_ldap_or_settings_mutation(self):
with patch("members.directory.connection", side_effect=AssertionError("Public page must not contact LDAP")):
response = self.client.get("/members/")
self.assertContains(response, "Dex · single sign-on")
self.assertEqual(response.context["free_services"], ["Dex · single sign-on", "Matrix · community chat"])
self.assertEqual(response.context["tiers"]["supporter"]["services"], ["Gitea · Git hosting"])
self.assertEqual(response.context["tiers"]["patron"]["services"], ["Mastodon · social networking", "PeerTube · video sharing"])
self.assertEqual(response.context["tiers"]["premier"]["services"], [])
catalog = response.context["services"]
self.assertEqual(catalog, [
{"name": "Matrix · community chat", "access": "Open Lab", "url": "https://element.eom.dev/", "favicon": "https://element.eom.dev/vector-icons/144.5a63bf2.png"},
{"name": "Gitea · Git hosting", "access": "Bronze", "url": "https://gitea.eom.dev/", "favicon": "https://gitea.eom.dev/assets/img/favicon.svg"},
{"name": "Mastodon · social networking", "access": "Silver", "url": "https://mastodon.eom.dev/", "favicon": "https://mastodon.eom.dev/packs/assets/favicon-48x48-DMnduFKh.png"},
{"name": "PeerTube · video sharing", "access": "Silver", "url": "https://peertube.eom.dev/", "favicon": "https://peertube.eom.dev/client/assets/images/favicon.png"},
])
self.assertNotContains(response, "Dex · single sign-on")
self.assertContains(response, 'href="https://element.eom.dev/"')
self.assertContains(response, 'alt="" width="32" height="32"')
self.assertIn("https://element.eom.dev", response["Content-Security-Policy"])
self.assertEqual(response.content.count(b"Matrix \xc2\xb7 community chat"), 1)
self.assertContains(response, "Plus all previous benefits")
self.assertNotContains(response, "except tier-exclusive giveaways")
self.assertContains(response, "Support independent projects and the community</li><li>Plus all previous benefits</li>")
self.assertContains(response, "How do membership giveaways work?")
self.assertContains(response, 'href="https://element.eom.dev/"')
self.assertContains(response, 'src="https://element.eom.dev/vector-icons/144.5a63bf2.png"')
self.assertIn("https://element.eom.dev", response["Content-Security-Policy"])
self.assertNotContains(response, BASE)
self.assertNotIn("services", TIERS["supporter"])
def test_service_catalog_collapses_services_shared_by_every_level(self):
tiers = {"bronze": {"level": 1, "label": "Bronze"}, "gold": {"level": 3, "label": "Gold"}}
groups = {
"0": ["cn=Matrix Users," + BASE],
"1": ["cn=Matrix Users," + BASE],
"3": ["cn=Matrix Users," + BASE, "cn=Mastodon Users," + BASE],
}
self.assertEqual(service_access_catalog(tiers, groups), [
{"name": "Matrix · community chat", "access": "Every membership level", "url": "https://element.eom.dev/", "favicon": "https://element.eom.dev/vector-icons/144.5a63bf2.png"},
{"name": "Mastodon · social networking", "access": "Gold", "url": "https://mastodon.eom.dev/", "favicon": "https://mastodon.eom.dev/packs/assets/favicon-48x48-DMnduFKh.png"},
])
@override_settings(MEMBERSHIP_SERVICE_GROUPS={})
def test_unconfigured_services_do_not_advertise_access(self):