fetch_ml/internal/tracking/plugins/wandb_test.go
Jeremie Fraeys f827ee522a
test(tracking/plugins): add PodmanInterface and comprehensive plugin tests for 91% coverage
Refactor plugins to use interface for testability:
- Add PodmanInterface to container package (StartContainer, StopContainer, RemoveContainer)
- Update MLflow plugin to use container.PodmanInterface
- Update TensorBoard plugin to use container.PodmanInterface
- Add comprehensive mocked tests for all three plugins (wandb, mlflow, tensorboard)
- Coverage increased from 18% to 91.4%
2026-03-14 16:59:16 -04:00

182 lines
4.4 KiB
Go

package plugins_test
import (
"context"
"testing"
"github.com/jfraeys/fetch_ml/internal/tracking"
"github.com/jfraeys/fetch_ml/internal/tracking/plugins"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestNewWandbPlugin tests plugin creation
func TestNewWandbPlugin(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
require.NotNil(t, plugin)
}
// TestWandbPluginName tests plugin name
func TestWandbPluginName(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
assert.Equal(t, "wandb", plugin.Name())
}
// TestWandbPluginProvisionSidecarDisabled tests disabled mode
func TestWandbPluginProvisionSidecarDisabled(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: false,
Mode: tracking.ModeDisabled,
}
env, err := plugin.ProvisionSidecar(context.Background(), "task-1", config)
require.NoError(t, err)
assert.Nil(t, env)
}
// TestWandbPluginProvisionSidecarRemoteNoKey tests remote mode without API key
func TestWandbPluginProvisionSidecarRemoteNoKey(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: true,
Mode: tracking.ModeRemote,
Settings: map[string]any{},
}
_, err := plugin.ProvisionSidecar(context.Background(), "task-1", config)
require.Error(t, err)
assert.Contains(t, err.Error(), "wandb remote mode requires api_key")
}
// TestWandbPluginProvisionSidecarRemoteWithKey tests remote mode with API key
func TestWandbPluginProvisionSidecarRemoteWithKey(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: true,
Mode: tracking.ModeRemote,
Settings: map[string]any{
"api_key": "test-key-123",
"project": "my-project",
"entity": "my-entity",
},
}
env, err := plugin.ProvisionSidecar(context.Background(), "task-1", config)
require.NoError(t, err)
require.NotNil(t, env)
assert.Equal(t, "test-key-123", env["WANDB_API_KEY"])
assert.Equal(t, "my-project", env["WANDB_PROJECT"])
assert.Equal(t, "my-entity", env["WANDB_ENTITY"])
}
// TestWandbPluginProvisionSidecarPartialConfig tests with partial configuration
func TestWandbPluginProvisionSidecarPartialConfig(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: true,
Mode: tracking.ModeSidecar,
Settings: map[string]any{
"api_key": "test-key",
},
}
env, err := plugin.ProvisionSidecar(context.Background(), "task-1", config)
require.NoError(t, err)
require.NotNil(t, env)
assert.Equal(t, "test-key", env["WANDB_API_KEY"])
assert.NotContains(t, env, "WANDB_PROJECT")
assert.NotContains(t, env, "WANDB_ENTITY")
}
// TestWandbPluginTeardown tests teardown (no-op)
func TestWandbPluginTeardown(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
err := plugin.Teardown(context.Background(), "task-1")
require.NoError(t, err)
}
// TestWandbPluginHealthCheckDisabled tests health check for disabled config
func TestWandbPluginHealthCheckDisabled(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: false,
}
healthy := plugin.HealthCheck(context.Background(), config)
assert.True(t, healthy)
}
// TestWandbPluginHealthCheckRemoteWithKey tests health check with API key
func TestWandbPluginHealthCheckRemoteWithKey(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: true,
Mode: tracking.ModeRemote,
Settings: map[string]any{
"api_key": "test-key",
},
}
healthy := plugin.HealthCheck(context.Background(), config)
assert.True(t, healthy)
}
// TestWandbPluginHealthCheckRemoteWithoutKey tests health check without API key
func TestWandbPluginHealthCheckRemoteWithoutKey(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: true,
Mode: tracking.ModeRemote,
Settings: map[string]any{},
}
healthy := plugin.HealthCheck(context.Background(), config)
assert.False(t, healthy)
}
// TestWandbPluginHealthCheckSidecar tests health check for sidecar mode
func TestWandbPluginHealthCheckSidecar(t *testing.T) {
t.Parallel()
plugin := plugins.NewWandbPlugin()
config := tracking.ToolConfig{
Enabled: true,
Mode: tracking.ModeSidecar,
Settings: map[string]any{},
}
healthy := plugin.HealthCheck(context.Background(), config)
assert.True(t, healthy)
}