Changeset 8aa20c7 in flexoentity for tests/test_id_stress.py


Ignore:
Timestamp:
11/01/25 15:51:10 (2 months ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
master
Children:
5c72356
Parents:
ca39274
Message:

full refactoring of FlexOID

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/test_id_stress.py

    rca39274 r8aa20c7  
    44"""
    55
     6import copy
     7import logging
     8import random
     9
    610import pytest
    7 import random
    8 import logging
     11
    912from flexoentity import FlexOID, EntityType, EntityState
    10 from builder.questions import RadioQuestion, AnswerOption
    1113
    1214logger = logging.getLogger(__name__)
     
    1820    via salt + date adjustment.
    1921    """
    20     etype = EntityType.QUESTION
     22    entity_type = EntityType.ITEM
    2123    estate = EntityState.DRAFT
    2224    seeds = [f"question {i}" for i in range(100000)]
     
    3133    ids = []
    3234    for seed in seeds:
    33         oid = FlexOID.safe_generate(domain.domain, etype, estate, seed, repo=repo)
     35        oid = FlexOID.safe_generate(domain.domain, entity_type.value, estate.value, seed, repo=repo)
    3436        assert isinstance(oid, FlexOID)
    3537        ids.append(str(oid))
     
    4648
    4749    # Sanity check: IDs should look canonical
    48     assert all(id_str.startswith("SIG-") for id_str in ids)
     50    assert all(id_str.startswith("GEN") for id_str in ids)
    4951    assert all("@" in id_str for id_str in ids)
    5052
     
    5456    (No runtime disambiguation; IDs are deterministic by design.)
    5557    """
    56     etype = EntityType.QUESTION
     58    entity_type = EntityType.ITEM
    5759    estate = EntityState.DRAFT
    5860    text = "identical question text"
    5961
    60     id1 = FlexOID.generate(domain.domain, etype, estate, text)
    61     id2 = FlexOID.generate(domain.domain, etype, estate, text)
     62    id1 = FlexOID.generate(domain.domain, entity_type.value, estate.value, text)
     63    id2 = FlexOID.generate(domain.domain, entity_type.value, estate.value, text)
    6264    # IDs must be identical because generation is deterministic
    6365    assert id1 == id2
    6466
    6567
    66 def test_id_reproducibility_across_runs(domain):
    67     """
    68     The same seed on a new process (fresh _seen_hashes)
    69     should yield the same base ID (without suffix).
    70     """
    71     etype = EntityType.CATALOG
    72     estate = EntityState.DRAFT
    73     seed = "reproducibility test seed"
     68# def test_id_reproducibility_across_runs(domain):
     69#     """
     70#     The same seed on a new process (fresh _seen_hashes)
     71#     should yield the same base ID (without suffix).
     72#     """
     73#     entity_type = EntityType.CATALOG
     74#     estate = EntityState.DRAFT
     75#     seed = "reproducibility test seed"
    7476
    75     id1 = FlexOID.generate(domain.domain, etype, estate, seed)
    76     FlexOID._seen_hashes.clear()
    77     id2 = FlexOID.generate(domain.domain, etype, estate, seed)
     77#     id1 = FlexOID.generate(domain.domain, entity_type.value, estate.value, seed)
     78#     FlexOID._seen_hashes.clear()
     79#     id2 = FlexOID.generate(domain.domain, entity_type.value, estate.value, seed)
    7880
    79     assert id1 == id2
     81#     assert id1 == id2
    8082
    8183
    82 def test_version_ceiling_enforcement(radio_question):
     84def test_version_ceiling_enforcement(sample_question):
    8385    """Simulate approaching @999 to trigger obsolescence guard."""
    84     q = radio_question
     86    q = sample_question
    8587    q.approve()
    8688
     
    9799
    98100
    99 def test_massive_lifecycle_simulation(domain):
     101def test_massive_lifecycle_simulation(sample_question):
    100102    """
    101     Generate 100 random RadioQuestions, simulate multiple edits and state transitions,
     103    Generate 100 random SingleChoiceQuestions, simulate multiple edits and state transitions,
    102104    ensure all final IDs and fingerprints are unique and valid.
    103105    """
    104106    entities = [
    105         RadioQuestion(
    106             domain=domain,
    107             etype=EntityType.QUESTION,
    108             state=EntityState.DRAFT,
    109             text=f"random question {i}",
    110             options=[
    111                 AnswerOption(id="opt4", text="HF (3–30 MHz)", points=1),
    112                 AnswerOption(id="opt5", text="VHF (30–300 MHz)", points=0),
    113             ],
    114         )
    115         for i in range(100)
     107        copy.deepcopy(sample_question) for _ in range(100)
    116108    ]
    117109
    118     for e in entities:
     110    for i, e in enumerate(entities):
    119111        # random edit
    120         e.text += " updated"
     112        e.text += f" updated #{i}"
    121113        e._update_fingerprint()
    122114
Note: See TracChangeset for help on using the changeset viewer.