#!/usr/bin/env bash # Tests for Fabric meta API # Covers: Fabric loader version resolution, installer version, download URL # Usage: ./tests/test_fabric.sh [mc_version] source "$(dirname "$0")/test_utils.sh" MC_VERSION="${1:-$(get_latest_mc_version)}" if [[ -z "$MC_VERSION" ]]; then echo "Could not determine MC version" exit 1 fi echo -e "\n${BOLD}Fabric API Tests (MC ${MC_VERSION})${NC}" echo "" # ---------- Fabric loader meta API ----------------------------------------- test_fabric_meta_reachable() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") assert_not_empty "$body" "Fabric meta body should not be empty" assert_json_valid "$body" "Fabric meta should be valid JSON" } test_fabric_meta_is_array() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local type type=$(echo "$body" | jq -r 'type') assert_equals "$type" "array" "Response should be a JSON array" } test_fabric_meta_has_entries() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local count count=$(echo "$body" | jq 'length') if [[ "$count" -gt 0 ]]; then return 0 else echo "ASSERT FAILED: Loader array should have entries, got ${count}" return 1 fi } test_fabric_loader_entry_has_version() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") assert_json_field "$body" '.[0].loader.version' "Loader entry should have .loader.version" } test_fabric_loader_version_is_semver() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local version version=$(echo "$body" | jq -r '.[0].loader.version') assert_matches "$version" "^[0-9]+\.[0-9]+\.[0-9]+" \ "Loader version '${version}' should be semver-like" } test_fabric_entry_has_required_fields() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") assert_json_field "$body" '.[0].loader.version' "Should have loader version" assert_json_field "$body" '.[0].loader.maven' "Should have loader maven coordinate" } test_fabric_loader_maven_coordinate() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local maven maven=$(echo "$body" | jq -r '.[0].loader.maven') assert_matches "$maven" "^net.fabricmc:fabric-loader:" \ "Maven coordinate should be net.fabricmc:fabric-loader:{version}" } test_fabric_loader_has_stable_flag() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local stable stable=$(echo "$body" | jq -r '.[0].loader.stable') assert_matches "$stable" "^(true|false)$" "Stable flag should be true or false" } test_fabric_has_intermediary() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") assert_json_field "$body" '.[0].intermediary.version' "Should have intermediary version" } # ---------- Fabric installer metadata (Maven XML) ------------------------- test_fabric_installer_metadata_reachable() { local body body=$(api_get "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml") assert_not_empty "$body" "Installer metadata should not be empty" } test_fabric_installer_metadata_is_xml() { local body body=$(api_get "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml") assert_contains "$body" "" "Should be valid XML with root" } test_fabric_installer_has_latest() { local body body=$(api_get "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml") local latest latest=$(echo "$body" | xmllint --xpath "/metadata/versioning/latest/text()" - 2>/dev/null) assert_not_empty "$latest" "Installer should have a latest version" } test_fabric_installer_latest_is_semver() { local body body=$(api_get "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml") local latest latest=$(echo "$body" | xmllint --xpath "/metadata/versioning/latest/text()" - 2>/dev/null) assert_matches "$latest" "^[0-9]+\.[0-9]+\.[0-9]+" \ "Installer version '${latest}' should be semver-like" } # ---------- Fabric server jar download URL --------------------------------- test_fabric_download_url_format() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local loader_version loader_version=$(echo "$body" | jq -r '.[0].loader.version') local installer_body installer_body=$(api_get "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml") local installer_version installer_version=$(echo "$installer_body" | xmllint --xpath "/metadata/versioning/latest/text()" - 2>/dev/null) local expected_url="https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}/${loader_version}/${installer_version}/server/jar" assert_not_empty "$expected_url" "Constructed URL should not be empty" assert_matches "$expected_url" "^https://meta.fabricmc.net/v2/versions/loader/" \ "URL should start with Fabric meta base" } test_fabric_download_url_reachable() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local loader_version loader_version=$(echo "$body" | jq -r '.[0].loader.version') local installer_body installer_body=$(api_get "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml") local installer_version installer_version=$(echo "$installer_body" | xmllint --xpath "/metadata/versioning/latest/text()" - 2>/dev/null) local url="https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}/${loader_version}/${installer_version}/server/jar" assert_http_ok "$url" "Fabric server jar URL should return HTTP 200" } # ---------- Specific version spot checks ----------------------------------- test_fabric_known_1_20_4() { local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/1.20.4") local count count=$(echo "$body" | jq 'length') if [[ "$count" -gt 0 ]]; then return 0 else echo "ASSERT FAILED: Fabric should support MC 1.20.4" return 1 fi } test_fabric_latest_loader_version_gte() { # The latest loader version should be >= 0.14.0 (a known old version) local body body=$(api_get "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}") local version version=$(echo "$body" | jq -r '.[0].loader.version') assert_version_gte "$version" "0.14.0" "Latest loader version should be >= 0.14.0" } # ---------- Run all tests -------------------------------------------------- run_test "Fabric meta API is reachable and valid JSON" test_fabric_meta_reachable run_test "Response is a JSON array" test_fabric_meta_is_array run_test "Loader array has entries" test_fabric_meta_has_entries run_test "Loader entry has .loader.version" test_fabric_loader_entry_has_version run_test "Loader version is semver format" test_fabric_loader_version_is_semver run_test "Loader entry has required fields (version, maven)" test_fabric_entry_has_required_fields run_test "Loader maven coordinate is correct" test_fabric_loader_maven_coordinate run_test "Loader has stable flag" test_fabric_loader_has_stable_flag run_test "Entry has intermediary version" test_fabric_has_intermediary run_test "Installer maven-metadata.xml is reachable" test_fabric_installer_metadata_reachable run_test "Metadata is valid XML" test_fabric_installer_metadata_is_xml run_test "Metadata has latest version" test_fabric_installer_has_latest run_test "Installer latest version is semver" test_fabric_installer_latest_is_semver run_test "Download URL format is correct" test_fabric_download_url_format run_test "Download URL returns HTTP 200" test_fabric_download_url_reachable run_test "Fabric supports MC 1.20.4" test_fabric_known_1_20_4 run_test "Latest loader version >= 0.14.0" test_fabric_latest_loader_version_gte print_summary