| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- package app
- import (
- "testing"
- )
- // Test structs that mirror the actual configuration structure
- type TestBaseConfigForTemplate struct {
- Enabled bool `json:"enabled"`
- ScanIntervalSeconds int `json:"scan_interval_seconds"`
- MaxConcurrent int `json:"max_concurrent"`
- }
- type TestTaskConfigForTemplate struct {
- TestBaseConfigForTemplate
- TaskSpecificField float64 `json:"task_specific_field"`
- AnotherSpecificField string `json:"another_specific_field"`
- }
- func TestGetTaskFieldValue_EmbeddedStructFields(t *testing.T) {
- config := &TestTaskConfigForTemplate{
- TestBaseConfigForTemplate: TestBaseConfigForTemplate{
- Enabled: true,
- ScanIntervalSeconds: 2400,
- MaxConcurrent: 5,
- },
- TaskSpecificField: 0.18,
- AnotherSpecificField: "test_value",
- }
- // Test embedded struct fields
- tests := []struct {
- fieldName string
- expectedValue interface{}
- description string
- }{
- {"enabled", true, "BaseConfig boolean field"},
- {"scan_interval_seconds", 2400, "BaseConfig integer field"},
- {"max_concurrent", 5, "BaseConfig integer field"},
- {"task_specific_field", 0.18, "Task-specific float field"},
- {"another_specific_field", "test_value", "Task-specific string field"},
- }
- for _, test := range tests {
- t.Run(test.description, func(t *testing.T) {
- result := getTaskFieldValue(config, test.fieldName)
- if result != test.expectedValue {
- t.Errorf("Field %s: expected %v (%T), got %v (%T)",
- test.fieldName, test.expectedValue, test.expectedValue, result, result)
- }
- })
- }
- }
- func TestGetTaskFieldValue_NonExistentField(t *testing.T) {
- config := &TestTaskConfigForTemplate{
- TestBaseConfigForTemplate: TestBaseConfigForTemplate{
- Enabled: true,
- ScanIntervalSeconds: 1800,
- MaxConcurrent: 3,
- },
- }
- result := getTaskFieldValue(config, "non_existent_field")
- if result != nil {
- t.Errorf("Expected nil for non-existent field, got %v", result)
- }
- }
- func TestGetTaskFieldValue_NilConfig(t *testing.T) {
- var config *TestTaskConfigForTemplate = nil
- result := getTaskFieldValue(config, "enabled")
- if result != nil {
- t.Errorf("Expected nil for nil config, got %v", result)
- }
- }
- func TestGetTaskFieldValue_EmptyStruct(t *testing.T) {
- config := &TestTaskConfigForTemplate{}
- // Test that we can extract zero values
- tests := []struct {
- fieldName string
- expectedValue interface{}
- description string
- }{
- {"enabled", false, "Zero value boolean"},
- {"scan_interval_seconds", 0, "Zero value integer"},
- {"max_concurrent", 0, "Zero value integer"},
- {"task_specific_field", 0.0, "Zero value float"},
- {"another_specific_field", "", "Zero value string"},
- }
- for _, test := range tests {
- t.Run(test.description, func(t *testing.T) {
- result := getTaskFieldValue(config, test.fieldName)
- if result != test.expectedValue {
- t.Errorf("Field %s: expected %v (%T), got %v (%T)",
- test.fieldName, test.expectedValue, test.expectedValue, result, result)
- }
- })
- }
- }
- func TestGetTaskFieldValue_NonStructConfig(t *testing.T) {
- var config interface{} = "not a struct"
- result := getTaskFieldValue(config, "enabled")
- if result != nil {
- t.Errorf("Expected nil for non-struct config, got %v", result)
- }
- }
- func TestGetTaskFieldValue_PointerToStruct(t *testing.T) {
- config := &TestTaskConfigForTemplate{
- TestBaseConfigForTemplate: TestBaseConfigForTemplate{
- Enabled: false,
- ScanIntervalSeconds: 900,
- MaxConcurrent: 2,
- },
- TaskSpecificField: 0.35,
- }
- // Test that pointers are handled correctly
- enabledResult := getTaskFieldValue(config, "enabled")
- if enabledResult != false {
- t.Errorf("Expected false for enabled field, got %v", enabledResult)
- }
- intervalResult := getTaskFieldValue(config, "scan_interval_seconds")
- if intervalResult != 900 {
- t.Errorf("Expected 900 for scan_interval_seconds field, got %v", intervalResult)
- }
- }
- func TestGetTaskFieldValue_FieldsWithJSONOmitempty(t *testing.T) {
- // Test struct with omitempty tags
- type TestConfigWithOmitempty struct {
- TestBaseConfigForTemplate
- OptionalField string `json:"optional_field,omitempty"`
- }
- config := &TestConfigWithOmitempty{
- TestBaseConfigForTemplate: TestBaseConfigForTemplate{
- Enabled: true,
- ScanIntervalSeconds: 1200,
- MaxConcurrent: 4,
- },
- OptionalField: "optional_value",
- }
- // Test that fields with omitempty are still found
- result := getTaskFieldValue(config, "optional_field")
- if result != "optional_value" {
- t.Errorf("Expected 'optional_value' for optional_field, got %v", result)
- }
- // Test embedded fields still work
- enabledResult := getTaskFieldValue(config, "enabled")
- if enabledResult != true {
- t.Errorf("Expected true for enabled field, got %v", enabledResult)
- }
- }
- func TestGetTaskFieldValue_DeepEmbedding(t *testing.T) {
- // Test with multiple levels of embedding
- type DeepBaseConfig struct {
- DeepField string `json:"deep_field"`
- }
- type MiddleConfig struct {
- DeepBaseConfig
- MiddleField int `json:"middle_field"`
- }
- type TopConfig struct {
- MiddleConfig
- TopField bool `json:"top_field"`
- }
- config := &TopConfig{
- MiddleConfig: MiddleConfig{
- DeepBaseConfig: DeepBaseConfig{
- DeepField: "deep_value",
- },
- MiddleField: 123,
- },
- TopField: true,
- }
- // Test that deeply embedded fields are found
- deepResult := getTaskFieldValue(config, "deep_field")
- if deepResult != "deep_value" {
- t.Errorf("Expected 'deep_value' for deep_field, got %v", deepResult)
- }
- middleResult := getTaskFieldValue(config, "middle_field")
- if middleResult != 123 {
- t.Errorf("Expected 123 for middle_field, got %v", middleResult)
- }
- topResult := getTaskFieldValue(config, "top_field")
- if topResult != true {
- t.Errorf("Expected true for top_field, got %v", topResult)
- }
- }
- // Benchmark to ensure performance is reasonable
- func BenchmarkGetTaskFieldValue(b *testing.B) {
- config := &TestTaskConfigForTemplate{
- TestBaseConfigForTemplate: TestBaseConfigForTemplate{
- Enabled: true,
- ScanIntervalSeconds: 1800,
- MaxConcurrent: 3,
- },
- TaskSpecificField: 0.25,
- AnotherSpecificField: "benchmark_test",
- }
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- // Test both embedded and regular fields
- _ = getTaskFieldValue(config, "enabled")
- _ = getTaskFieldValue(config, "task_specific_field")
- }
- }
|