#!/usr/bin/env bash

# GitLab lets the publisher give a release any `released_at` (a "historical
# release"), so a release created a moment ago can claim to be years old. The
# default 24h minimum_release_age has to go by when GitLab stored the release.
#
# Served from a local stand-in for the GitLab API so the test needs no network.

start_http_server --handler - <<'PY'
import datetime
import http.server
import json

NOW = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")


def release(tag, created_at, released_at):
    return {
        "tag_name": tag,
        "description": "",
        "created_at": created_at,
        "released_at": released_at,
        "assets": {
            "sources": [],
            "links": [
                {
                    "id": 1,
                    "name": "tool-linux-x64.tar.gz",
                    "url": "https://example.invalid/tool.tar.gz",
                    "direct_asset_url": "https://example.invalid/tool.tar.gz",
                    "link_type": "package",
                }
            ],
        },
    }


OLD = release("v1.0.0", "2024-01-01T00:00:00.000Z", "2024-01-01T00:00:00.000Z")
NEW = {
    "honest": release("v2.0.0", NOW, NOW),
    "backdated": release("v2.0.0", NOW, "2024-06-01T00:00:00.000Z"),
}


class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        # /api/v4/projects/acme%2F<project>/releases
        project = self.path.split("?")[0].split("/")[-2].split("%2F")[-1]
        body = json.dumps([NEW[project], OLD]).encode()
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.send_header("Content-Length", str(len(body)))
        self.end_headers()
        self.wfile.write(body)
PY

export MISE_USE_VERSIONS_HOST=0
API_URL="http://127.0.0.1:$HTTP_PORT/api/v4"

for backend in gitlab ubi spm; do
  for project in honest backdated; do
    TOOL="${backend}:acme/${project}[provider=gitlab,api_url=${API_URL}]"

    assert_contains "mise latest '$TOOL'" "1.0.0"
    # The new release is on offer, so the line above is the cutoff's doing.
    assert_contains "MISE_MINIMUM_RELEASE_AGE=0s mise latest '$TOOL'" "2.0.0"
  done
done
