The remediation-message test relied on the runner not being in group 'party'; on boxes where the runner is (the deployment hosts), host succeeded and the test failed. Route the child's id(1) through the suite's stub so the caller is deterministically in no candidate group.
86 lines
2.4 KiB
Bash
86 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" {
|
|
stub_id_groups "$USER dialout"
|
|
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"* ]]
|
|
}
|