Add clubmanager.base.unique_slugify(instance, value, scope=...): slugify a source value, truncate to the field's max_length, and append -2/-3/... to stay unique within a scope. ClubScopedModel gains a slug_source hook that fills a blank slug (unique per club) on save. Wire it up so every SlugField auto-populates from its natural source when left blank (explicit values are always kept): - shop.Product.slug <- name (per club) - formbuilder.Form.slug <- title (per club) - formbuilder.Field.key <- label (per form) Club.slug already auto-populated; refactor it onto the shared helper. Also fix shop.Product.slug's multi-tenancy bug: it was globally unique (unique=True); make it unique per club like the others. Migrations added. Full suite at 100% coverage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
from django.test import TestCase
|
|
|
|
from club.models import Club
|
|
|
|
from .models import Product
|
|
|
|
|
|
class ProductSlugTests(TestCase):
|
|
def setUp(self):
|
|
self.club = Club.objects.create(name="Ajax United", slug="ajax-united")
|
|
|
|
def test_slug_auto_populated_from_name(self):
|
|
product = Product.objects.create(club=self.club, name="Home Jersey")
|
|
|
|
self.assertEqual(product.slug, "home-jersey")
|
|
|
|
def test_explicit_slug_is_preserved(self):
|
|
product = Product.objects.create(club=self.club, name="Home Jersey", slug="custom")
|
|
|
|
self.assertEqual(product.slug, "custom")
|
|
|
|
def test_slug_is_unique_per_club_with_suffix(self):
|
|
first = Product.objects.create(club=self.club, name="Home Jersey")
|
|
second = Product.objects.create(club=self.club, name="Home Jersey")
|
|
|
|
self.assertEqual(first.slug, "home-jersey")
|
|
self.assertEqual(second.slug, "home-jersey-2")
|
|
|
|
def test_same_slug_allowed_in_a_different_club(self):
|
|
other = Club.objects.create(name="Rival FC", slug="rival-fc")
|
|
here = Product.objects.create(club=self.club, name="Home Jersey")
|
|
there = Product.objects.create(club=other, name="Home Jersey")
|
|
|
|
self.assertEqual(here.slug, there.slug)
|
|
|
|
def test_unsluggable_name_falls_back(self):
|
|
product = Product.objects.create(club=self.club, name="###")
|
|
|
|
self.assertEqual(product.slug, "item")
|