internal/cli/main_test.go
Ref: Size: 2.3 KiB History
package cli
import (
"bytes"
"errors"
"strings"
"testing"
)
func TestMainDispatch(t *testing.T) {
var out bytes.Buffer
if err := Main(nil, &out); !errors.Is(err, ErrUsage) {
t.Errorf("no args: got %v, want ErrUsage", err)
}
if err := Main([]string{"frobnicate"}, &out); !errors.Is(err, ErrUsage) {
t.Errorf("unknown subcommand: got %v, want ErrUsage", err)
}
// `ssh -h` prints usage and succeeds (exit 0), it is not an error.
if err := Main([]string{"ssh", "-h"}, &out); err != nil {
t.Errorf("ssh -h: %v", err)
}
if !strings.Contains(out.String(), "eitri ssh <vm>") {
t.Errorf("ssh -h must print usage, got %q", out.String())
}
if err := Main([]string{"ssh"}, &out); err == nil {
t.Error("bare ssh must error with usage")
}
}
// TestRunCATenantResolution pins how `eitri ca upload` finds its tenant: a
// leading positional pins it, EITRI_TENANT is the fallback, and with neither the
// token names it — no tenant is needed. EITRI_URL defaults to the hosted
// service, so the only network variable left to require is EITRI_TOKEN; each
// path reaching that check proves tenant resolution passed rather than
// short-circuiting on a missing tenant.
func TestRunCATenantResolution(t *testing.T) {
var out bytes.Buffer
t.Setenv("EITRI_URL", "")
t.Setenv("EITRI_TOKEN", "")
t.Setenv("EITRI_TENANT", "")
if err := Main([]string{"ca"}, &out); err == nil || !strings.Contains(err.Error(), "usage:") {
t.Errorf("bare ca: got %v", err)
}
if err := Main([]string{"ca", "upload"}, &out); err == nil || !strings.Contains(err.Error(), "usage:") {
t.Errorf("upload with no args: got %v", err)
}
// One arg, no EITRI_TENANT: the token names the tenant, so resolution is not
// an error — it falls through to the token check.
err := Main([]string{"ca", "upload", "ca.pub"}, &out)
if err == nil || !strings.Contains(err.Error(), "EITRI_TOKEN") {
t.Errorf("token-named tenant: got %v", err)
}
// Two args pin the tenant explicitly; still falls through to the token check.
err = Main([]string{"ca", "upload", "acme", "ca.pub"}, &out)
if err == nil || !strings.Contains(err.Error(), "EITRI_TOKEN") {
t.Errorf("positional tenant: got %v", err)
}
t.Setenv("EITRI_TENANT", "acme")
err = Main([]string{"ca", "upload", "ca.pub"}, &out)
if err == nil || !strings.Contains(err.Error(), "EITRI_TOKEN") {
t.Errorf("env tenant: got %v", err)
}
}