Files
nadir-agent/internal/modules/groups/groups_handler_test.go
T
2026-06-22 16:06:57 +02:00

110 lines
2.9 KiB
Go

package groups
import (
"encoding/json"
"net/http"
"os"
"path/filepath"
"reflect"
"testing"
"nadir/internal/oscmd"
"github.com/danielgtaylor/huma/v2"
"github.com/danielgtaylor/huma/v2/adapters/humago"
"github.com/danielgtaylor/huma/v2/humatest"
)
func TestMain(m *testing.M) {
if oscmd.RunHelperProcess() {
return
}
os.Exit(m.Run())
}
func TestGroupsHandlers(t *testing.T) {
tempGroup := filepath.Join(t.TempDir(), "group")
initialContent := "root:x:0:\nwheel:x:10:alice,bob\n"
if err := os.WriteFile(tempGroup, []byte(initialContent), 0644); err != nil {
t.Fatal(err)
}
oldGroup := groupPath
groupPath = tempGroup
defer func() { groupPath = oldGroup }()
mux := http.NewServeMux()
api := humatest.Wrap(t, humago.New(mux, huma.DefaultConfig("Test", "1.0.0")))
registerGroups(api)
// 1. Test GET /api/groups
resp := api.Get("/api/groups")
if resp.Code != http.StatusOK {
t.Errorf("list groups: got %d, want %d", resp.Code, http.StatusOK)
}
var listRes ListGroupsOutput
if err := json.Unmarshal(resp.Body.Bytes(), &listRes.Body); err != nil {
t.Fatal(err)
}
if len(listRes.Body.Groups) != 2 {
t.Errorf("got %d groups, want 2", len(listRes.Body.Groups))
}
// 2. Test GET /api/groups/{group}
resp = api.Get("/api/groups/wheel")
if resp.Code != http.StatusOK {
t.Errorf("get group: got %d, want %d", resp.Code, http.StatusOK)
}
var getRes GetGroupOutput
if err := json.Unmarshal(resp.Body.Bytes(), &getRes.Body); err != nil {
t.Fatal(err)
}
if getRes.Body.Name != "wheel" || getRes.Body.GID != 10 {
t.Errorf("get group: got %+v", getRes.Body)
}
resp = api.Get("/api/groups/nonexistent")
if resp.Code != http.StatusNotFound {
t.Errorf("get non-existent group: got %d, want %d", resp.Code, http.StatusNotFound)
}
// 3. Test POST /api/groups
oscmd.SetMock("groupadd", func(args []string) oscmd.MockCommand {
wantArgs := []string{"-g", "1500", "--", "dev"}
if !reflect.DeepEqual(args, wantArgs) {
t.Errorf("groupadd args: got %v, want %v", args, wantArgs)
}
devContent := initialContent + "dev:x:1500:\n"
os.WriteFile(tempGroup, []byte(devContent), 0644)
return oscmd.MockCommand{ExitCode: 0}
})
defer oscmd.ClearMocks()
gidVal := 1500
resp = api.Post("/api/groups", struct {
Name string `json:"name"`
GID *int `json:"gid"`
}{
Name: "dev",
GID: &gidVal,
})
if resp.Code != http.StatusOK {
t.Errorf("create group: got %d, want %d", resp.Code, http.StatusOK)
}
// 4. Test DELETE /api/groups/{group}
oscmd.SetMock("groupdel", func(args []string) oscmd.MockCommand {
wantArgs := []string{"--", "dev"}
if !reflect.DeepEqual(args, wantArgs) {
t.Errorf("groupdel args: got %v, want %v", args, wantArgs)
}
os.WriteFile(tempGroup, []byte(initialContent), 0644)
return oscmd.MockCommand{ExitCode: 0}
})
resp = api.Delete("/api/groups/dev")
if resp.Code != http.StatusOK {
t.Errorf("delete group: got %d, want %d", resp.Code, http.StatusOK)
}
}