Files
panel/pkg/module/manifest_test.go
T
2026-07-14 19:22:07 -07:00

82 lines
2.3 KiB
Go

package module
import (
"path/filepath"
"testing"
"time"
)
// TestLoad7DTDManifest loads the real 7 Days to Die manifest shipped in
// modules/7dtd and asserts the panel-critical fields parsed correctly.
// Keeping this coupled to the real file (rather than a testdata copy) means
// changes to the shipped manifest must keep the test green.
func TestLoad7DTDManifest(t *testing.T) {
path := filepath.Join("..", "..", "modules", "7dtd", "module.yaml")
m, err := LoadFile(path)
if err != nil {
t.Fatalf("LoadFile: %v", err)
}
if m.ID != "7dtd" {
t.Errorf("id = %q, want 7dtd", m.ID)
}
if !m.HasMode("docker") {
t.Errorf("expected docker mode, got %v", m.SupportedModes)
}
if m.Runtime.Docker == nil || m.Runtime.Docker.Image == "" {
t.Error("expected docker runtime with image")
}
if m.RCON == nil || m.RCON.Adapter != "telnet" {
t.Errorf("rcon adapter = %+v, want telnet", m.RCON)
}
if p := m.Port("telnet"); p == nil || p.Proto != "tcp" || !p.Internal {
t.Errorf("telnet port malformed: %+v", p)
}
if up := m.UpdateProvider("stable"); up == nil || up.Kind != "steamcmd" || up.AppID != "294420" {
t.Errorf("stable update provider malformed: %+v", up)
}
if len(m.Events) < 3 {
t.Errorf("expected at least join/leave/chat events, got %d", len(m.Events))
}
// state_sources[0] should be rcon poll with a 30s cadence
if len(m.StateSources) == 0 {
t.Fatal("expected at least one state source")
}
ss := m.StateSources[0]
if ss.Type != "rcon" || ss.Command != "lp" {
t.Errorf("first state source = %+v, want rcon lp", ss)
}
if ss.Every.Std() != 30*time.Second {
t.Errorf("state source every = %v, want 30s", ss.Every.Std())
}
}
func TestLoadDirSkipsDirWithoutManifest(t *testing.T) {
// modules/ has 7dtd + minecraft-java + valheim dirs, but only 7dtd has a
// module.yaml right now. Loader should return 1 module.
dir := filepath.Join("..", "..", "modules")
ms, err := LoadDir(dir)
if err != nil {
t.Fatalf("LoadDir: %v", err)
}
if len(ms) < 1 {
t.Errorf("want >= 1 modules, got %d", len(ms))
}
found := false
for _, m := range ms {
if m.ID == "7dtd" {
found = true
}
}
if !found {
t.Error("7dtd not present in LoadDir result")
}
}
func TestValidateRejectsMissingID(t *testing.T) {
m := &Manifest{}
if err := m.Validate(); err == nil {
t.Error("expected validation error for empty manifest")
}
}