package web import ( "context" "errors" "net/http" "net/url" "strings" "testing" "nasmon/internal/shares" ) // shareRunner fakes the host runner for the shares manager. type shareRunner struct { calls []string stdin map[string]string fail string users string } func (f *shareRunner) run(_ context.Context, stdin, name string, args ...string) (string, error) { c := name + " " + strings.Join(args, " ") f.calls = append(f.calls, c) if stdin != "" { if f.stdin == nil { f.stdin = map[string]string{} } f.stdin[c] = stdin } if f.fail != "" && strings.HasPrefix(c, f.fail) { return "boom: " + f.fail, errors.New("boom: " + f.fail) } if strings.HasPrefix(c, "pdbedit -L") { return f.users, nil } return "", nil } func (f *shareRunner) has(prefix string) bool { for _, c := range f.calls { if strings.HasPrefix(c, prefix) { return true } } return false } func (f *shareRunner) written(path string) string { for k, v := range f.stdin { if strings.Contains(k, path) { return v } } return "" } func withShareRunner(srv *Server, f *shareRunner) { srv.shm = shares.New(f.run) srv.shm.LookPath = func(string) (string, error) { return "/usr/sbin/x", nil } srv.shm.Owner, srv.shm.UID, srv.shm.GID = "ansible", "1000", "1000" srv.shm.IncludeDir, srv.shm.ExportsDir = "", "" } func TestSharesSMBFlow(t *testing.T) { srv, _, _ := newTestServer(t) f := &shareRunner{users: "alice:1001:\n"} withShareRunner(srv, f) // page lists users and mountpoints, prefills from ?path= body := get(srv, "/shares?path=/tank/data").Body.String() for _, want := range []string{`value="/tank/data"`, `value="data"`, `value="alice"`, "No SMB shares yet", `