feat: configure member number allocation strategy

This commit is contained in:
Marcel Peterkau
2026-07-30 19:07:18 +02:00
parent 460dcac77c
commit cfd5de42f2
3 changed files with 190 additions and 24 deletions
+38
View File
@@ -1,4 +1,5 @@
import json
from concurrent.futures import ThreadPoolExecutor
from decimal import Decimal
import pytest
@@ -184,6 +185,43 @@ def test_custom_pattern_and_manual_mode(tmp_path) -> None:
repository.create_member(first_name="Duplicate", last_name="Member", member_number="special-7")
def test_member_number_strategy_fills_gaps_or_uses_max_plus_one(tmp_path) -> None:
repository = MemberRepository(tmp_path)
repository.initialize()
repository.create_member(first_name="One", last_name="Member", member_number="MA-001")
repository.create_member(first_name="Three", last_name="Member", member_number="MA-003")
repository.save_member_number_policy(
mode="automatic",
pattern="MA-{number:03d}",
allocation_strategy="next_free",
)
assert repository.preview_member_number() == "MA-002"
assert repository.get_member_number_policy()["allocation_strategy"] == "next_free"
repository.save_member_number_policy(
mode="automatic",
pattern="MA-{number:03d}",
allocation_strategy="max_plus_one",
)
assert repository.preview_member_number() == "MA-004"
created = repository.create_member(first_name="Four", last_name="Member")
assert created.member_number == "MA-004"
def test_concurrent_automatic_member_numbers_are_unique(tmp_path) -> None:
MemberRepository(tmp_path).initialize()
def create(index: int) -> str:
repository = MemberRepository(tmp_path)
return repository.create_member(first_name=f"Member {index}", last_name="Concurrent").member_number
with ThreadPoolExecutor(max_workers=8) as executor:
numbers = list(executor.map(create, range(16)))
assert len(numbers) == len(set(numbers)) == 16
@pytest.mark.parametrize("pattern", ["", "CCMA-{year}", "{unknown}-{number}", "{number!r}"])
def test_invalid_member_number_patterns_are_rejected(pattern) -> None:
with pytest.raises(RepositoryError):