#!/usr/bin/env bash
set -euo pipefail

assert_rejected() {
  local expected_text="$1"
  shift

  set +e
  output="$("$@" 2>&1)"
  status=$?
  set -e

  if [[ "$status" -ne 64 ]]; then
    printf 'Expected status 64. Actual status: %s\n' "$status" >&2
    exit 1
  fi
  if [[ "$output" != *"$expected_text"* ]]; then
    printf 'Expected error text: %s\n' "$expected_text" >&2
    printf 'Actual error text: %s\n' "$output" >&2
    exit 1
  fi
}

assert_rejected \
  'Command is not in the read-only allowlist.' \
  ./scripts/wp-read.sh plugin install akismet
assert_rejected \
  'WP-CLI global execution options are not allowed.' \
  ./scripts/wp-read.sh core version --exec=bad
assert_rejected \
  'Only read-only SQL is allowed.' \
  ./scripts/db-read.sh "UPDATE wp_options SET option_value='x'"
assert_rejected \
  'Multiple SQL statements are not allowed.' \
  ./scripts/db-read.sh 'SELECT 1; DELETE FROM wp_posts'
assert_rejected \
  'SQL file writes are not allowed.' \
  ./scripts/db-read.sh "SELECT 'x' INTO OUTFILE '/tmp/x'"
assert_rejected \
  'SQL comments are not allowed.' \
  ./scripts/db-read.sh "SELECT 1 INTO/**/OUTFILE '/tmp/x'"
assert_rejected \
  'SQL comments are not allowed.' \
  ./scripts/db-read.sh "SELECT 1 INTO/*comment*/DUMPFILE '/tmp/x'"
assert_rejected \
  'SQL comments are not allowed.' \
  ./scripts/db-read.sh $'SELECT 1 INTO -- comment\nOUTFILE \"/tmp/x\"'
assert_rejected \
  'SQL comments are not allowed.' \
  ./scripts/db-read.sh $'SELECT 1 INTO#comment\nOUTFILE \"/tmp/x\"'

printf 'Read-only guard tests passed.\n'
