Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions internal/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func NewHoverProvider() *HoverProvider { return &HoverProvider{} }
func (p *HoverProvider) Name() string { return "hover" }
func (p *HoverProvider) Version() string { return Version }

// Initialize parses provider config and eagerly authenticates with Hover.
// Initialize parses provider config and constructs a lazy Hover client.
// Required keys:
//
// username — Hover account username / email
Expand Down Expand Up @@ -76,12 +76,6 @@ func (p *HoverProvider) Initialize(ctx context.Context, config map[string]any) e
return fmt.Errorf("hover: client init: %w", err)
}

// Eager login so config errors (bad creds, MFA failure) surface at
// Configure time rather than at first Plan/Apply invocation.
if err := c.Login(ctx); err != nil {
return fmt.Errorf("hover: initial login failed: %w", err)
}

p.client = c
p.drivers = map[string]interfaces.ResourceDriver{
"infra.dns": drivers.NewDNSDriver(c),
Expand Down
31 changes: 31 additions & 0 deletions internal/provider_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package internal

import (
"context"
"errors"
"net/http"
"sync/atomic"
"testing"
)

Expand All @@ -22,3 +26,30 @@ func TestHoverProvider_Capabilities_IncludesDelegation(t *testing.T) {
}
}
}

func TestHoverProvider_Initialize_DoesNotLogin(t *testing.T) {
var hits atomic.Int32
orig := http.DefaultTransport
http.DefaultTransport = roundTripperFunc(func(*http.Request) (*http.Response, error) {
hits.Add(1)
return nil, errors.New("unexpected network call")
})
defer func() { http.DefaultTransport = orig }()

p := NewHoverProvider()
if err := p.Initialize(context.Background(), map[string]any{
"username": "user@example.com",
"password": "password",
}); err != nil {
t.Fatalf("Initialize: %v", err)
}
if got := hits.Load(); got != 0 {
t.Fatalf("Initialize made %d network calls; login should happen lazily on API operations", got)
}
}

type roundTripperFunc func(*http.Request) (*http.Response, error)

func (f roundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) {
return f(r)
}