forked from retoor/devplacepy
fix: correct "bugs" to "issues" in routing table and README references across multiple documentation files
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
@@ -0,0 +1,96 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
import random
|
||||
|
||||
from devplacepy.services.bot.config import SEARCH_TERMS
|
||||
from devplacepy.services.bot.handles import (
|
||||
MAX_HANDLE_LEN,
|
||||
MIN_HANDLE_LEN,
|
||||
apply_leet,
|
||||
make_handle,
|
||||
sanitize_handle,
|
||||
)
|
||||
|
||||
SAMPLE_COUNT = 300
|
||||
|
||||
|
||||
def _is_valid_username(handle: str) -> bool:
|
||||
return (
|
||||
handle.isascii()
|
||||
and bool(handle)
|
||||
and all(character.isalnum() or character in ("-", "_") for character in handle)
|
||||
)
|
||||
|
||||
|
||||
def test_make_handle_only_valid_username_characters():
|
||||
generator = random.Random(1)
|
||||
for _ in range(SAMPLE_COUNT):
|
||||
handle = make_handle([], generator)
|
||||
assert _is_valid_username(handle), handle
|
||||
|
||||
|
||||
def test_make_handle_never_contains_dot():
|
||||
generator = random.Random(2)
|
||||
for _ in range(SAMPLE_COUNT):
|
||||
handle = make_handle(["first app", "raspberry pi"], generator)
|
||||
assert "." not in handle
|
||||
|
||||
|
||||
def test_make_handle_respects_length_bounds():
|
||||
generator = random.Random(3)
|
||||
for _ in range(SAMPLE_COUNT):
|
||||
handle = make_handle([], generator)
|
||||
assert MIN_HANDLE_LEN <= len(handle) <= MAX_HANDLE_LEN
|
||||
|
||||
|
||||
def test_make_handle_valid_for_every_persona():
|
||||
generator = random.Random(4)
|
||||
for persona, interests in SEARCH_TERMS.items():
|
||||
for _ in range(SAMPLE_COUNT):
|
||||
handle = make_handle(interests, generator)
|
||||
assert _is_valid_username(handle), (persona, handle)
|
||||
assert MIN_HANDLE_LEN <= len(handle) <= MAX_HANDLE_LEN
|
||||
|
||||
|
||||
def test_make_handle_is_deterministic_for_seeded_rng():
|
||||
first = [make_handle(["rust", "kubernetes"], random.Random(99)) for _ in range(20)]
|
||||
second = [make_handle(["rust", "kubernetes"], random.Random(99)) for _ in range(20)]
|
||||
assert first == second
|
||||
|
||||
|
||||
def test_make_handle_produces_variety():
|
||||
generator = random.Random(5)
|
||||
handles = {make_handle([], generator) for _ in range(SAMPLE_COUNT)}
|
||||
assert len(handles) > SAMPLE_COUNT // 2
|
||||
|
||||
|
||||
def test_sanitize_handle_strips_dots_and_invalid_characters():
|
||||
assert sanitize_handle("john.smith.dev!!") == "johnsmithdev"
|
||||
assert sanitize_handle("hello world") == "helloworld"
|
||||
assert sanitize_handle("a@b#c$d") == "abcd"
|
||||
|
||||
|
||||
def test_sanitize_handle_collapses_and_trims_separators():
|
||||
assert sanitize_handle("__null__byte__") == "null_byte"
|
||||
assert sanitize_handle("--seg--fault--") == "seg-fault"
|
||||
|
||||
|
||||
def test_sanitize_handle_caps_length():
|
||||
assert len(sanitize_handle("a" * 50)) == MAX_HANDLE_LEN
|
||||
|
||||
|
||||
def test_sanitize_handle_empty_input():
|
||||
assert sanitize_handle("...") == ""
|
||||
assert sanitize_handle("") == ""
|
||||
|
||||
|
||||
def test_apply_leet_only_substitutes_mapped_characters():
|
||||
generator = random.Random(7)
|
||||
result = apply_leet("xyzq", generator)
|
||||
assert result == "xyzq"
|
||||
|
||||
|
||||
def test_apply_leet_can_substitute_known_characters():
|
||||
always = random.Random(0)
|
||||
seen = {apply_leet("aeiost", always) for _ in range(50)}
|
||||
assert any(character.isdigit() for handle in seen for character in handle)
|
||||
@@ -0,0 +1,50 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
import json
|
||||
|
||||
from devplacepy.services.bot.handles import MAX_HANDLE_LEN
|
||||
from devplacepy.services.bot.llm import LLMClient
|
||||
|
||||
|
||||
def _client(reply: str) -> LLMClient:
|
||||
client = LLMClient(
|
||||
api_key="test",
|
||||
api_url="http://example.invalid",
|
||||
model="molodetz",
|
||||
input_cost_per_1m=0.0,
|
||||
output_cost_per_1m=0.0,
|
||||
)
|
||||
client._raw_call = lambda system, prompt, temperature=1.0: reply
|
||||
return client
|
||||
|
||||
|
||||
def test_generate_handle_candidates_parses_and_sanitizes():
|
||||
reply = json.dumps({"handles": ["null_byte", "john.smith", "seg fault!!", "c0d3r"]})
|
||||
handles = _client(reply).generate_handle_candidates("grumpy_senior")
|
||||
assert handles == ["null_byte", "johnsmith", "segfault", "c0d3r"]
|
||||
|
||||
|
||||
def test_generate_handle_candidates_dedupes_case_insensitively():
|
||||
reply = json.dumps({"handles": ["NullByte", "nullbyte", "Daemon", "daemon"]})
|
||||
handles = _client(reply).generate_handle_candidates("minimalist")
|
||||
assert [handle.lower() for handle in handles] == ["nullbyte", "daemon"]
|
||||
|
||||
|
||||
def test_generate_handle_candidates_drops_empty_results():
|
||||
reply = json.dumps({"handles": ["", "...", "!!!", "kernelpanic"]})
|
||||
handles = _client(reply).generate_handle_candidates("rebel")
|
||||
assert handles == ["kernelpanic"]
|
||||
|
||||
|
||||
def test_generate_handle_candidates_caps_length():
|
||||
reply = json.dumps({"handles": ["x" * 40]})
|
||||
handles = _client(reply).generate_handle_candidates("mentor")
|
||||
assert len(handles[0]) == MAX_HANDLE_LEN
|
||||
|
||||
|
||||
def test_generate_handle_candidates_handles_bad_json():
|
||||
assert _client("not json at all").generate_handle_candidates("academic_type") == []
|
||||
|
||||
|
||||
def test_generate_handle_candidates_handles_missing_key():
|
||||
assert _client(json.dumps({"other": []})).generate_handle_candidates("mentor") == []
|
||||
Reference in New Issue
Block a user