Build system, release automation, SDK generation, Ansible executor, LinuxKit dev environments, container runtime, deployment, infra metrics, and developer toolkit. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
229 lines
5.7 KiB
Go
229 lines
5.7 KiB
Go
package release
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRunSDK_Bad_NilConfig(t *testing.T) {
|
|
_, err := RunSDK(context.Background(), nil, true)
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "config is nil")
|
|
}
|
|
|
|
func TestRunSDK_Bad_NoSDKConfig(t *testing.T) {
|
|
cfg := &Config{
|
|
SDK: nil,
|
|
}
|
|
cfg.projectDir = "/tmp"
|
|
|
|
_, err := RunSDK(context.Background(), cfg, true)
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "sdk not configured")
|
|
}
|
|
|
|
func TestRunSDK_Good_DryRun(t *testing.T) {
|
|
cfg := &Config{
|
|
SDK: &SDKConfig{
|
|
Languages: []string{"typescript", "python"},
|
|
Output: "sdk",
|
|
},
|
|
}
|
|
cfg.projectDir = "/tmp"
|
|
cfg.version = "v1.0.0"
|
|
|
|
result, err := RunSDK(context.Background(), cfg, true)
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, "v1.0.0", result.Version)
|
|
assert.Len(t, result.Languages, 2)
|
|
assert.Contains(t, result.Languages, "typescript")
|
|
assert.Contains(t, result.Languages, "python")
|
|
assert.Equal(t, "sdk", result.Output)
|
|
}
|
|
|
|
func TestRunSDK_Good_DryRunDefaultOutput(t *testing.T) {
|
|
cfg := &Config{
|
|
SDK: &SDKConfig{
|
|
Languages: []string{"go"},
|
|
Output: "", // Empty output, should default to "sdk"
|
|
},
|
|
}
|
|
cfg.projectDir = "/tmp"
|
|
cfg.version = "v2.0.0"
|
|
|
|
result, err := RunSDK(context.Background(), cfg, true)
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, "sdk", result.Output)
|
|
}
|
|
|
|
func TestRunSDK_Good_DryRunDefaultProjectDir(t *testing.T) {
|
|
cfg := &Config{
|
|
SDK: &SDKConfig{
|
|
Languages: []string{"typescript"},
|
|
Output: "out",
|
|
},
|
|
}
|
|
// projectDir is empty, should default to "."
|
|
cfg.version = "v1.0.0"
|
|
|
|
result, err := RunSDK(context.Background(), cfg, true)
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, "v1.0.0", result.Version)
|
|
}
|
|
|
|
func TestRunSDK_Bad_BreakingChangesFailOnBreaking(t *testing.T) {
|
|
// This test verifies that when diff.FailOnBreaking is true and breaking changes
|
|
// are detected, RunSDK returns an error. However, since we can't easily mock
|
|
// the diff check, this test verifies the config is correctly processed.
|
|
// The actual breaking change detection is tested in pkg/sdk/diff_test.go.
|
|
cfg := &Config{
|
|
SDK: &SDKConfig{
|
|
Languages: []string{"typescript"},
|
|
Output: "sdk",
|
|
Diff: SDKDiffConfig{
|
|
Enabled: true,
|
|
FailOnBreaking: true,
|
|
},
|
|
},
|
|
}
|
|
cfg.projectDir = "/tmp"
|
|
cfg.version = "v1.0.0"
|
|
|
|
// In dry run mode with no git repo, diff check will fail gracefully
|
|
// (non-fatal warning), so this should succeed
|
|
result, err := RunSDK(context.Background(), cfg, true)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "v1.0.0", result.Version)
|
|
}
|
|
|
|
func TestToSDKConfig_Good(t *testing.T) {
|
|
sdkCfg := &SDKConfig{
|
|
Spec: "api/openapi.yaml",
|
|
Languages: []string{"typescript", "go"},
|
|
Output: "sdk",
|
|
Package: SDKPackageConfig{
|
|
Name: "myapi",
|
|
Version: "v1.0.0",
|
|
},
|
|
Diff: SDKDiffConfig{
|
|
Enabled: true,
|
|
FailOnBreaking: true,
|
|
},
|
|
}
|
|
|
|
result := toSDKConfig(sdkCfg)
|
|
|
|
assert.Equal(t, "api/openapi.yaml", result.Spec)
|
|
assert.Equal(t, []string{"typescript", "go"}, result.Languages)
|
|
assert.Equal(t, "sdk", result.Output)
|
|
assert.Equal(t, "myapi", result.Package.Name)
|
|
assert.Equal(t, "v1.0.0", result.Package.Version)
|
|
assert.True(t, result.Diff.Enabled)
|
|
assert.True(t, result.Diff.FailOnBreaking)
|
|
}
|
|
|
|
func TestToSDKConfig_Good_NilInput(t *testing.T) {
|
|
result := toSDKConfig(nil)
|
|
assert.Nil(t, result)
|
|
}
|
|
|
|
func TestRunSDK_Good_WithDiffEnabledNoFailOnBreaking(t *testing.T) {
|
|
// Tests diff enabled but FailOnBreaking=false (should warn but not fail)
|
|
cfg := &Config{
|
|
SDK: &SDKConfig{
|
|
Languages: []string{"typescript"},
|
|
Output: "sdk",
|
|
Diff: SDKDiffConfig{
|
|
Enabled: true,
|
|
FailOnBreaking: false,
|
|
},
|
|
},
|
|
}
|
|
cfg.projectDir = "/tmp"
|
|
cfg.version = "v1.0.0"
|
|
|
|
// Dry run should succeed even without git repo (diff check fails gracefully)
|
|
result, err := RunSDK(context.Background(), cfg, true)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "v1.0.0", result.Version)
|
|
assert.Contains(t, result.Languages, "typescript")
|
|
}
|
|
|
|
func TestRunSDK_Good_MultipleLanguages(t *testing.T) {
|
|
// Tests multiple language support
|
|
cfg := &Config{
|
|
SDK: &SDKConfig{
|
|
Languages: []string{"typescript", "python", "go", "java"},
|
|
Output: "multi-sdk",
|
|
},
|
|
}
|
|
cfg.projectDir = "/tmp"
|
|
cfg.version = "v3.0.0"
|
|
|
|
result, err := RunSDK(context.Background(), cfg, true)
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, "v3.0.0", result.Version)
|
|
assert.Len(t, result.Languages, 4)
|
|
assert.Equal(t, "multi-sdk", result.Output)
|
|
}
|
|
|
|
func TestRunSDK_Good_WithPackageConfig(t *testing.T) {
|
|
// Tests that package config is properly handled
|
|
cfg := &Config{
|
|
SDK: &SDKConfig{
|
|
Spec: "openapi.yaml",
|
|
Languages: []string{"typescript"},
|
|
Output: "sdk",
|
|
Package: SDKPackageConfig{
|
|
Name: "my-custom-sdk",
|
|
Version: "v2.5.0",
|
|
},
|
|
},
|
|
}
|
|
cfg.projectDir = "/tmp"
|
|
cfg.version = "v1.0.0"
|
|
|
|
result, err := RunSDK(context.Background(), cfg, true)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "v1.0.0", result.Version)
|
|
}
|
|
|
|
func TestToSDKConfig_Good_EmptyPackageConfig(t *testing.T) {
|
|
// Tests conversion with empty package config
|
|
sdkCfg := &SDKConfig{
|
|
Languages: []string{"go"},
|
|
Output: "sdk",
|
|
// Package is empty struct
|
|
}
|
|
|
|
result := toSDKConfig(sdkCfg)
|
|
|
|
assert.Equal(t, []string{"go"}, result.Languages)
|
|
assert.Equal(t, "sdk", result.Output)
|
|
assert.Empty(t, result.Package.Name)
|
|
assert.Empty(t, result.Package.Version)
|
|
}
|
|
|
|
func TestToSDKConfig_Good_DiffDisabled(t *testing.T) {
|
|
// Tests conversion with diff disabled
|
|
sdkCfg := &SDKConfig{
|
|
Languages: []string{"typescript"},
|
|
Output: "sdk",
|
|
Diff: SDKDiffConfig{
|
|
Enabled: false,
|
|
FailOnBreaking: false,
|
|
},
|
|
}
|
|
|
|
result := toSDKConfig(sdkCfg)
|
|
|
|
assert.False(t, result.Diff.Enabled)
|
|
assert.False(t, result.Diff.FailOnBreaking)
|
|
}
|