Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cmd/heygen/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import "github.com/spf13/cobra"

func newAuthCmd(ctx *cmdContext) *cobra.Command {
cmd := &cobra.Command{
Use: "auth",
Short: "Manage authentication",
Annotations: map[string]string{"skipAuth": "true"},
Use: "auth",
Short: "Manage authentication",
}
cmd.AddCommand(newAuthLoginCmd(ctx))
cmd.AddCommand(newAuthStatusCmd(ctx))
return cmd
}
5 changes: 3 additions & 2 deletions cmd/heygen/auth_login.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ import (

func newAuthLoginCmd(ctx *cmdContext) *cobra.Command {
return &cobra.Command{
Use: "login",
Short: "Store API key for CLI authentication",
Use: "login",
Short: "Store API key for CLI authentication",
Annotations: map[string]string{"skipAuth": "true"},
Long: `Reads an API key from stdin and stores it for future CLI use.

Interactive:
Expand Down
29 changes: 29 additions & 0 deletions cmd/heygen/auth_status.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package main

import (
"net/url"

"github.com/heygen-com/heygen-cli/gen"
"github.com/heygen-com/heygen-cli/internal/client"
"github.com/heygen-com/heygen-cli/internal/command"
"github.com/spf13/cobra"
)

func newAuthStatusCmd(ctx *cmdContext) *cobra.Command {
return &cobra.Command{
Use: "status",
Short: "Verify stored API key and show account info",
Example: "heygen auth status",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
result, err := ctx.client.Execute(gen.UserMeGet, &command.Invocation{
PathParams: make(map[string]string),
QueryParams: make(url.Values),
})
if err != nil {
return err
}
return ctx.formatter.Data(result, client.APIDataField, nil)
},
}
}
78 changes: 78 additions & 0 deletions cmd/heygen/auth_status_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package main

import (
"encoding/json"
"strings"
"testing"

clierrors "github.com/heygen-com/heygen-cli/internal/errors"
)

func TestAuthStatus_Success(t *testing.T) {
srv := setupTestServer(t, map[string]testHandler{
"GET /v3/user/me": {
StatusCode: 200,
Body: `{"data":{"email":"[email protected]","username":"demo"}}`,
},
})
defer srv.Close()

res := runCommand(t, srv.URL, "test-key", "auth", "status")

if res.ExitCode != 0 {
t.Fatalf("ExitCode = %d, want 0\nstderr: %s", res.ExitCode, res.Stderr)
}
if res.Stderr != "" {
t.Fatalf("stderr = %q, want empty", res.Stderr)
}

var parsed map[string]any
if err := json.Unmarshal([]byte(res.Stdout), &parsed); err != nil {
t.Fatalf("stdout is not valid JSON: %v\nstdout: %s", err, res.Stdout)
}
data, ok := parsed["data"].(map[string]any)
if !ok {
t.Fatalf("data field missing or not object: %v", parsed)
}
if data["email"] != "[email protected]" {
t.Fatalf("data.email = %v, want %q", data["email"], "[email protected]")
}
}

func TestAuthStatus_InvalidKey(t *testing.T) {
srv := setupTestServer(t, map[string]testHandler{
"GET /v3/user/me": {
StatusCode: 401,
Body: `{"error":{"message":"invalid API key"}}`,
},
})
defer srv.Close()

res := runCommand(t, srv.URL, "invalid-key", "auth", "status")

if res.ExitCode != clierrors.ExitAuth {
t.Fatalf("ExitCode = %d, want %d\nstderr: %s", res.ExitCode, clierrors.ExitAuth, res.Stderr)
}
if !strings.Contains(res.Stderr, `"code":"auth_error"`) {
t.Fatalf("stderr = %s, want auth_error code", res.Stderr)
}
if !strings.Contains(res.Stderr, `"message":"invalid API key"`) {
t.Fatalf("stderr = %s, want invalid API key message", res.Stderr)
}
}

func TestAuthStatus_NoKey(t *testing.T) {
t.Setenv("HEYGEN_CONFIG_DIR", t.TempDir())

res := runCommand(t, "http://example.invalid", "", "auth", "status")

if res.ExitCode != clierrors.ExitAuth {
t.Fatalf("ExitCode = %d, want %d\nstderr: %s", res.ExitCode, clierrors.ExitAuth, res.Stderr)
}
if !strings.Contains(res.Stderr, `"message":"no API key found"`) {
t.Fatalf("stderr = %s, want missing API key message", res.Stderr)
}
if !strings.Contains(res.Stderr, `"hint":"Set HEYGEN_API_KEY env var or run: heygen auth login"`) {
t.Fatalf("stderr = %s, want auth hint", res.Stderr)
}
}
Loading