#!/usr/bin/env bats # Tests for lib/common.sh — core utilities load test_helper.sh setup() { source_lib common.sh } # ── PROJECT_ROOT detection ─────────────────────────────── @test "PROJECT_ROOT points to a directory containing Makefile" { [ -f "$PROJECT_ROOT/Makefile" ] } @test "PROJECT_ROOT is not the filesystem root" { [ "$PROJECT_ROOT" != "/" ] } # ── is_cmd ─────────────────────────────────────────────── @test "is_cmd: bash exists" { run is_cmd bash assert_success } @test "is_cmd: nonexistent command fails" { run is_cmd this_command_does_not_exist_xyz123 assert_failure } @test "is_cmd: empty argument fails" { run is_cmd "" assert_failure } # ── timestamp ──────────────────────────────────────────── @test "timestamp: returns YYYYMMDD-HHMMSS format" { run timestamp assert_success [[ "$output" =~ ^[0-9]{8}-[0-9]{6}$ ]] } @test "timestamp: returns a reasonable date (not epoch)" { local ts ts="$(timestamp)" local year="${ts:0:4}" (( year >= 2025 )) } # ── data_dir ───────────────────────────────────────────── @test "data_dir: creates directory and returns path" { local subdir="test-bats-$$-$RANDOM" local dir dir="$(data_dir "$subdir")" [ -d "$dir" ] rmdir "$dir" 2>/dev/null || true } @test "data_dir: returns path under PROJECT_ROOT/data" { local dir dir="$(data_dir "testdir")" [[ "$dir" == "$PROJECT_ROOT/data/testdir" ]] rmdir "$dir" 2>/dev/null || true } # ── logging functions produce output ───────────────────── @test "log_info: produces output" { run log_info "test message" assert_success assert_output --partial "test message" } @test "log_success: produces output" { run log_success "it worked" assert_success assert_output --partial "it worked" } @test "log_warn: produces output" { run log_warn "warning" assert_success assert_output --partial "warning" } @test "log_error: produces output on stderr" { run log_error "failure" assert_success # log_error writes to stderr but bats captures both assert_output --partial "failure" } @test "log_header: produces output with delimiters" { run log_header "Section Title" assert_success assert_output --partial "Section Title" } # ── Color handling ─────────────────────────────────────── @test "colors are empty strings when not a terminal" { export TERM=dumb # Re-source to pick up non-terminal detection unset RED GREEN YELLOW BLUE CYAN BOLD DIM RESET source_lib common.sh # When stdout is not a tty (as in bats), colors should be empty [ -z "$RED" ] } # ── require_root ───────────────────────────────────────── @test "require_root: exits with error when not root" { # We're not running tests as root if [ "$EUID" -eq 0 ]; then skip "Test must not run as root" fi run require_root assert_failure assert_output --partial "root" }