tmux-party/tests/45-group-select.bats
veg 7770289d85 feat: auto-select the gating group; 'party' becomes the fallback
Bare 'party host' now walks staff, users, wheel, party and gates on
the first group the caller belongs to, announcing the pick. Boxes
where people already share a system group need no setup; the curated
'party' group remains the fallback and the explicit --group /
TMUX_PARTY_GROUP paths are unchanged. Caller membership is the only
probe (id -nG, portable everywhere); whether a guest is a member stays
an invite-time warning, where it can actually be answered.
2026-07-11 12:20:35 +00:00

85 lines
2.4 KiB
Bash

#!/usr/bin/env bats
#
# Group auto-selection. When neither --group nor TMUX_PARTY_GROUP names
# a group, cmd_host walks PARTY_GROUP_CANDIDATES and gates on the first
# group the caller belongs to; 'party' is the last candidate, a
# fallback rather than a hardcoded default.
load 'helpers'
setup() {
setup_party_sandbox
load_party_lib
}
teardown() { teardown_party_sandbox; }
# Put a stub id(1) on PATH whose -nG answer is $1; every other
# invocation falls through to the real id.
stub_id_groups() {
mkdir -p "$PARTY_TMP/bin"
real_id=$(command -v id)
{ printf '#!/bin/sh\n'
printf 'case "$1" in\n'
printf ' -nG) echo "%s" ;;\n' "$1"
printf ' *) exec %s "$@" ;;\n' "$real_id"
printf 'esac\n'
} > "$PARTY_TMP/bin/id"
chmod +x "$PARTY_TMP/bin/id"
PATH="$PARTY_TMP/bin:$PATH"
}
@test "pick_host_group prefers staff over the party fallback" {
stub_id_groups "$USER staff party"
[ "$(pick_host_group)" = staff ]
}
@test "pick_host_group walks candidates in order: users beats wheel" {
stub_id_groups "wheel users"
[ "$(pick_host_group)" = users ]
}
@test "pick_host_group falls back to party" {
stub_id_groups "$USER dialout party"
[ "$(pick_host_group)" = party ]
}
@test "pick_host_group fails when the caller is in no candidate" {
stub_id_groups "$USER dialout"
run pick_host_group
[ "$status" -ne 0 ]
[ -z "$output" ]
}
@test "PARTY_GROUP_CANDIDATES env overrides the candidate list" {
stub_id_groups "$USER randomgrp"
PARTY_GROUP_CANDIDATES="randomgrp party" \
run pick_host_group
[ "$output" = randomgrp ]
}
@test "host auto-selects the caller's group, announces it, records it" {
unset TMUX_PARTY_GROUP
export PARTY_GROUP_CANDIDATES="$(id -gn) party"
run "$PARTY_BIN" host autosel
[ "$status" -eq 0 ]
[[ "$output" == *"gating on group '$(id -gn)'"* ]]
grep -qx "GROUP=$(id -gn)" \
"$PARTY_SOCKET_DIR/party-$USER:autosel.d/roster"
}
@test "explicit TMUX_PARTY_GROUP disables auto-selection" {
export TMUX_PARTY_GROUP="$(id -gn)"
run "$PARTY_BIN" host explicit-env
[ "$status" -eq 0 ]
[[ "$output" != *"auto-selected"* ]]
}
@test "host in no candidate group gets the remediation message" {
unset TMUX_PARTY_GROUP
export PARTY_GROUP_CANDIDATES="no-such-group-xyzzy"
run "$PARTY_BIN" host nogroup
[ "$status" -eq 1 ]
[[ "$output" == *"not in the 'party' group"* ]]
[[ "$output" == *"--group"* ]]
}