Files
packwiz/core/versionutil_test.go
2026-02-18 23:53:42 +01:00

136 lines
4.3 KiB
Go

package core
import (
"embed"
"os"
"slices"
"strings"
"testing"
"github.com/jarcoal/httpmock"
)
// For reproducability, we store a list of sample xml files for various endpoints
// these have been edited slightly to cut down on the number of entries, but are
// otherwise taken from the endpoints themselves
//go:embed version_test_files/*
var versionTestFiles embed.FS
func registerMock(url string, filename string) {
bytes, err := versionTestFiles.ReadFile("version_test_files/" + filename)
if err != nil {
println("Error " + filename + " not in version_test_files/")
os.Exit(1)
}
httpmock.RegisterResponder("GET", url, httpmock.NewBytesResponder(200, bytes))
}
func queryWithMock(t *testing.T, q VersionListQuery) *ModLoaderVersions {
httpmock.Activate(t)
registerMock("https://maven.fabricmc.net/net/fabricmc/fabric-loader/maven-metadata.xml", "fabric.xml")
registerMock("https://repo.mumfrey.com/content/repositories/snapshots/com/mumfrey/liteloader/maven-metadata.xml", "liteloader.xml")
registerMock("https://maven.quiltmc.org/repository/release/org/quiltmc/quilt-loader/maven-metadata.xml", "quilt.xml")
registerMock("https://files.minecraftforge.net/maven/net/minecraftforge/forge/maven-metadata.xml", "forge.xml")
registerMock("https://maven.neoforged.net/releases/net/neoforged/forge/maven-metadata.xml", "neoforge_old.xml")
registerMock("https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml", "neoforge.xml")
versionData, err := DoQuery(q)
if err != nil {
t.Logf("Error fetching versions for %s: %s", q.Loader.FriendlyName, err)
if strings.Contains(err.Error(), "no responder found") {
t.Log("You likely need to register a mock for this url")
}
t.FailNow()
}
return versionData
}
func expectLatest(t *testing.T, loader string, version string, expectedLatest string) string {
loaderData, ok := ModLoaders[loader]
if !ok {
t.Fatal("Could not find loader")
}
versionData := queryWithMock(t, MakeQuery(loaderData, version))
if len(versionData.Versions) == 0 {
t.Error("There should be at least one version")
}
if versionData.Latest != expectedLatest {
t.Errorf("Expected latest version to be %s, found %s", expectedLatest, versionData.Latest)
}
return versionData.Latest
}
func expectValid(t *testing.T, loader string, version string, expectedValid string) {
loaderData, ok := ModLoaders[loader]
if !ok {
t.Fatal("Could not find loader")
}
versionData := queryWithMock(t, MakeQuery(loaderData, version))
if !slices.Contains(versionData.Versions, expectedValid) {
t.Errorf("Expected %s to be a valid version for %s. Valid versions:\n%s", expectedValid, loaderData.FriendlyName, versionData.Versions)
}
}
func expectInvalid(t *testing.T, loader string, version string, expectedValid string) {
loaderData, ok := ModLoaders[loader]
if !ok {
t.Fatal("Could not find loader")
}
versionData := queryWithMock(t, MakeQuery(loaderData, version))
if slices.Contains(versionData.Versions, expectedValid) {
t.Errorf("Expected %s not to be a valid version for %s. Valid versions:\n%s", expectedValid, loaderData.FriendlyName, versionData.Versions)
}
}
func TestFabric121(t *testing.T) {
expectLatest(t, "fabric", "1.21", "0.17.3")
}
func TestFabric010Valid(t *testing.T) {
expectValid(t, "fabric", "1.21", "0.10.6+build.214")
}
func TestQuilt121(t *testing.T) {
expectLatest(t, "quilt", "1.21", "0.29.3-beta.1")
}
func TestForge121(t *testing.T) {
expectLatest(t, "forge", "1.21", "51.0.33")
}
func TestLiteLoader112(t *testing.T) {
expectLatest(t, "liteloader", "1.12", "1.12-SNAPSHOT")
}
func TestNeoForge1201(t *testing.T) {
expectLatest(t, "neoforge", "1.20.1", "47.1.106")
}
func TestNeoForge121(t *testing.T) {
expectLatest(t, "neoforge", "1.21", "21.0.167")
}
func TestNeoForge1211(t *testing.T) {
expectLatest(t, "neoforge", "1.21.1", "21.1.213")
expectValid(t, "neoforge", "1.21.1", "21.1.201")
expectInvalid(t, "neoforge", "1.21.1", "21.10.43-beta")
}
func TestNeoForge1210(t *testing.T) {
expectLatest(t, "neoforge", "1.21.10", "21.10.43-beta")
}
func TestNeoForge261snapshot6(t *testing.T) {
expectLatest(t, "neoforge", "26.1-snapshot-6", "26.1.0.0-alpha.10+snapshot-6")
expectValid(t, "neoforge", "26.1-snapshot-6", "26.1.0.0-alpha.9+snapshot-6")
expectInvalid(t, "neoforge", "26.1-snapshot-6", "26.1.0.0-alpha.11+snapshot-7")
}