#! /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 -- -c tests/config.kdl test decision}"
test_count=0
fail_count=0

_GARBAGE='Garbage'
_CHALLENGE='Challenge'
_NOTFORUS='NotForUs'

function assert_for_language() {
  local lang="$1"
  shift
  local desc="$1"
  shift
  local expected="$1"
  shift
  result="$(${TESTER_BIN} "$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)" "$@"
  assert_for_language fennel "$desc (fennel)" "$@"
}

assert_npc_request "user agent" "$_GARBAGE" -A "iocaine-test::bad-agent"
assert_npc_request "request method" "$_GARBAGE" -M INVALID
assert_npc_request "path" "$_GARBAGE" --url "/cgi-bin/guestbook.pl"
assert_npc_request "query string: good" "$_GARBAGE" --url "/?capitalism=good"
assert_npc_request "query string: bad" "$_NOTFORUS" --url "/?capitalism=bad"
assert_npc_request "query string: dunno" "$_CHALLENGE" --url "/?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 "regex sets: first match" "$_GARBAGE" -A "iocaine-test::malicious-agent"
assert_npc_request "regex sets: second match" "$_GARBAGE" -A "iocaine-test::terrible-agent"
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 "file load" "$_GARBAGE" -A "passive-scraper"
assert_npc_request "capture groups" "$_GARBAGE" -A "AppleWebKit/123.4 Safari/123"
assert_npc_request "Sec-CH-UA" "$_GARBAGE" --header 'sec-ch-ua="Not)A;Brand";v="8", "Chromium";v="138"'
assert_npc_request "valid request" "$_NOTFORUS"

echo "1..${test_count}"

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