"""Goal deletion requires actual vMix ACK before visible/persisted mutation.""" import os from pathlib import Path import shutil import subprocess import pytest ROOT = Path(__file__).resolve().parents[1] CASES = [ 'normal_goal_ack_before_row_delete', 'f2_off_never_mutates_or_replays', 'f2_off_during_ack_keeps_row', 'nack_keeps_row_without_replay', 'unknown_ack_keeps_row_without_replay', 'double_first_ack_before_shortening', 'double_second_ack_before_delete', 'duplicate_success_only_one_removal', 'rehydrate_pending_does_not_repeat_goal', 'role_change_before_ack_keeps_row', 'major_and_equal_strength_do_not_delete', 'ordinary_goal_does_not_need_shb', 'penalty_shot_exception_stays', 'undo_waits_for_vmix_before_restore', 'undo_nack_does_not_invent_restored_row', 'held_ack_pause_keeps_latest_native_time', 'held_ack_resume_keeps_latest_native_time', 'unmapped_current_segment_uses_other_field_ack', 'shared_input_removes_only_chosen_field', 'joint_two_four_right_phase_goal_and_undo', ] @pytest.mark.parametrize('case', CASES) def test_goal_ack(case): node = shutil.which('node') assert node, 'Node is required for executable browser tests' result = subprocess.run( [node, str(ROOT / 'tests/build200_goal_ack.cjs'), case, os.environ.get('BUILD200_RUNTIME_ROOT', str(ROOT))], cwd=ROOT, text=True, capture_output=True, timeout=20, ) assert result.returncode == 0, result.stdout + result.stderr assert f'PASS BUILD200 goal ACK: {case}' in result.stdout, result.stdout + result.stderr