177 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
package flags
 | 
						|
 | 
						|
import (
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/spf13/cobra"
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
)
 | 
						|
 | 
						|
func TestNewGenericFlagRegistrar(t *testing.T) {
 | 
						|
	registry := NewMockFlagRegistry()
 | 
						|
	assert.NotNil(t, registry)
 | 
						|
	assert.NotNil(t, registry.values)
 | 
						|
	assert.Len(t, registry.values, 0)
 | 
						|
}
 | 
						|
 | 
						|
func TestGenericFlagRegistry_RegisterBoolFlag(t *testing.T) {
 | 
						|
	registry := NewMockFlagRegistry()
 | 
						|
	cmd := &cobra.Command{Use: "test"}
 | 
						|
 | 
						|
	var testFlag bool
 | 
						|
	registry.RegisterBoolFlag(cmd, "test-flag", &testFlag, false, "Test flag")
 | 
						|
 | 
						|
	// Verify the flag was registered
 | 
						|
	flag := cmd.Flags().Lookup("test-flag")
 | 
						|
	assert.NotNil(t, flag)
 | 
						|
	assert.Equal(t, "test-flag", flag.Name)
 | 
						|
	assert.Equal(t, "false", flag.DefValue)
 | 
						|
	assert.Equal(t, "Test flag", flag.Usage)
 | 
						|
 | 
						|
	// Verify the value was stored in the registry
 | 
						|
	value, exists := registry.values["test-flag"]
 | 
						|
	assert.True(t, exists)
 | 
						|
	assert.Equal(t, &testFlag, value)
 | 
						|
 | 
						|
	// Test the generic GetFlagValue function
 | 
						|
	flagValue, exists := GetFlagValue[bool](registry, "test-flag")
 | 
						|
	assert.True(t, exists)
 | 
						|
	assert.Equal(t, false, flagValue)
 | 
						|
}
 | 
						|
 | 
						|
func TestGenericFlagRegistry_TransferFlags_NoChanges(t *testing.T) {
 | 
						|
	registry := NewMockFlagRegistry()
 | 
						|
	cmd := &cobra.Command{Use: "test"}
 | 
						|
 | 
						|
	var testFlag bool
 | 
						|
	registry.RegisterBoolFlag(cmd, "test-flag", &testFlag, false, "Test flag")
 | 
						|
 | 
						|
	// Create a mock handler
 | 
						|
	handler := NewMockFlagHandler()
 | 
						|
 | 
						|
	// Transfer flags (none changed)
 | 
						|
	registry.TransferFlags(cmd, handler)
 | 
						|
 | 
						|
	// Verify the handler was called with the right parameters
 | 
						|
	assert.Equal(t, &testFlag, handler.handledFlags["test-flag"])
 | 
						|
	assert.False(t, handler.changedFlags["test-flag"])
 | 
						|
}
 | 
						|
 | 
						|
func TestGenericFlagRegistry_TransferFlags_WithChanges(t *testing.T) {
 | 
						|
	registry := NewMockFlagRegistry()
 | 
						|
	cmd := &cobra.Command{Use: "test"}
 | 
						|
 | 
						|
	var testFlag bool
 | 
						|
	registry.RegisterBoolFlag(cmd, "test-flag", &testFlag, false, "Test flag")
 | 
						|
 | 
						|
	// Simulate flag being set on command line
 | 
						|
	err := cmd.Flags().Set("test-flag", "true")
 | 
						|
	assert.NoError(t, err)
 | 
						|
	testFlag = true // Value would be updated by cobra
 | 
						|
 | 
						|
	// Create a mock handler
 | 
						|
	handler := NewMockFlagHandler()
 | 
						|
 | 
						|
	// Transfer flags (with changes)
 | 
						|
	registry.TransferFlags(cmd, handler)
 | 
						|
 | 
						|
	// Verify the handler was called with the right parameters
 | 
						|
	assert.Equal(t, &testFlag, handler.handledFlags["test-flag"])
 | 
						|
	assert.True(t, handler.changedFlags["test-flag"])
 | 
						|
	assert.True(t, *handler.handledFlags["test-flag"].(*bool))
 | 
						|
}
 | 
						|
 | 
						|
func TestGenericFlagRegistry_TransferFlags_NonHandler(t *testing.T) {
 | 
						|
	registry := NewMockFlagRegistry()
 | 
						|
	cmd := &cobra.Command{Use: "test"}
 | 
						|
 | 
						|
	var testFlag bool
 | 
						|
	registry.RegisterBoolFlag(cmd, "test-flag", &testFlag, false, "Test flag")
 | 
						|
 | 
						|
	// Use a non-handler type
 | 
						|
	nonHandler := struct{}{}
 | 
						|
 | 
						|
	// This should not panic
 | 
						|
	registry.TransferFlags(cmd, nonHandler)
 | 
						|
}
 | 
						|
 | 
						|
func TestGenericFlagRegistry_MultipleFlags(t *testing.T) {
 | 
						|
	registry := NewMockFlagRegistry()
 | 
						|
	cmd := &cobra.Command{Use: "test"}
 | 
						|
 | 
						|
	var boolFlag bool
 | 
						|
	var boolFlag2 bool
 | 
						|
 | 
						|
	registry.RegisterBoolFlag(cmd, "bool-flag", &boolFlag, false, "Boolean flag")
 | 
						|
	registry.RegisterBoolFlag(cmd, "bool-flag2", &boolFlag2, true, "Another boolean flag")
 | 
						|
 | 
						|
	// Set one flag
 | 
						|
	err := cmd.Flags().Set("bool-flag", "true")
 | 
						|
	assert.NoError(t, err)
 | 
						|
	boolFlag = true // Value would be updated by cobra
 | 
						|
 | 
						|
	// Create a mock handler
 | 
						|
	handler := NewMockFlagHandler()
 | 
						|
 | 
						|
	// Transfer flags
 | 
						|
	registry.TransferFlags(cmd, handler)
 | 
						|
 | 
						|
	// Verify both flags were handled correctly
 | 
						|
	assert.Equal(t, &boolFlag, handler.handledFlags["bool-flag"])
 | 
						|
	assert.True(t, handler.changedFlags["bool-flag"])
 | 
						|
	assert.True(t, *handler.handledFlags["bool-flag"].(*bool))
 | 
						|
 | 
						|
	assert.Equal(t, &boolFlag2, handler.handledFlags["bool-flag2"])
 | 
						|
	assert.False(t, handler.changedFlags["bool-flag2"])
 | 
						|
	assert.True(t, *handler.handledFlags["bool-flag2"].(*bool)) // Default is true
 | 
						|
}
 | 
						|
 | 
						|
func TestGenericFlagRegistry_GetRegisteredFlagNames(t *testing.T) {
 | 
						|
	registry := NewMockFlagRegistry()
 | 
						|
 | 
						|
	// Register some test flags
 | 
						|
	boolValue := false
 | 
						|
	registry.values["bool-flag"] = &boolValue
 | 
						|
 | 
						|
	stringValue := "test"
 | 
						|
	registry.values["string-flag"] = &stringValue
 | 
						|
 | 
						|
	stringSliceValue := []string{"one", "two", "three"}
 | 
						|
	registry.values["string-slice-flag"] = &stringSliceValue
 | 
						|
 | 
						|
	// Test GetRegisteredFlagNames
 | 
						|
	names := registry.GetRegisteredFlagNames()
 | 
						|
	assert.Len(t, names, 3)
 | 
						|
	assert.Contains(t, names, "bool-flag")
 | 
						|
	assert.Contains(t, names, "string-flag")
 | 
						|
	assert.Contains(t, names, "string-slice-flag")
 | 
						|
}
 | 
						|
 | 
						|
func TestGenericFlagRegistry_IsFlagRegistered(t *testing.T) {
 | 
						|
	registry := NewGenericFlagRegistry()
 | 
						|
 | 
						|
	// Initially, no flags are registered
 | 
						|
	assert.False(t, registry.IsFlagRegistered("test-flag"))
 | 
						|
 | 
						|
	// Register a flag
 | 
						|
	boolValue := false
 | 
						|
	registry.values["test-flag"] = &boolValue
 | 
						|
 | 
						|
	// Now the flag should be registered
 | 
						|
	assert.True(t, registry.IsFlagRegistered("test-flag"))
 | 
						|
 | 
						|
	// Check a non-existent flag
 | 
						|
	assert.False(t, registry.IsFlagRegistered("non-existent"))
 | 
						|
 | 
						|
	// Register another flag
 | 
						|
	stringValue := "test"
 | 
						|
	registry.values["string-flag"] = &stringValue
 | 
						|
 | 
						|
	// Both flags should be registered
 | 
						|
	assert.True(t, registry.IsFlagRegistered("test-flag"))
 | 
						|
	assert.True(t, registry.IsFlagRegistered("string-flag"))
 | 
						|
 | 
						|
	// Case sensitivity check
 | 
						|
	assert.False(t, registry.IsFlagRegistered("TEST-FLAG"))
 | 
						|
}
 |