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

readonly ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
# shellcheck source=../lib/package-owner.sh
. "${ROOT}/lib/package-owner.sh"

workspace=$(mktemp -d)
trap 'rm -rf -- "${workspace}"' EXIT
mirror="${workspace}/repo"
mkdir -p "${mirror}/tests/e2e" "${mirror}/src"

assert_owner() {
  local expected=$1 rel=$2
  shift 2
  actual=$(find_package_owner "${mirror}" "${rel}" "$@")
  [[ "${actual}" == "${expected}" ]] || {
    printf 'Expected owner %s, got %s\n' "${expected}" "${actual}" >&2
    exit 1
  }
}

printf '{}\n' >"${mirror}/package.json"
printf '{}\n' >"${mirror}/package-lock.json"
assert_owner "${mirror}" "src" node test.js

rm "${mirror}/package.json" "${mirror}/package-lock.json"
printf '{}\n' >"${mirror}/tests/e2e/package.json"
printf '{}\n' >"${mirror}/tests/e2e/package-lock.json"
printf '#!/usr/bin/env bash\n' >"${mirror}/tests/e2e/run-playwright.sh"
assert_owner "${mirror}/tests/e2e" "" tests/e2e/run-playwright.sh test visual.spec.js

rm "${mirror}/tests/e2e/package-lock.json"
printf '{}\n' >"${mirror}/composer.lock"
assert_owner "${mirror}" "src" vendor/bin/phpunit tests/Unit/FooTest.php

# A PHP lockfile at the root must not shadow a nested JS test package: the cwd
# walk would otherwise claim the root and never reach the argument scan, leaving
# a workspace root the runner never installs (no node_modules/.bin to run).
printf '{}\n' >"${mirror}/tests/e2e/package-lock.json"
assert_owner "${mirror}/tests/e2e" "" pnpm --dir tests/e2e exec playwright test --project=chromium
rm "${mirror}/tests/e2e/package-lock.json"

rm "${mirror}/composer.lock"
printf '{}\n' >"${mirror}/tests/e2e/package-lock.json"
assert_owner "${mirror}/tests/e2e" "" -c "cd tests/e2e && npm test -- --runInBand"
rm "${mirror}/tests/e2e/package-lock.json"

if find_package_owner "${mirror}" "" tests/e2e/run-playwright.sh >/dev/null; then
  printf 'Missing package lock was accepted.\n' >&2
  exit 1
fi

printf 'package-owner tests passed\n'
