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

ROOT=$(cd "$(dirname "$0")/../.." && pwd)
# shellcheck source=../lib/delivery-manifests.sh
source "$ROOT/packaging/lib/delivery-manifests.sh"
TMP=$(mktemp -d "${TMPDIR:-/tmp}/delivery-manifests-test.XXXXXX")
trap 'rm -rf "$TMP"' EXIT
REPO="$TMP/repo"
MANIFESTS="$TMP/manifests"
mkdir -p "$REPO" "$MANIFESTS"
git -C "$REPO" init -q
git -C "$REPO" config user.email test@example.invalid
git -C "$REPO" config user.name Test

commit_file() {
  local name=$1 message=$2
  printf '%s\n' "$name" > "$REPO/file"
  git -C "$REPO" add file
  git -C "$REPO" commit -q -m "$message"
  git -C "$REPO" rev-parse HEAD
}

A=$(commit_file a "base")
B=$(commit_file b "request-fake-in-prose")
C=$(commit_file c "release")
printf '%s\n' request-one request-two > "$MANIFESTS/$B.requests"
printf '%s\n' request-two request-three > "$MANIFESTS/$C.requests"

ids=()
delivery_manifest_collect "$REPO" "$MANIFESTS" "$A" "$C" ids
[[ "${ids[*]}" == "request-one request-two request-three" ]] || {
  printf 'unexpected range membership: %s\n' "${ids[*]}" >&2
  exit 1
}

# Without a trustworthy previous deployed commit, only the target manifest is authoritative.
ids=()
delivery_manifest_collect "$REPO" "$MANIFESTS" unavailable "$C" ids
[[ "${ids[*]}" == "request-two request-three" ]] || {
  printf 'unexpected target-only membership: %s\n' "${ids[*]}" >&2
  exit 1
}

printf '%s\n' 'not a request id' > "$MANIFESTS/$C.requests"
if delivery_manifest_collect "$REPO" "$MANIFESTS" "$A" "$C" ids; then
  printf 'corrupt manifest was accepted\n' >&2
  exit 1
fi

printf 'delivery manifest tests passed\n'
