97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| package options
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| func TestToDurationHook(t *testing.T) {
 | |
| 	type result struct {
 | |
| 		Duration time.Duration `yaml:"duration"`
 | |
| 	}
 | |
| 
 | |
| 	tests := []struct {
 | |
| 		name        string
 | |
| 		input       map[string]interface{}
 | |
| 		out         result
 | |
| 		expected    time.Duration
 | |
| 		expectedErr bool
 | |
| 	}{
 | |
| 		{
 | |
| 			name:        "Valid String Duration with single unit",
 | |
| 			input:       map[string]interface{}{"duration": "3s"},
 | |
| 			out:         result{},
 | |
| 			expected:    3 * time.Second,
 | |
| 			expectedErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "Valid String Duration with multiple units",
 | |
| 			input:       map[string]interface{}{"duration": "1h20m30s"},
 | |
| 			out:         result{},
 | |
| 			expected:    1*time.Hour + 20*time.Minute + 30*time.Second,
 | |
| 			expectedErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "Valid Float Duration",
 | |
| 			input:       map[string]interface{}{"duration": 2.5},
 | |
| 			out:         result{},
 | |
| 			expected:    2500 * time.Millisecond,
 | |
| 			expectedErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "Valid Int64 Duration",
 | |
| 			input:       map[string]interface{}{"duration": int64(5000000000)},
 | |
| 			out:         result{},
 | |
| 			expected:    5 * time.Second,
 | |
| 			expectedErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "Invalid String",
 | |
| 			input:       map[string]interface{}{"duration": "invalid"},
 | |
| 			out:         result{},
 | |
| 			expected:    0,
 | |
| 			expectedErr: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "Unsupported Type",
 | |
| 			input:       map[string]interface{}{"duration": true},
 | |
| 			out:         result{},
 | |
| 			expected:    0,
 | |
| 			expectedErr: true,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			var result struct {
 | |
| 				Duration time.Duration `yaml:"duration"`
 | |
| 			}
 | |
| 
 | |
| 			err := Decode(tt.input, &result)
 | |
| 			if (err != nil) != tt.expectedErr {
 | |
| 				t.Errorf("expected error: %v, got: %v", tt.expectedErr, err)
 | |
| 			}
 | |
| 
 | |
| 			if !tt.expectedErr {
 | |
| 				if result.Duration != tt.expected {
 | |
| 					t.Errorf("expected: %v, got: %v", tt.expected, result.Duration)
 | |
| 				}
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestStringToBytesHook(t *testing.T) {
 | |
| 	var result struct {
 | |
| 		Value []byte `yaml:"value"`
 | |
| 	}
 | |
| 
 | |
| 	if err := Decode(map[string]interface{}{"value": "hello-world"}, &result); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	if string(result.Value) != "hello-world" {
 | |
| 		t.Errorf("expected %q, got %q", "hello-world", string(result.Value))
 | |
| 	}
 | |
| }
 |