zapretgui/tests/test_strategy_context_menu.py
loop-uh cda8634bad
Some checks failed
Zapret source guards / validate (push) Successful in 9s
Windows-сборка / Dev Ошибка: Создание Forgejo release (21.1.7.58)
Стратегии: страница подробностей по кнопке-метке и обучение на отметках человека
Подробности о стратегии:
- метка на плитке («в 13 пресетах», «у вас работает · 2») — кнопка: открывает
  страницу подробностей вместо списка; щелчок по названию или свободному
  месту плитки по-прежнему применяет стратегию; ещё F1 и пункт меню;
- страница — следующий шаг строки пути страницы профиля, вкладки на это
  время убраны; возврат ведёт к тому же месту списка;
- на странице: что стратегия делает шаг за шагом простыми словами, где стоит
  в готовых пресетах, отметки человека, сведения каталога, строки запуска;
  отсюда же её можно применить, оценить и добавить в избранное;
- описания функций и приёмов (profile/strategy_list/knowledge.py) сверены
  с исходниками Zapret 2; подделка без приёма порчи помечена предупреждением.

Обучение на отметках человека:
- стратегия, отмеченная рабочей на других профилях, получает метку
  «у вас работает», стоит выше в своей группе и идёт первой в переборе;
- подводившая на других профилях уходит в конец;
- способ обхода, который человеку чаще помогает, пробуется раньше, а тот,
  что раз за разом не помогает, — позже.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 23:37:34 +03:00

98 lines
3.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.

"""Меню стратегии по правой кнопке: оценка и избранное.
Кнопок оценки под списком нет. Меню открывается на той стратегии, по которой
щёлкнули, и сообщает странице, что выбрано; саму стратегию для профиля щелчок
правой кнопкой не выбирает.
"""
from __future__ import annotations
import os
import unittest
from types import SimpleNamespace
from unittest.mock import patch
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PyQt6.QtCore import QPoint
from PyQt6.QtGui import QContextMenuEvent
from PyQt6.QtWidgets import QApplication
from profile.strategy_state import ProfileStrategyState
from profile.ui.strategy_context_menu import (
COMMAND_FAVORITE,
COMMAND_RATING,
build_strategy_context_menu,
can_rate_strategy,
)
def _entries(count: int = 4) -> dict:
return {
f"fake-{n}": SimpleNamespace(name=f"General ALT{n}", args="--lua-desync=fake")
for n in range(count)
}
class _MenuCase(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls._app = QApplication.instance() or QApplication([])
def tearDown(self) -> None:
self._app.closeAllWindows()
self._app.processEvents()
class StrategyMenuItemsTests(_MenuCase):
def _menu(self, *, rating: str = "", favorite: bool = False) -> dict[str, tuple[str, object]]:
menu, action_map = build_strategy_context_menu(
parent=None,
strategy_name="General ALT2",
rating=rating,
favorite=favorite,
)
self.addCleanup(menu.deleteLater)
return {action.text(): command for action, command in action_map.items()}
def test_unrated_strategy_offers_both_ratings_and_favorite(self) -> None:
self.assertEqual(
self._menu(),
{
"Подробнее о стратегии": ("details", True),
"Работает": (COMMAND_RATING, "work"),
"Не работает": (COMMAND_RATING, "notwork"),
"В избранное": (COMMAND_FAVORITE, True),
},
)
def test_set_rating_can_be_taken_off_or_replaced(self) -> None:
self.assertEqual(
self._menu(rating="work"),
{
"Подробнее о стратегии": ("details", True),
"Снять отметку «Работает»": (COMMAND_RATING, ""),
"Не работает": (COMMAND_RATING, "notwork"),
"В избранное": (COMMAND_FAVORITE, True),
},
)
self.assertEqual(
self._menu(rating="notwork", favorite=True),
{
"Подробнее о стратегии": ("details", True),
"Работает": (COMMAND_RATING, "work"),
"Снять отметку «Не работает»": (COMMAND_RATING, ""),
"Убрать из избранного": (COMMAND_FAVORITE, False),
},
)
def test_strategies_without_ready_arguments_are_not_rated(self) -> None:
self.assertTrue(can_rate_strategy("fake-1"))
for strategy_id in ("", "none", "custom"):
self.assertFalse(can_rate_strategy(strategy_id))
if __name__ == "__main__":
unittest.main()