Files
dingtalk-workspace-cli/internal/event/source/token_provider_test.go

67 lines
2.0 KiB
Go

package source
import (
"context"
"errors"
"io"
"net/http"
"strings"
"testing"
)
type tokenProviderRoundTripper func(*http.Request) (*http.Response, error)
func (f tokenProviderRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
return f(req)
}
func TestCrossPlatformCoveragePersonalSourceResolvesTokenForEveryTicketRequest(t *testing.T) {
tokens := []string{"token-a", "token-b"}
calls := 0
source, err := NewPersonal(PersonalConfig{
AccessTokenProvider: func(context.Context) (string, error) {
token := tokens[calls]
calls++
return token, nil
},
ClientID: "client",
SourceID: "source",
TicketURL: "https://ticket.test",
HTTPClient: &http.Client{Transport: tokenProviderRoundTripper(func(req *http.Request) (*http.Response, error) {
want := tokens[calls-1]
if got := req.Header.Get("x-user-access-token"); got != want {
t.Fatalf("token header = %q, want %q", got, want)
}
return &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader(`{"endpoint":"wss://stream.test","ticket":"ticket"}`)), Header: make(http.Header)}, nil
})},
})
if err != nil {
t.Fatal(err)
}
for range 2 {
if _, err := source.fetchTicket(context.Background()); err != nil {
t.Fatal(err)
}
}
if calls != 2 {
t.Fatalf("provider calls = %d, want 2", calls)
}
}
func TestCrossPlatformCoveragePortalTicketProviderFailureStopsBeforeHTTP(t *testing.T) {
want := errors.New("token store failed")
httpCalled := false
_, err := requestPortalTicket(context.Background(), &PortalTicketConfig{
TicketURL: "https://ticket.test",
AccessTokenProvider: func(context.Context) (string, error) { return "", want },
SourceID: "source",
HTTPClient: &http.Client{Transport: tokenProviderRoundTripper(func(*http.Request) (*http.Response, error) {
httpCalled = true
return nil, errors.New("unexpected HTTP")
})},
})
if !errors.Is(err, want) || httpCalled {
t.Fatalf("request error = %v, httpCalled=%v", err, httpCalled)
}
}