Skip to content

Commit 7084ae3

Browse files
committed
tests(hooks): update for simplified bulk operations API
why: Tests need to use new API after removing redundant methods what: - Replace get_hook_indices/get_hook_values with show_hook().keys() - Replace clear_hook with unset_hook - Replace append_hook with set_hook(..., append=True) - Add test for show_hook returning SparseArray - Add test for unset_hook clearing all indices - Add test for set_hook append=True flag Squash target: ec340de (tests: bulk operations test grid)
1 parent df3fd3e commit 7084ae3

File tree

1 file changed

+107
-193
lines changed

1 file changed

+107
-193
lines changed

tests/test_hooks.py

Lines changed: 107 additions & 193 deletions
Original file line numberDiff line numberDiff line change
@@ -517,84 +517,24 @@ def test_new_hooks_version_gated(server: Server, test_case: HookTestCase) -> Non
517517

518518

519519
# =============================================================================
520-
# Bulk Operations API Tests
520+
# set_hooks Tests
521521
# =============================================================================
522522

523523

524-
class BulkOpTestCase(t.NamedTuple):
525-
"""Test case for bulk hook operations."""
524+
class SetHooksTestCase(t.NamedTuple):
525+
"""Test case for set_hooks operations."""
526526

527527
test_id: str
528-
operation: str # "get_indices", "get_values", "set_bulk", "clear", "append"
529528
hook: str # Hook name to test
530529
setup_hooks: dict[int, str] # Initial hooks to set (index -> value)
531-
operation_args: dict[str, t.Any] # Args for operation
530+
operation_args: dict[str, t.Any] # Args for set_hooks
532531
expected_indices: list[int] # Expected indices after operation
533532
expected_contains: list[str] | None = None # Strings expected in values
534533

535534

536-
# --- get_hook_indices tests ---
537-
GET_INDICES_TESTS: list[BulkOpTestCase] = [
538-
BulkOpTestCase(
539-
"get_indices_empty",
540-
"get_indices",
541-
"session-renamed",
542-
{},
543-
{},
544-
[],
545-
),
546-
BulkOpTestCase(
547-
"get_indices_sequential",
548-
"get_indices",
549-
"session-renamed",
550-
{
551-
0: "display-message 'hook 0'",
552-
1: "display-message 'hook 1'",
553-
2: "display-message 'hook 2'",
554-
},
555-
{},
556-
[0, 1, 2],
557-
),
558-
BulkOpTestCase(
559-
"get_indices_sparse",
560-
"get_indices",
561-
"session-renamed",
562-
{
563-
0: "display-message 'hook 0'",
564-
5: "display-message 'hook 5'",
565-
10: "display-message 'hook 10'",
566-
},
567-
{},
568-
[0, 5, 10],
569-
),
570-
]
571-
572-
# --- get_hook_values tests ---
573-
GET_VALUES_TESTS: list[BulkOpTestCase] = [
574-
BulkOpTestCase(
575-
"get_values_empty",
576-
"get_values",
577-
"session-renamed",
578-
{},
579-
{},
580-
[],
581-
),
582-
BulkOpTestCase(
583-
"get_values_sparse",
584-
"get_values",
585-
"session-renamed",
586-
{0: "display-message 'hook 0'", 5: "display-message 'hook 5'"},
587-
{},
588-
[0, 5],
589-
["display-message"],
590-
),
591-
]
592-
593-
# --- set_hooks tests ---
594-
SET_BULK_TESTS: list[BulkOpTestCase] = [
595-
BulkOpTestCase(
596-
"set_bulk_with_dict",
597-
"set_bulk",
535+
SET_HOOKS_TESTS: list[SetHooksTestCase] = [
536+
SetHooksTestCase(
537+
"set_hooks_with_dict",
598538
"session-renamed",
599539
{},
600540
{
@@ -607,9 +547,8 @@ class BulkOpTestCase(t.NamedTuple):
607547
[0, 1, 5],
608548
["hook 0", "hook 1", "hook 5"],
609549
),
610-
BulkOpTestCase(
611-
"set_bulk_with_list",
612-
"set_bulk",
550+
SetHooksTestCase(
551+
"set_hooks_with_list",
613552
"session-renamed",
614553
{},
615554
{
@@ -621,9 +560,8 @@ class BulkOpTestCase(t.NamedTuple):
621560
},
622561
[0, 1, 2],
623562
),
624-
BulkOpTestCase(
625-
"set_bulk_clear_existing",
626-
"set_bulk",
563+
SetHooksTestCase(
564+
"set_hooks_clear_existing",
627565
"session-renamed",
628566
{0: "display-message 'old 0'", 1: "display-message 'old 1'"},
629567
{"values": {0: "display-message 'new 0'"}, "clear_existing": True},
@@ -632,175 +570,151 @@ class BulkOpTestCase(t.NamedTuple):
632570
),
633571
]
634572

635-
# --- clear_hook tests ---
636-
CLEAR_TESTS: list[BulkOpTestCase] = [
637-
BulkOpTestCase(
638-
"clear_hook",
639-
"clear",
640-
"session-renamed",
641-
{0: "display-message 'hook 0'", 5: "display-message 'hook 5'"},
642-
{},
643-
[],
644-
),
645-
]
646-
647-
# --- append_hook tests ---
648-
APPEND_TESTS: list[BulkOpTestCase] = [
649-
BulkOpTestCase(
650-
"append_to_empty",
651-
"append",
652-
"session-renamed",
653-
{},
654-
{"value": "display-message 'appended'"},
655-
[0],
656-
["appended"],
657-
),
658-
BulkOpTestCase(
659-
"append_sequential",
660-
"append",
661-
"session-renamed",
662-
{0: "display-message 'initial'"},
663-
{"value": "display-message 'appended'"},
664-
[0, 1],
665-
),
666-
BulkOpTestCase(
667-
"append_after_sparse",
668-
"append",
669-
"session-renamed",
670-
{0: "display-message 'at 0'", 10: "display-message 'at 10'"},
671-
{"value": "display-message 'appended'"},
672-
[0, 10, 11],
673-
["appended"],
674-
),
675-
]
676-
677-
# Combine all bulk operation test cases
678-
ALL_BULK_OP_TESTS: list[BulkOpTestCase] = (
679-
GET_INDICES_TESTS + GET_VALUES_TESTS + SET_BULK_TESTS + CLEAR_TESTS + APPEND_TESTS
680-
)
681-
682573

683-
def _build_bulk_op_params() -> list[t.Any]:
684-
"""Build pytest params for bulk operation tests."""
685-
return [pytest.param(tc, id=tc.test_id) for tc in ALL_BULK_OP_TESTS]
574+
def _build_set_hooks_params() -> list[t.Any]:
575+
"""Build pytest params for set_hooks tests."""
576+
return [pytest.param(tc, id=tc.test_id) for tc in SET_HOOKS_TESTS]
686577

687578

688-
@pytest.mark.parametrize("test_case", _build_bulk_op_params())
689-
def test_bulk_hook_operation(server: Server, test_case: BulkOpTestCase) -> None:
690-
"""Test bulk hook operations.
691-
692-
This parametrized test ensures all bulk operations work correctly:
693-
- get_hook_indices: returns sorted list of existing indices
694-
- get_hook_values: returns SparseArray with values
695-
- set_hooks: sets multiple hooks at once
696-
- clear_hook: removes all indexed values
697-
- append_hook: appends at next available index
698-
"""
699-
session = server.new_session(session_name="test_bulk_ops")
579+
@pytest.mark.parametrize("test_case", _build_set_hooks_params())
580+
def test_set_hooks(server: Server, test_case: SetHooksTestCase) -> None:
581+
"""Test set_hooks operations."""
582+
session = server.new_session(session_name="test_set_hooks")
700583

701584
# Setup initial hooks
702585
for idx, val in test_case.setup_hooks.items():
703586
session.set_hook(f"{test_case.hook}[{idx}]", val)
704587

705-
# Perform operation based on type
706-
if test_case.operation == "get_indices":
707-
result = session.get_hook_indices(test_case.hook)
708-
assert result == test_case.expected_indices
709-
710-
elif test_case.operation == "get_values":
711-
values = session.get_hook_values(test_case.hook)
712-
assert isinstance(values, SparseArray)
713-
assert sorted(values.keys()) == test_case.expected_indices
714-
if test_case.expected_contains:
715-
for expected_str in test_case.expected_contains:
716-
assert any(expected_str in v for v in values.values())
717-
718-
elif test_case.operation == "set_bulk":
719-
session.set_hooks(test_case.hook, **test_case.operation_args)
720-
indices = session.get_hook_indices(test_case.hook)
721-
assert indices == test_case.expected_indices
722-
if test_case.expected_contains:
723-
values = session.get_hook_values(test_case.hook)
724-
for expected_str in test_case.expected_contains:
725-
assert any(expected_str in v for v in values.values())
726-
727-
elif test_case.operation == "clear":
728-
session.clear_hook(test_case.hook)
729-
indices = session.get_hook_indices(test_case.hook)
730-
assert indices == test_case.expected_indices
731-
732-
elif test_case.operation == "append":
733-
session.append_hook(test_case.hook, test_case.operation_args["value"])
734-
indices = session.get_hook_indices(test_case.hook)
735-
assert indices == test_case.expected_indices
736-
if test_case.expected_contains:
737-
values = session.get_hook_values(test_case.hook)
738-
for expected_str in test_case.expected_contains:
739-
assert any(expected_str in v for v in values.values())
588+
# Perform set_hooks
589+
session.set_hooks(test_case.hook, **test_case.operation_args)
590+
591+
# Verify via show_hook
592+
hooks = session.show_hook(test_case.hook)
593+
assert hooks is not None
594+
assert isinstance(hooks, SparseArray)
595+
assert sorted(hooks.keys()) == test_case.expected_indices
596+
597+
if test_case.expected_contains:
598+
for expected_str in test_case.expected_contains:
599+
assert any(expected_str in v for v in hooks.values())
740600

741601
# Cleanup
742-
session.clear_hook(test_case.hook)
602+
session.unset_hook(test_case.hook)
743603

744604

745-
def test_bulk_hook_values_iteration(server: Server) -> None:
746-
"""Test iterating over hook values in sorted order."""
747-
session = server.new_session(session_name="test_bulk_ops")
605+
def test_show_hook_returns_sparse_array(server: Server) -> None:
606+
"""Test that show_hook returns SparseArray for array hooks."""
607+
session = server.new_session(session_name="test_show_hook")
748608

749609
# Set hooks at sparse indices (out of order)
750610
session.set_hook("session-renamed[5]", "display-message 'fifth'")
751611
session.set_hook("session-renamed[0]", "display-message 'zeroth'")
752612
session.set_hook("session-renamed[2]", "display-message 'second'")
753613

754-
values = session.get_hook_values("session-renamed")
755-
value_list = list(values.iter_values())
614+
hooks = session.show_hook("session-renamed")
615+
assert hooks is not None
616+
assert isinstance(hooks, SparseArray)
756617

757-
# Values should be in sorted index order
618+
# Check keys (indices)
619+
assert sorted(hooks.keys()) == [0, 2, 5]
620+
621+
# Check values via iter_values (sorted order)
622+
value_list = list(hooks.iter_values())
758623
assert len(value_list) == 3
759624
assert "zeroth" in value_list[0]
760625
assert "second" in value_list[1]
761626
assert "fifth" in value_list[2]
762627

763628
# Cleanup
764-
session.clear_hook("session-renamed")
629+
session.unset_hook("session-renamed")
765630

766631

767-
def test_bulk_hook_set_with_sparse_array(server: Server) -> None:
632+
def test_set_hooks_with_sparse_array(server: Server) -> None:
768633
"""Test set_hooks with SparseArray input."""
769-
session = server.new_session(session_name="test_bulk_ops")
634+
session = server.new_session(session_name="test_set_hooks_sparse")
770635

771636
sparse: SparseArray[str] = SparseArray()
772637
sparse.add(0, "display-message 'from sparse 0'")
773638
sparse.add(10, "display-message 'from sparse 10'")
774639

775640
session.set_hooks("session-renamed", sparse)
776641

777-
indices = session.get_hook_indices("session-renamed")
778-
assert indices == [0, 10]
642+
hooks = session.show_hook("session-renamed")
643+
assert hooks is not None
644+
assert isinstance(hooks, SparseArray)
645+
assert sorted(hooks.keys()) == [0, 10]
779646

780647
# Cleanup
781-
session.clear_hook("session-renamed")
648+
session.unset_hook("session-renamed")
782649

783650

784-
def test_bulk_hook_method_chaining(server: Server) -> None:
785-
"""Test that bulk operations support method chaining."""
786-
session = server.new_session(session_name="test_bulk_ops")
651+
def test_set_hooks_method_chaining(server: Server) -> None:
652+
"""Test that set_hooks supports method chaining."""
653+
session = server.new_session(session_name="test_set_hooks_chain")
787654

788-
# Chain operations
655+
# Chain set_hooks with set_hook (append=True)
789656
result = (
790657
session.set_hooks(
791658
"session-renamed",
792659
["display-message 'hook 0'"],
793660
)
794-
.append_hook("session-renamed", "display-message 'hook 1'")
795-
.append_hook("session-renamed", "display-message 'hook 2'")
661+
.set_hook("session-renamed", "display-message 'hook 1'", append=True)
662+
.set_hook("session-renamed", "display-message 'hook 2'", append=True)
796663
)
797664

798665
# Should return the session
799666
assert result is session
800667

801-
# Verify all hooks set
802-
indices = session.get_hook_indices("session-renamed")
803-
assert indices == [0, 1, 2]
668+
# Verify all hooks set via show_hook
669+
hooks = session.show_hook("session-renamed")
670+
assert hooks is not None
671+
assert isinstance(hooks, SparseArray)
672+
assert sorted(hooks.keys()) == [0, 1, 2]
673+
674+
# Cleanup
675+
session.unset_hook("session-renamed")
676+
677+
678+
def test_unset_hook_clears_all_indices(server: Server) -> None:
679+
"""Test that unset_hook without index clears all hook indices."""
680+
session = server.new_session(session_name="test_unset_hook")
681+
682+
# Set hooks at multiple indices
683+
session.set_hook("session-renamed[0]", "display-message 'hook 0'")
684+
session.set_hook("session-renamed[5]", "display-message 'hook 5'")
685+
session.set_hook("session-renamed[10]", "display-message 'hook 10'")
686+
687+
# Verify hooks exist
688+
hooks = session.show_hook("session-renamed")
689+
assert hooks is not None
690+
assert isinstance(hooks, SparseArray)
691+
assert sorted(hooks.keys()) == [0, 5, 10]
692+
693+
# Unset without index should clear all
694+
session.unset_hook("session-renamed")
695+
696+
# Verify hooks are cleared
697+
hooks_after = session.show_hook("session-renamed")
698+
assert hooks_after is None or (
699+
isinstance(hooks_after, SparseArray) and len(hooks_after) == 0
700+
)
701+
702+
703+
def test_set_hook_append_flag(server: Server) -> None:
704+
"""Test set_hook with append=True uses tmux's -a flag."""
705+
session = server.new_session(session_name="test_append_flag")
706+
707+
# Set initial hook
708+
session.set_hook("session-renamed[0]", "display-message 'initial'")
709+
710+
# Append using set_hook with append=True
711+
session.set_hook("session-renamed", "display-message 'appended'", append=True)
712+
713+
# Verify both hooks exist
714+
hooks = session.show_hook("session-renamed")
715+
assert hooks is not None
716+
assert isinstance(hooks, SparseArray)
717+
assert len(hooks) == 2
804718

805719
# Cleanup
806-
session.clear_hook("session-renamed")
720+
session.unset_hook("session-renamed")

0 commit comments

Comments
 (0)