mirror of
https://git.hiabuto.net/C3MA/CCMA.git
synced 2026-08-24 22:45:18 +02:00
feat: configure member number allocation strategy
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user