e4dcfc49aa
Tests / Import Check (Python 3.13) (push) Has been cancelled
Tests / Import Check (Python 3.14) (push) Has been cancelled
Tests / Python Tests (Python 3.11) (push) Has been cancelled
Tests / Python Tests (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.14) (push) Has been cancelled
Tests / Test Summary (push) Has been cancelled
Tests / Lint and Format (push) Has been cancelled
Tests / Web Node Tests (push) Has been cancelled
Tests / Import Check (Python 3.11) (push) Has been cancelled
Tests / Import Check (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.13) (push) Has been cancelled
71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
import time
|
|
|
|
from deeptutor.services.memory.ids import (
|
|
is_entry_id,
|
|
is_shortname_ref,
|
|
is_trace_id,
|
|
is_valid_ref,
|
|
new_entry_id,
|
|
new_trace_id,
|
|
new_ulid,
|
|
)
|
|
|
|
|
|
def test_ulid_length_and_charset() -> None:
|
|
u = new_ulid()
|
|
assert len(u) == 26
|
|
assert all(c in "0123456789ABCDEFGHJKMNPQRSTVWXYZ" for c in u)
|
|
|
|
|
|
def test_ulid_monotonic_within_window() -> None:
|
|
# Within a few ms the timestamp prefix should sort consistently.
|
|
first = new_ulid()
|
|
time.sleep(0.005)
|
|
second = new_ulid()
|
|
assert first[:10] <= second[:10]
|
|
|
|
|
|
def test_entry_id_shape_and_validation() -> None:
|
|
eid = new_entry_id()
|
|
assert eid.startswith("m_")
|
|
assert is_entry_id(eid)
|
|
assert not is_trace_id(eid)
|
|
|
|
|
|
def test_trace_id_shape_and_validation() -> None:
|
|
tid = new_trace_id("chat")
|
|
assert tid.startswith("chat:")
|
|
assert is_trace_id(tid)
|
|
assert not is_entry_id(tid)
|
|
|
|
|
|
def test_invalid_ids_rejected() -> None:
|
|
assert not is_entry_id("m_short")
|
|
assert not is_entry_id("foo")
|
|
assert not is_entry_id("")
|
|
assert not is_trace_id("01HZK4ABCDEFGHJKMNPQRSTVWX") # missing surface prefix
|
|
assert not is_trace_id("CHAT:01HZK4ABCDEFGHJKMNPQRSTVWX") # uppercase surface
|
|
|
|
|
|
def test_uniqueness_across_calls() -> None:
|
|
ids = {new_ulid() for _ in range(1000)}
|
|
assert len(ids) == 1000
|
|
|
|
|
|
def test_shortname_ref_accepts_known_surfaces() -> None:
|
|
"""L3 refs are bare surface names. Whitelisted (not a loose regex)
|
|
so an LLM hallucination like ``not-an-id`` doesn't sneak through."""
|
|
for surface in ("chat", "notebook", "quiz", "kb", "book", "partner", "cowriter"):
|
|
assert is_shortname_ref(surface), surface
|
|
# is_valid_ref must accept the new form so the ops validator does too.
|
|
assert is_valid_ref("chat")
|
|
|
|
|
|
def test_shortname_ref_rejects_unknown_tokens() -> None:
|
|
assert not is_shortname_ref("CHAT")
|
|
assert not is_shortname_ref("not-an-id")
|
|
assert not is_shortname_ref("")
|
|
assert not is_shortname_ref("co-writer") # the actual surface is ``cowriter``
|