gogcli/internal/googleapi/services_more_test.go
salmonumbrella e7fae164f4
feat: add context propagation, security fixes, and new features
Drive:
- Add context propagation to all API calls
- Add path traversal security fix in download

Gmail:
- Add context propagation to labels and thread commands
- Simplify MIME building (remove unused ReplyTo, BodyHTML)
- Add --from flag for send-as aliases in send and drafts
- Simplify base64 decoding
- Add path traversal security fix in attachments

Calendar:
- Add needsAction status support to respond command
- Add --comment flag for response comments
- Add organizer check to prevent self-response

Auth:
- Add browser-based account management command (auth manage)
- Add web UI for managing connected accounts

Maintenance:
- Update golangci-lint config for v2 compatibility
2025-12-24 19:14:01 -08:00

76 lines
2.2 KiB
Go

package googleapi
import (
"context"
"errors"
"testing"
"github.com/99designs/keyring"
"github.com/steipete/gogcli/internal/config"
"github.com/steipete/gogcli/internal/secrets"
)
func TestNewServices_HappyPath(t *testing.T) {
origRead := readClientCredentials
origOpen := openSecretsStore
t.Cleanup(func() {
readClientCredentials = origRead
openSecretsStore = origOpen
})
readClientCredentials = func() (config.ClientCredentials, error) {
return config.ClientCredentials{ClientID: "id", ClientSecret: "secret"}, nil
}
openSecretsStore = func() (secrets.Store, error) {
return &stubStore{tok: secrets.Token{Email: "a@b.com", RefreshToken: "rt"}}, nil
}
ctx := context.Background()
if svc, err := NewGmail(ctx, "a@b.com"); err != nil || svc == nil {
t.Fatalf("NewGmail: %v", err)
}
if svc, err := NewDrive(ctx, "a@b.com"); err != nil || svc == nil {
t.Fatalf("NewDrive: %v", err)
}
if svc, err := NewCalendar(ctx, "a@b.com"); err != nil || svc == nil {
t.Fatalf("NewCalendar: %v", err)
}
if svc, err := NewSheets(ctx, "a@b.com"); err != nil || svc == nil {
t.Fatalf("NewSheets: %v", err)
}
if svc, err := NewPeopleContacts(ctx, "a@b.com"); err != nil || svc == nil {
t.Fatalf("NewPeopleContacts: %v", err)
}
if svc, err := NewPeopleOtherContacts(ctx, "a@b.com"); err != nil || svc == nil {
t.Fatalf("NewPeopleOtherContacts: %v", err)
}
if svc, err := NewPeopleDirectory(ctx, "a@b.com"); err != nil || svc == nil {
t.Fatalf("NewPeopleDirectory: %v", err)
}
}
func TestNewServices_AuthRequired(t *testing.T) {
origRead := readClientCredentials
origOpen := openSecretsStore
t.Cleanup(func() {
readClientCredentials = origRead
openSecretsStore = origOpen
})
readClientCredentials = func() (config.ClientCredentials, error) {
return config.ClientCredentials{ClientID: "id", ClientSecret: "secret"}, nil
}
openSecretsStore = func() (secrets.Store, error) {
return &stubStore{err: keyring.ErrKeyNotFound}, nil
}
_, err := NewGmail(context.Background(), "a@b.com")
if err == nil {
t.Fatalf("expected error")
}
var are *AuthRequiredError
if !errors.As(err, &are) {
t.Fatalf("expected AuthRequiredError, got: %T %v", err, err)
}
}