удаления поправлены, сортировка элементов в титре поправлено, обоюдное удаление поправлено
This commit is contained in:
@@ -47,6 +47,8 @@ def test_preview_selection_is_kept_per_side_and_visible():
|
||||
assert 'selectedPreviewEventIds: { home: "", away: "" }' in JS
|
||||
assert 'board.selectedPreviewEventIds[side] = event.id' in JS
|
||||
assert 'hockeyPenaltyIsPreviewSelected(board, event)' in JS
|
||||
assert 'Player DB ID' in JS
|
||||
assert 'Командное</b>${event.teamPenalty ? "1" : "0"}' in JS
|
||||
assert 'selected_home_penalty_player_db_id' in JS
|
||||
assert 'selected_away_penalty_player_db_id' in JS
|
||||
assert 'selected_home_penalty_team_penalty' in JS
|
||||
assert 'selected_away_penalty_team_penalty' in JS
|
||||
assert '.hpd-team-card-identifiers' in CSS
|
||||
|
||||
@@ -12,13 +12,10 @@ def test_mapping_data_group_count_is_right_aligned_before_fixed_arrow():
|
||||
assert ".hockey-map-data-group summary>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}" in CSS
|
||||
|
||||
|
||||
def test_mapping_vmix_input_selector_preserves_inventory_api_order():
|
||||
start = JS.index("function mappingInventoryInputs(profile)")
|
||||
end = JS.index("function mappingInputByKey", start)
|
||||
block = JS[start:end]
|
||||
assert "return Array.isArray(profile?.inventory?.inputs) ? [...profile.inventory.inputs] : [];" in block
|
||||
assert ".sort(" not in block
|
||||
assert "numberValue" not in block
|
||||
def test_mapping_inventory_raw_order_remains_available_on_server():
|
||||
# Build81 intentionally sorts the operator-facing picker by vMix number.
|
||||
# The Agent/server inventory still preserves the raw API array for identity/rebind work.
|
||||
assert "function mappingInventoryInputs(profile)" in JS
|
||||
|
||||
|
||||
def test_server_preserves_agent_inventory_array_order():
|
||||
|
||||
66
tests/test_build81_penalty_mapping_sort_and_mutual_labels.py
Normal file
66
tests/test_build81_penalty_mapping_sort_and_mutual_labels.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from pathlib import Path
|
||||
|
||||
from hockey_data.auth_bridge import HockeyUser
|
||||
from hockey_data.mapping_context import MappingDataService
|
||||
from hockey_data.models import Game
|
||||
from hockey_data.service import HockeyDataService
|
||||
from tests.support import LocalTestDatabase
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
APP = (ROOT / "ui_builder/static/app.js").read_text(encoding="utf-8")
|
||||
ADMIN = (ROOT / "hockey_data/static/admin-directories.js").read_text(encoding="utf-8")
|
||||
MAPPING = (ROOT / "hockey_data/mapping_context.py").read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def test_penalty_card_no_longer_renders_technical_id_block():
|
||||
start = APP.index("function hockeyPenaltyCard")
|
||||
end = APP.index("function hockeyPenaltyContext", start) if "function hockeyPenaltyContext" in APP[start:] else start + 12000
|
||||
snippet = APP[start:end]
|
||||
assert "hpd-team-card-identifiers" not in snippet
|
||||
assert "Player external ID" not in snippet
|
||||
assert "Player DB ID" not in snippet
|
||||
|
||||
|
||||
def test_side_penalty_context_is_shared_between_accounts(tmp_path: Path):
|
||||
database = LocalTestDatabase(tmp_path / "shared-penalty-context.sqlite3")
|
||||
database.create_all()
|
||||
with database.session() as session:
|
||||
session.add(Game(external_id="G1", tournament_external_id="T1", home_team_external_id="H", away_team_external_id="A"))
|
||||
service = MappingDataService(database) # type: ignore[arg-type]
|
||||
operator = HockeyUser(id="10", login="operator", display_name="Operator", is_admin=False, role="operator")
|
||||
admin = HockeyUser(id="99", login="admin", display_name="Admin", is_admin=True, role="admin")
|
||||
|
||||
service.set_context_value("selected_home_penalty_id", "PEN-17", operator, {"game_id": "G1", "session_token": "OP"})
|
||||
service.set_context_value("selected_home_penalty_player_db_id", "321", operator, {"game_id": "G1", "session_token": "OP"})
|
||||
context, variables = service.resolve_context(admin, {"game_id": "G1", "session_token": "ADM"})
|
||||
assert context["selected_home_penalty_id"] == "PEN-17"
|
||||
assert context["selected_home_penalty_player_db_id"] == "321"
|
||||
variable = next(item for item in variables if item["key"] == "selected_home_penalty_id")
|
||||
assert variable["scope"] == "match_shared"
|
||||
|
||||
|
||||
def test_mapping_input_picker_sorts_by_number_and_fields_naturally():
|
||||
start = ADMIN.index("function mappingInventoryInputs(profile)")
|
||||
end = ADMIN.index("function mappingInputByKey", start)
|
||||
block = ADMIN[start:end]
|
||||
assert "leftRank - rightRank" in block
|
||||
assert "Number(left?.number)" in block
|
||||
assert "function mappingVmixFieldOrder" in block
|
||||
assert "numeric: true" in block
|
||||
assert "const allFields = [...(currentInput.fields || [])].sort(mappingVmixFieldOrder);" in ADMIN
|
||||
|
||||
|
||||
def test_coincidental_penalties_fill_both_home_and_away_labels():
|
||||
settings = {
|
||||
"strength_regulation_skaters": 5,
|
||||
"strength_min_skaters": 3,
|
||||
"strength_state_labels": {"regulation": {"4x4": {"ru": "4 на 4", "en": "4 on 4"}}},
|
||||
}
|
||||
def penalty(side: str):
|
||||
return {"side": side, "infraction": {"code": "TEST"}, "preset": "2", "durationMs": 120000, "remainingMs": 90000, "finished": False}
|
||||
timer_state = {"penalty_board": {"penalties": [penalty("home"), penalty("away")]}}
|
||||
value = HockeyDataService._strength_payload(settings, stage="regular", current_period="1", timer_state=timer_state, language="ru")
|
||||
assert value["advantage_side"] == ""
|
||||
assert value["state_key"] == "4x4"
|
||||
assert value["home_label"] == "4 на 4"
|
||||
assert value["away_label"] == "4 на 4"
|
||||
@@ -17,13 +17,15 @@ def test_mapping_load_is_resilient_per_endpoint():
|
||||
assert 'Часть Mapping API недоступна' in JS
|
||||
|
||||
|
||||
def test_visual_mapping_has_sql_table_cell_picker_and_searchable_api_order_inputs():
|
||||
def test_visual_mapping_has_sql_table_cell_picker_and_searchable_number_sorted_inputs():
|
||||
assert 'data-map-table-source' in JS
|
||||
assert 'data-map-table-row-search' in JS
|
||||
assert '.row.${row.index}.' in JS
|
||||
assert 'data-map-input-search' in JS
|
||||
assert 'mappingFilteredInputs' in JS
|
||||
assert 'return Array.isArray(profile?.inventory?.inputs) ? [...profile.inventory.inputs] : [];' in JS
|
||||
assert 'const inputs = Array.isArray(profile?.inventory?.inputs) ? [...profile.inventory.inputs] : [];' in JS
|
||||
assert 'Number(left?.number)' in JS
|
||||
assert 'leftRank - rightRank' in JS
|
||||
|
||||
|
||||
def test_visual_mapping_has_explicit_sql_cell_dropdowns_and_apply_input():
|
||||
|
||||
Reference in New Issue
Block a user