Files
larksuite-cli/extension/transport/registry_test.go
tuxedomm bb38ecd41a feat: add transport extension with interceptor pre/post hooks (#292)
* feat: add transport extension with interceptor pre/post hooks

Add extension/transport package following the same Provider pattern as
credential and fileio extensions. The Interceptor interface uses a
PreRoundTrip/post-closure design that guarantees built-in transport
decorators (SecurityHeader, SecurityPolicy, Retry) cannot be skipped,
overridden, or tampered with by extensions. The original request context
is restored after PreRoundTrip to prevent context tampering.

Change-Id: I2e51ff67a0e2d8d32944a0565c2a6781110f281f
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 18:21:50 +08:00

78 lines
1.4 KiB
Go

// Copyright (c) 2026 Lark Technologies Pte. Ltd.
// SPDX-License-Identifier: MIT
package transport
import (
"context"
"net/http"
"testing"
)
type stubInterceptor struct{}
func (s *stubInterceptor) PreRoundTrip(req *http.Request) func(*http.Response, error) {
return nil
}
type stubProvider struct {
name string
}
func (s *stubProvider) Name() string { return s.name }
func (s *stubProvider) ResolveInterceptor(context.Context) Interceptor { return &stubInterceptor{} }
func TestGetProvider_NilByDefault(t *testing.T) {
mu.Lock()
provider = nil
mu.Unlock()
if got := GetProvider(); got != nil {
t.Fatalf("expected nil, got %v", got)
}
}
func TestRegisterAndGet(t *testing.T) {
mu.Lock()
provider = nil
mu.Unlock()
p := &stubProvider{name: "a"}
Register(p)
got := GetProvider()
if got != p {
t.Fatalf("expected registered provider, got %v", got)
}
}
func TestLastRegistrationWins(t *testing.T) {
mu.Lock()
provider = nil
mu.Unlock()
a := &stubProvider{name: "a"}
b := &stubProvider{name: "b"}
Register(a)
Register(b)
got := GetProvider()
if got != b {
t.Fatalf("expected provider b, got %v", got)
}
}
func TestResolveInterceptor_ReturnsNonNil(t *testing.T) {
mu.Lock()
provider = nil
mu.Unlock()
p := &stubProvider{name: "test"}
Register(p)
ic := GetProvider().ResolveInterceptor(context.Background())
if ic == nil {
t.Fatal("expected non-nil Interceptor")
}
}