#!/usr/bin/env bash set -Eeuo pipefail umask 077 readonly TESTS_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=helpers.sh source "${TESTS_DIR}/helpers.sh" setup_test_environment begin_test 'sourcing entry point does not execute main' source_output=$(bash -c 'source "$1"; printf sourced' _ "${PROJECT_DIR}/wg-manager.sh") assert_equal sourced "$source_output" 'безопасная загрузка' begin_test 'help succeeds without root or dependencies' set +e help_output=$("${PROJECT_DIR}/wg-manager.sh" help 2>&1) help_status=$? set -e assert_success "$help_status" 'команда help' assert_contains 'Использование:' "$help_output" 'справка' begin_test 'unknown command fails' set +e unknown_output=$("${PROJECT_DIR}/wg-manager.sh" unknown 2>&1) unknown_status=$? set -e assert_failure "$unknown_status" 'неизвестная команда' assert_contains 'неизвестная команда' "$unknown_output" 'сообщение об ошибке' begin_test 'help works outside project directory' set +e outside_output=$(cd /tmp && "${PROJECT_DIR}/wg-manager.sh" help 2>&1) outside_status=$? set -e assert_success "$outside_status" 'запуск из /tmp' assert_contains 'Использование:' "$outside_output" 'справка из /tmp' begin_test 'mock guard accepts only explicitly supported empty invocation' set +e MOCK_ALLOW_EMPTY_INVOCATION=wg wg expected_mock_status=$? wg unapproved_empty_status=$? wg unexpected unexpected_mock_status=$? set -e assert_success "$expected_mock_status" 'разрешённый вызов мока' assert_failure "$unapproved_empty_status" 'неразрешённый пустой вызов мока' assert_failure "$unexpected_mock_status" 'неожиданный вызов мока' expected_mock_log=$'wg\nwg\nwg unexpected\n' actual_mock_log=$(<"$TEST_MOCK_LOG") actual_mock_log+=$'\n' assert_equal "$expected_mock_log" "$actual_mock_log" 'точный журнал вызовов мока' begin_test 'test writes stay below isolated root' assert_file_exists "${TEST_ROOT}/wg0.conf" 'копия фикстуры' assert_equal "$TEST_ROOT" "${TEST_MOCK_LOG%/*}" 'журнал находится в тестовом корне' scan_test_sources_for_host_path() { local forbidden_path='/etc' forbidden_path+='/wireguard' scan_path() { local path line for path in "$1"/*; do if [[ -d "$path" ]]; then scan_path "$path" elif [[ -f "$path" ]]; then while IFS= read -r line || [[ -n "$line" ]]; do if [[ "$line" == *"$forbidden_path"* ]]; then record_failure "тестовый файл содержит запрещённый путь: ${path}" return fi done <"$path" fi done } scan_path "$TESTS_DIR" } scan_test_sources_for_host_path finish_tests