panel v0.9.2 — open-source game server manager
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user