package cmd import ( "context" "encoding/json" "io" "net/http" "net/http/httptest" "os" "strings" "testing" "google.golang.org/api/gmail/v1" "google.golang.org/api/option" "github.com/steipete/gogcli/internal/outfmt" "github.com/steipete/gogcli/internal/ui" ) func TestGmailAutoForwardGetCmd_Text(t *testing.T) { origNew := newGmailService t.Cleanup(func() { newGmailService = origNew }) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if strings.Contains(r.URL.Path, "/settings/autoForwarding") && r.Method == http.MethodGet { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(map[string]any{ "enabled": true, "emailAddress": "a@example.com", "disposition": "leaveInInbox", }) return } http.NotFound(w, r) })) defer srv.Close() svc, err := gmail.NewService(context.Background(), option.WithoutAuthentication(), option.WithHTTPClient(srv.Client()), option.WithEndpoint(srv.URL+"/"), ) if err != nil { t.Fatalf("NewService: %v", err) } newGmailService = func(context.Context, string) (*gmail.Service, error) { return svc, nil } flags := &RootFlags{Account: "a@b.com"} out := captureStdout(t, func() { u, uiErr := ui.New(ui.Options{Stdout: os.Stdout, Stderr: io.Discard, Color: "never"}) if uiErr != nil { t.Fatalf("ui.New: %v", uiErr) } ctx := ui.WithUI(context.Background(), u) ctx = outfmt.WithMode(ctx, outfmt.Mode{}) cmd := &GmailAutoForwardGetCmd{} if err := runKong(t, cmd, []string{}, ctx, flags); err != nil { t.Fatalf("execute: %v", err) } }) if !strings.Contains(out, "enabled\ttrue") || !strings.Contains(out, "email_address\ta@example.com") { t.Fatalf("unexpected output: %q", out) } } func TestGmailAutoForwardUpdateCmd_JSONAndValidation(t *testing.T) { origNew := newGmailService t.Cleanup(func() { newGmailService = origNew }) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if strings.Contains(r.URL.Path, "/settings/autoForwarding") && r.Method == http.MethodGet { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(map[string]any{ "enabled": false, "emailAddress": "old@example.com", "disposition": "leaveInInbox", }) return } if strings.Contains(r.URL.Path, "/settings/autoForwarding") && r.Method == http.MethodPut { w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(map[string]any{ "enabled": true, "emailAddress": "new@example.com", "disposition": "archive", }) return } http.NotFound(w, r) })) defer srv.Close() svc, err := gmail.NewService(context.Background(), option.WithoutAuthentication(), option.WithHTTPClient(srv.Client()), option.WithEndpoint(srv.URL+"/"), ) if err != nil { t.Fatalf("NewService: %v", err) } newGmailService = func(context.Context, string) (*gmail.Service, error) { return svc, nil } flags := &RootFlags{Account: "a@b.com"} cmd := &GmailAutoForwardUpdateCmd{} if err := runKong(t, cmd, []string{"--disposition", "nope"}, context.Background(), flags); err == nil { t.Fatalf("expected validation error") } jsonOut := captureStdout(t, func() { u, uiErr := ui.New(ui.Options{Stdout: io.Discard, Stderr: io.Discard, Color: "never"}) if uiErr != nil { t.Fatalf("ui.New: %v", uiErr) } ctx := ui.WithUI(context.Background(), u) ctx = outfmt.WithMode(ctx, outfmt.Mode{JSON: true}) cmd2 := &GmailAutoForwardUpdateCmd{} if err := runKong(t, cmd2, []string{"--enable", "--email", "new@example.com", "--disposition", "archive"}, ctx, flags); err != nil { t.Fatalf("execute: %v", err) } }) var parsed struct { AutoForwarding struct { Enabled bool `json:"enabled"` EmailAddress string `json:"emailAddress"` Disposition string `json:"disposition"` } `json:"autoForwarding"` } if err := json.Unmarshal([]byte(jsonOut), &parsed); err != nil { t.Fatalf("json parse: %v", err) } if !parsed.AutoForwarding.Enabled || parsed.AutoForwarding.EmailAddress != "new@example.com" { t.Fatalf("unexpected json: %#v", parsed.AutoForwarding) } }