Newer
Older
navi-1 / tests / unit / test_identity.py
"""Instance identity: generation, persistence, rename-by-edit."""

import json

import pytest

from navi.identity import (
    InstanceIdentity,
    ensure_identity,
    generate_name,
    load_identity,
)

_ALL_NAMES = {
    n
    for pool in (  # from navi/identity.py
        "yuki sakura hana aki miku rin mei yui sana nao kaori mika rika emi "
        "haruka asuka rei airi kana honoka mitsuki natsumi sayuri suzume "
        "tamaki tomoe ayame chiyo fumiko himari kaede kanna mai mariko "
        "midori momoka natsuki noriko riko saori shiori suzuka tsukiko umeko "
        "yoshiko yuzuki kirie jun motoko satchiko",
        "emma olivia ava mia chloe grace lily hannah nora ruby alice clara "
        "daisy hazel iris jade june leah lucy pearl rose sage stella violet "
        "willa zoe amber brooke faith harmony josephine katherine lydia "
        "madeline natalie paige riley scarlett tessa trinity vivian abigail "
        "bethany delilah everly jenna leona melody serenity tiffany",
        "sofia lucia valentina camila daniela carmen elena gabriela ines "
        "lola marisol paulina raquel rosalia serena teresa ximena alba "
        "bonita carlota esperanza juanita mirta noelia paloma rosita adela "
        "belen candela dolores estrella flor guadalupe jimena laura miriam "
        "pilar rocio veronica yolanda catalina dalia emilia fernanda gisela "
        "nayeli renata salma ursula vanesa",
    )
    for n in pool.split()
}


def test_generated_name_is_two_female_names():
    for _ in range(50):
        name = generate_name()
        first, second = name.split("-")
        assert first in _ALL_NAMES
        assert second in _ALL_NAMES
        assert first != second


def test_generated_names_vary():
    names = {generate_name() for _ in range(80)}
    assert len(names) > 1


def test_ensure_creates_file_and_is_stable(tmp_path):
    path = tmp_path / "instance.json"
    first = ensure_identity(path)
    assert path.exists()
    second = load_identity(path)
    assert first.name == second.name
    assert first.instance_id == second.instance_id
    # idempotent: ensure on an existing file never regenerates
    third = ensure_identity(path)
    assert third.instance_id == first.instance_id


def test_rename_by_editing_file(tmp_path):
    path = tmp_path / "instance.json"
    ensure_identity(path)
    data = json.loads(path.read_text())
    data["name"] = "renamed-by-hand"
    path.write_text(json.dumps(data))
    assert load_identity(path).name == "renamed-by-hand"


def test_load_missing_file_raises(tmp_path):
    with pytest.raises(Exception):
        load_identity(tmp_path / "absent.json")


def test_identity_dataclass_fields():
    ident = InstanceIdentity(name="quiet-otter", instance_id="uuid-x", created_at="t")
    assert ident.name == "quiet-otter"