garth more done

This commit is contained in:
2025-08-29 07:08:35 -07:00
parent fd0924e85e
commit 6b17d41a7a
13 changed files with 340 additions and 443 deletions

View File

@@ -89,12 +89,7 @@ func TestGetBodyComposition(t *testing.T) {
}
// Create mock authenticator for tests
mockAuth := &struct {
RefreshToken func(_, _ string) (string, error)
}{}
mockAuth.RefreshToken = func(_, _ string) (string, error) {
return "refreshed-token", nil
}
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(server.URL)

View File

@@ -14,13 +14,6 @@ import (
"github.com/stretchr/testify/assert"
)
// mockAuthImpl implements the Authenticator interface for tests
type mockAuthImpl struct{}
func (m *mockAuthImpl) RefreshToken(_, _ string) (string, error) {
return "refreshed-token", nil
}
func TestGearService(t *testing.T) {
// Create test server
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -83,7 +76,7 @@ func TestGearService(t *testing.T) {
// Create client
// Create mock authenticator for tests
mockAuth := &mockAuthImpl{}
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(srv.URL)
@@ -103,7 +96,7 @@ func TestGearService(t *testing.T) {
// Create client
// Create mock authenticator for tests
mockAuth := &mockAuthImpl{}
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(srv.URL)
@@ -123,7 +116,7 @@ func TestGearService(t *testing.T) {
// Create client
// Create mock authenticator for tests
mockAuth := &mockAuthImpl{}
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(srv.URL)

View File

@@ -193,8 +193,9 @@ func TestGetSleepData(t *testing.T) {
OAuth2Token: "test-token",
ExpiresAt: time.Now().Add(8 * time.Hour),
}
// Pass nil authenticator for tests
client, err := NewClient(nil, session, "")
// Use mock authenticator
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(mockServer.URL())
@@ -291,8 +292,9 @@ func TestGetHRVData(t *testing.T) {
OAuth2Token: "test-token",
ExpiresAt: time.Now().Add(8 * time.Hour),
}
// Pass nil authenticator for tests
client, err := NewClient(nil, session, "")
// Use mock authenticator
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(mockServer.URL())
@@ -380,8 +382,9 @@ func TestGetBodyBatteryData(t *testing.T) {
OAuth2Token: "test-token",
ExpiresAt: time.Now().Add(8 * time.Hour),
}
// Pass nil authenticator for tests
client, err := NewClient(nil, session, "")
// Use mock authenticator
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(mockServer.URL())

View File

@@ -81,8 +81,9 @@ func TestIntegrationHealthMetrics(t *testing.T) {
OAuth2Token: "test-token",
ExpiresAt: time.Now().Add(8 * time.Hour),
}
// For integration tests, pass nil for authenticator since we don't need token refresh
client, err := NewClient(nil, session, "")
// Use mock authenticator for integration tests
mockAuth := &MockAuthenticator{}
client, err := NewClient(mockAuth, session, "")
assert.NoError(t, err)
client.HTTPClient.SetBaseURL(mockServer.URL())

View File

@@ -408,13 +408,6 @@ func (m *MockServer) handleGear(w http.ResponseWriter, r *http.Request) {
})
}
// MockAuthenticator implements garth.Authenticator for testing
type MockAuthenticator struct{}
func (m *MockAuthenticator) RefreshToken(_, _ string) (string, error) {
return "refreshed-token", nil
}
// NewClientWithBaseURL creates a test client that uses the mock server's URL
func NewClientWithBaseURL(baseURL string) *Client {
session := &garth.Session{
@@ -423,7 +416,7 @@ func NewClientWithBaseURL(baseURL string) *Client {
}
// Create mock authenticator for tests
auth := &MockAuthenticator{}
auth := NewMockAuthenticator()
client, err := NewClient(auth, session, "")
if err != nil {

View File

@@ -0,0 +1,35 @@
package api
// MockAuthenticator implements the Authenticator interface for testing
type MockAuthenticator struct {
// RefreshTokenFunc can be set for custom refresh behavior
RefreshTokenFunc func(oauth1Token, oauth1Secret string) (string, error)
// CallCount tracks how many times RefreshToken was called
CallCount int
}
// RefreshToken implements the Authenticator interface
func (m *MockAuthenticator) RefreshToken(oauth1Token, oauth1Secret string) (string, error) {
m.CallCount++
// If custom function is provided, use it
if m.RefreshTokenFunc != nil {
return m.RefreshTokenFunc(oauth1Token, oauth1Secret)
}
// Default behavior: return a mock token
return "refreshed-test-token", nil
}
// NewMockAuthenticator creates a new mock authenticator with default behavior
func NewMockAuthenticator() *MockAuthenticator {
return &MockAuthenticator{}
}
// NewMockAuthenticatorWithFunc creates a mock authenticator with custom refresh behavior
func NewMockAuthenticatorWithFunc(refreshFunc func(string, string) (string, error)) *MockAuthenticator {
return &MockAuthenticator{
RefreshTokenFunc: refreshFunc,
}
}

View File

@@ -8,6 +8,7 @@ import (
"testing"
"time"
"github.com/sstent/go-garminconnect/internal/auth/garth"
"github.com/stretchr/testify/assert"
)
@@ -75,7 +76,18 @@ func TestGetUserProfile(t *testing.T) {
mockServer := NewMockServer()
defer mockServer.Close()
client := NewClientWithBaseURL(mockServer.URL())
// Create client with non-expired session
session := &garth.Session{
OAuth2Token: "test-token",
ExpiresAt: time.Now().Add(8 * time.Hour),
}
// Use mock authenticator
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
if err != nil {
t.Fatalf("failed to create client: %v", err)
}
client.HTTPClient.SetBaseURL(mockServer.URL())
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -178,7 +190,18 @@ func TestGetUserStats(t *testing.T) {
mockServer := NewMockServer()
defer mockServer.Close()
client := NewClientWithBaseURL(mockServer.URL())
// Create client with non-expired session
session := &garth.Session{
OAuth2Token: "test-token",
ExpiresAt: time.Now().Add(8 * time.Hour),
}
// Use mock authenticator
mockAuth := NewMockAuthenticator()
client, err := NewClient(mockAuth, session, "")
if err != nil {
t.Fatalf("failed to create client: %v", err)
}
client.HTTPClient.SetBaseURL(mockServer.URL())
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {