a73x

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)
	}
}