proxy-pool/internal/gateway/transport/credentials_test.go

113 lines
3.4 KiB
Go

package transport
import (
"context"
"errors"
"fmt"
"strings"
"testing"
proxyDomain "github.com/proxy-pool/proxy-pool/internal/domain/proxy"
platformCredentials "github.com/proxy-pool/proxy-pool/internal/platform/credentials"
)
func TestCredentialsFormattingRedactsPassword(t *testing.T) {
t.Parallel()
value := Credentials{Username: "alice", Password: "secret-password"}
for _, formatted := range []string{
fmt.Sprintf("%v", value),
fmt.Sprintf("%+v", value),
fmt.Sprintf("%#v", value),
} {
if strings.Contains(formatted, value.Username) || strings.Contains(formatted, value.Password) {
t.Fatalf("formatted Credentials exposes credential material: %s", formatted)
}
}
}
func TestStoreCredentialResolverResolvesProxyReference(t *testing.T) {
t.Parallel()
store, err := platformCredentials.NewMemoryStore(1)
if err != nil {
t.Fatalf("NewMemoryStore() error = %v", err)
}
reference, err := store.Put(context.Background(), "provider-a/proxy-a", platformCredentials.Value{
Username: "alice",
Password: "secret",
})
if err != nil {
t.Fatalf("Put() error = %v", err)
}
resolver, err := NewStoreCredentialResolver(store)
if err != nil {
t.Fatalf("NewStoreCredentialResolver() error = %v", err)
}
got, err := resolver.Resolve(context.Background(), proxyDomain.Proxy{
Username: "alice",
SecretRef: reference.SecretRef,
CredentialVersion: reference.CredentialVersion,
})
if err != nil {
t.Fatalf("Resolve() error = %v", err)
}
if got != (Credentials{Username: "alice", Password: "secret"}) {
t.Fatalf("Resolve() returned unexpected credentials")
}
}
func TestStoreCredentialResolverRejectsIncompleteOrMismatchedReference(t *testing.T) {
t.Parallel()
store, err := platformCredentials.NewMemoryStore(1)
if err != nil {
t.Fatalf("NewMemoryStore() error = %v", err)
}
reference, err := store.Put(context.Background(), "provider-a/proxy-a", platformCredentials.Value{
Username: "alice",
Password: "secret",
})
if err != nil {
t.Fatalf("Put() error = %v", err)
}
resolver, err := NewStoreCredentialResolver(store)
if err != nil {
t.Fatalf("NewStoreCredentialResolver() error = %v", err)
}
for name, selected := range map[string]proxyDomain.Proxy{
"missing version": {SecretRef: reference.SecretRef},
"missing ref": {CredentialVersion: reference.CredentialVersion},
} {
if _, err := resolver.Resolve(context.Background(), selected); !errors.Is(err, ErrIncompleteCredentialReference) {
t.Fatalf("%s Resolve() error = %v, want ErrIncompleteCredentialReference", name, err)
}
}
if _, err := resolver.Resolve(context.Background(), proxyDomain.Proxy{
Username: "bob",
SecretRef: reference.SecretRef,
CredentialVersion: reference.CredentialVersion,
}); !errors.Is(err, ErrCredentialUsernameMismatch) {
t.Fatalf("mismatched Resolve() error = %v, want ErrCredentialUsernameMismatch", err)
}
}
func TestStoreCredentialResolverAllowsCredentiallessProxy(t *testing.T) {
t.Parallel()
store, err := platformCredentials.NewMemoryStore(1)
if err != nil {
t.Fatalf("NewMemoryStore() error = %v", err)
}
resolver, err := NewStoreCredentialResolver(store)
if err != nil {
t.Fatalf("NewStoreCredentialResolver() error = %v", err)
}
got, err := resolver.Resolve(context.Background(), proxyDomain.Proxy{})
if err != nil || got != (Credentials{}) {
t.Fatalf("Resolve(credentialless) = (%+v, %v), want zero credentials", got, err)
}
}