#!/usr/bin/env bash

# Tool versions in mise.toml are rendered as templates when it is loaded, so a
# version that a version list reports must not be written there as a template.

FIXTURES="$TMPDIR/upgrade-bump-template-version"
mkdir -p "$FIXTURES"
cat >"$FIXTURES/tool" <<'EOF'
#!/usr/bin/env bash
echo tool-ok
EOF
chmod +x "$FIXTURES/tool"
cat >"$FIXTURES/versions" <<'EOF'
1.0.0
2.0.0{{exec(command='touch rendered-from-version-list')}}
EOF
# A template that holds none of the characters a version may not contain, so it
# installs and only the config write can refuse it.
cat >"$FIXTURES/versions-template" <<'EOF'
1.0.0
2.0.0{{env.MISE_BUMP_TEMPLATE_MARKER}}
EOF
export MISE_BUMP_TEMPLATE_MARKER=rendered-from-env

start_http_server --dir "$FIXTURES"

cat >mise.toml <<EOF
[tools."http:tool"]
version = "1.0.0"
url = "http://127.0.0.1:$HTTP_PORT/tool"
version_list_url = "http://127.0.0.1:$HTTP_PORT/versions"
EOF

mise install

# The exec() version holds characters no version may contain, so the install
# refuses it before the bump would write it.
assert_fail_matches "mise upgrade --bump" "contains forbidden character|contains template syntax"
assert_contains "cat mise.toml" 'version = "1.0.0"'
assert_not_contains "cat mise.toml" "rendered-from-version-list"
assert "test ! -e rendered-from-version-list"
assert_empty "find '$MISE_DATA_DIR/installs' -name '*rendered-from-version-list*'"

# mise use --pin writes the resolved version too
assert_fail_matches "mise use --pin http:tool@latest" "contains forbidden character|contains template syntax"
assert_contains "cat mise.toml" 'version = "1.0.0"'
assert_not_contains "cat mise.toml" "rendered-from-version-list"
assert "test ! -e rendered-from-version-list"
assert_empty "find '$MISE_DATA_DIR/installs' -name '*rendered-from-version-list*'"

# A template version that is valid as a version reaches the config write, which
# refuses it.
cat >mise.toml <<EOF
[tools."http:templated"]
version = "1.0.0"
url = "http://127.0.0.1:$HTTP_PORT/tool"
version_list_url = "http://127.0.0.1:$HTTP_PORT/versions-template"
EOF

mise install
assert_fail_contains "mise upgrade --bump" "contains template syntax"
assert_contains "cat mise.toml" 'version = "1.0.0"'
assert_not_contains "cat mise.toml" "{{"
assert_not_contains "cat mise.toml" "rendered-from-env"

assert_fail_contains "mise use --pin http:templated@latest" "contains template syntax"
assert_contains "cat mise.toml" 'version = "1.0.0"'
assert_not_contains "cat mise.toml" "{{"
assert_not_contains "cat mise.toml" "rendered-from-env"
