поправлены сложные удаления

This commit is contained in:
2026-08-20 15:06:17 +03:00
parent 559888cc0c
commit 3dc21e4619
6 changed files with 109 additions and 44 deletions

View File

@@ -12,8 +12,8 @@ def test_penalty_display_routes_single_side_to_opposite_advantage_target():
end = APP_JS.index("function hockeyPenaltySideMappingDetail", start)
block = APP_JS[start:end]
assert 'if (home.length && away.length)' in block
assert 'return { home: [], away: home.slice(0, 1), routedToAdvantage: true };' in block
assert 'return { home: away.slice(0, 1), away: [], routedToAdvantage: true };' in block
assert 'return { home: [], away: take(home), routedToAdvantage: true, advantageSide: "away" };' in block
assert 'return { home: take(away), away: [], routedToAdvantage: true, advantageSide: "home" };' in block
def test_penalty_rebalance_and_initial_timer_use_same_display_plan():

View File

@@ -44,15 +44,14 @@ def test_strength_engine_reports_advantage_for_4x3_and_3x4():
assert away_advantage["advantage_side"] == "away"
def test_penalty_plate_routing_uses_strength_advantage_side():
def test_penalty_plate_routing_defers_powerplay_while_both_sides_have_penalties():
start = APP_JS.index("function penaltyDisplayEntriesByTargetSide")
end = APP_JS.index("function hockeyPenaltySideMappingDetail", start)
block = APP_JS[start:end]
assert 'getByPath(state.data, "hockey.game_control.strength")' in block
assert 'if (advantageSide === "home")' in block
assert 'return { home: take(away), away: [], routedToAdvantage: true, advantageSide: "home" };' in block
assert 'if (advantageSide === "away")' in block
assert 'if (home.length && away.length)' in block
assert 'return { home: take(home), away: take(away), routedToAdvantage: false, advantageSide: "" };' in block
assert 'return { home: [], away: take(home), routedToAdvantage: true, advantageSide: "away" };' in block
assert 'return { home: take(away), away: [], routedToAdvantage: true, advantageSide: "home" };' in block
def test_database_schema_reference_lists_real_hockey_tables(tmp_path: Path):

View File

@@ -14,11 +14,11 @@ def test_authoritative_strength_change_rebalances_penalty_targets():
assert "Penalty strength rebalance error" in block
def test_penalty_plan_still_routes_two_vs_one_to_advantage_side():
def test_penalty_plan_rebalances_after_strength_refresh_without_forcing_complex_powerplay():
start = APP_JS.index("function penaltyDisplayEntriesByTargetSide")
end = APP_JS.index("function hockeyPenaltySideMappingDetail", start)
block = APP_JS[start:end]
assert 'if (advantageSide === "home")' in block
assert 'return { home: take(away), away: [], routedToAdvantage: true, advantageSide: "home" };' in block
assert 'if (advantageSide === "away")' in block
assert 'return { home: [], away: take(home), routedToAdvantage: true, advantageSide: "away" };' in block
assert 'if (home.length && away.length)' in block
assert 'routedToAdvantage: false' in block
assert 'if (home.length)' in block
assert 'if (away.length)' in block

View File

@@ -0,0 +1,65 @@
from pathlib import Path
from hockey_data.service import HockeyDataService
ROOT = Path(__file__).resolve().parents[1]
APP_JS = (ROOT / "ui_builder/static/app.js").read_text(encoding="utf-8")
def _penalty(side: str, remaining: int = 90000) -> dict:
return {
"side": side,
"infraction": {"code": "TEST"},
"preset": "2",
"durationMs": 120000,
"remainingMs": remaining,
"finished": False,
}
def test_complex_two_vs_one_keeps_real_strength_but_hides_pp_caption_until_one_side_clears():
settings = {
"strength_regulation_skaters": 5,
"strength_min_skaters": 3,
"strength_state_labels": {"regulation": {"4x3": {"ru": "Играют в большинстве", "en": "Power play"}}},
}
value = HockeyDataService._strength_payload(
settings,
stage="regular",
current_period="2",
timer_state={"penalty_board": {"penalties": [_penalty("home"), _penalty("home"), _penalty("away")] }},
language="ru",
)
assert value["strength_label"] == "3×4"
assert value["advantage_side"] == "away"
assert value["home_label"] == ""
assert value["away_label"] == ""
def test_single_remaining_penalty_outputs_pp_caption_on_opposite_team():
settings = {
"strength_regulation_skaters": 5,
"strength_min_skaters": 3,
"strength_state_labels": {"regulation": {"5x4": {"ru": "Играют в большинстве", "en": "Power play"}}},
}
value = HockeyDataService._strength_payload(
settings,
stage="regular",
current_period="2",
timer_state={"penalty_board": {"penalties": [_penalty("home")] }},
language="ru",
)
assert value["advantage_side"] == "away"
assert value["home_label"] == ""
assert value["away_label"] == "Играют в большинстве"
def test_display_plan_keeps_each_side_while_both_have_penalties_and_clears_when_none():
start = APP_JS.index("function penaltyDisplayEntriesByTargetSide")
end = APP_JS.index("function hockeyPenaltySideMappingDetail", start)
block = APP_JS[start:end]
assert 'if (home.length && away.length)' in block
assert 'return { home: take(home), away: take(away), routedToAdvantage: false, advantageSide: "" };' in block
assert 'return { home: [], away: take(home), routedToAdvantage: true, advantageSide: "away" };' in block
assert 'return { home: take(away), away: [], routedToAdvantage: true, advantageSide: "home" };' in block
assert 'return { home: [], away: [], routedToAdvantage: false, advantageSide: "" };' in block