hermes-hub/tests/test_delete_without_provider.py
Hermes Team a40bcac3c3 fix(web): удаление аккаунта не работало из интерфейса
Владелец: «удалить так и не могу ненужный». Backend был починен в
d755a07, но кнопка по-прежнему не работала.

Причина в клиенте: он отправлял только profile_id, без provider. Сервер
не знал, в каком каталоге искать auth.json, строил неверный путь и снова
отвечал «удалять нечего».

Идентификатор профиля однозначен, поэтому провайдер теперь берётся из
конфигурации, когда его не передали. Действие работает независимо от
того, кто его вызвал.

Заодно в клиенте: подтверждение перед необратимым удалением и обновление
экрана после — раньше карточка оставалась в прежнем виде, и было
непонятно, сработало ли.

Проверено через веб-API без параметра provider: до — авторизован,
после — нет.

Тесты: 426 passed, ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 20:19:58 +07:00

52 lines
2.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Удаление должно работать, когда провайдер не передан.
Владелец: «удалить так и не могу ненужный». Backend был уже починен, но
веб-клиент отправлял только profile_id, без provider. Сервер не знал, в
каком каталоге искать файл, и снова отвечал «удалять нечего» — кнопка
по-прежнему выглядела неработающей.
Идентификатор профиля однозначен, поэтому провайдер берётся из
конфигурации, и действие работает независимо от того, кто его вызвал.
"""
from __future__ import annotations
import json
import pytest
from antigravity_provider.router.action_handler import ActionExecutor
from antigravity_provider.router.profile_manager import get_profile_auth_path
@pytest.mark.parametrize("profile_id,provider", [
("grok-worker-2", "grok"),
("ag-spare-2", "antigravity"),
("opengo-2", "opencode-go"),
])
def test_delete_works_without_provider_argument(profile_id, provider, monkeypatch, tmp_path):
monkeypatch.setenv("HERMES_HOME", str(tmp_path))
auth_path = get_profile_auth_path(provider, profile_id)
auth_path.parent.mkdir(parents=True, exist_ok=True)
auth_path.write_text(json.dumps({"api_key": "x"}), encoding="utf-8")
# Ровно то, что шлёт веб-клиент: без provider.
result = ActionExecutor().execute("delete_credentials", {"profile_id": profile_id})
assert result.get("ok"), f"{profile_id}: {result.get('message')}"
assert not auth_path.is_file(), f"{profile_id}: файл остался, а действие отчиталось об успехе"
def test_client_confirms_before_deleting():
"""Необратимое действие обязано спрашивать подтверждение."""
import pathlib
app_js = pathlib.Path(
"src/antigravity_provider/router/web/static/app.js"
).read_text(encoding="utf-8")
assert "handleDeleteCredentials" in app_js
block = app_js.split("function handleDeleteCredentials", 1)[1][:600]
assert "confirm(" in block, "удаление выполняется без подтверждения"
assert "fetchSnapshot" in block, "экран не обновляется после удаления"