package cli import ( "bytes" "context" "fmt" "strings" "testing" ) func TestTarget(t *testing.T) { for in, want := range map[string]string{"3000": "127.0.0.1:3000", ":8080": "127.0.0.1:8080", "db.lan:5432": "db.lan:5432", "[::1]:80": "::1:80"} { h, p, err := target(in) if err != nil || fmt.Sprintf("%s:%d", h, p) != want { t.Errorf("%q -> %s:%d, %v", in, h, p, err) } } for _, bad := range []string{"", "abc", "0", "70000", "host:"} { if _, _, err := target(bad); err == nil { t.Errorf("%q accepted", bad) } } } func TestUsageErrors(t *testing.T) { t.Setenv("SHARK_CONFIG", t.TempDir()+"/none.json") t.Setenv("SHARK_HAMMERHEAD", "") t.Setenv("SHARK_TOKEN", "") for name, args := range map[string][]string{ "no command": {}, "unknown": {"fly"}, "no port": {"expose"}, "bad port": {"expose", "abc"}, "bad proto": {"expose", "udp", "5"}, "tcp password": {"expose", "tcp", "5", "--password", "secret1"}, "not signed in": {"expose", "3000"}, } { var out, errb bytes.Buffer if code := Run(context.Background(), args, &out, &errb); code == 0 { t.Errorf("%s: exit 0", name) } } var out, errb bytes.Buffer if code := Run(context.Background(), []string{"expose", "3000"}, &out, &errb); code == 0 || !strings.Contains(errb.String(), "shark login") { t.Errorf("signed-out hint missing: %q", errb.String()) } }