#! /usr/bin/env bash
## SPDX-FileCopyrightText: 2025 Gergely Nagy
## SPDX-FileContributor: Gergely Nagy
##
## SPDX-License-Identifier: MIT

set -euo pipefail

TESTER_BIN="${TESTER_BIN:-cargo run -q --bin iocaine-handler-test --}"
FENNEL_COMPILER="${FENNEL_COMPILER:-}"
test_count=0
fail_count=0

_GARBAGE="Ok(Garbage)"
_CHALLENGE="Ok(Challenge)"
_NOTFORUS="Err(NotForUs)"

function assert_for_language() {
  local lang="$1"
  shift
  local desc="$1"
  shift
  local expected="$1"
  shift
  result="$(${TESTER_BIN} --script-language="${lang}" --script-path=tests/data/scripting/"${lang}" "$@")"

  test_count=$((test_count + 1))
  if [ "$result" != "$expected" ]; then
    fail_count=$((fail_count + 1))
    echo "not ok ${test_count} - ${desc}"
    cat >&2 <<EOF
# assertion failed:
#  expected: $expected
#  result: $result
EOF
  else
    echo "ok ${test_count} - ${desc}"
  fi
}

function assert_npc_request() {
  local desc="$1"
  shift
  assert_for_language roto "$desc (roto)" "$@"
  assert_for_language lua "$desc (lua)" "$@"

  if [ -n "${FENNEL_COMPILER}" ]; then
    expected="$1"
    shift
    assert_for_language fennel "$desc (fennel)" "$expected" -o compiler="${FENNEL_COMPILER}" "$@"
  else
    test_count=$((test_count + 1))
    echo "ok ${test_count} - ${desc} # skip: fennel compiler unavailable"
  fi
}

assert_npc_request "user agent" "$_GARBAGE" -A "iocaine-test::bad-agent"
assert_npc_request "request method" "$_GARBAGE" -M INVALID
assert_npc_request "path" "$_GARBAGE" --path "cgi-bin/guestbook.pl"
assert_npc_request "query string: good" "$_GARBAGE" --query "capitalism=good"
assert_npc_request "query string: bad" "$_NOTFORUS" --query "capitalism=bad"
assert_npc_request "query string: dunno" "$_CHALLENGE" --query "capitalism=dunno"
assert_npc_request "cookie" "$_GARBAGE" --header "cookie=tracking-id=27346cef-91ee-45b3-8143-bbf31b5225fc"
assert_npc_request "patterns" "$_GARBAGE" -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
assert_npc_request "regexes" "$_GARBAGE" -A "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8"
assert_npc_request "network prefix" "$_GARBAGE" --header "x-forwarded-for=207.241.237.99"
assert_npc_request "json load" "$_GARBAGE" -A "aggressive-scraper"
assert_npc_request "valid request" "$_NOTFORUS"

echo "1..${test_count}"

if [ "$fail_count" -ne 0 ]; then
  exit 1
fi
