1package env
2
3import (
4 "os"
5 "strings"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9)
10
11func TestOsEnv_Get(t *testing.T) {
12 env := New()
13
14 // Test getting an existing environment variable
15 os.Setenv("TEST_VAR", "test_value")
16 defer os.Unsetenv("TEST_VAR")
17
18 value := env.Get("TEST_VAR")
19 assert.Equal(t, "test_value", value)
20
21 // Test getting a non-existent environment variable
22 value = env.Get("NON_EXISTENT_VAR")
23 assert.Equal(t, "", value)
24}
25
26func TestOsEnv_Env(t *testing.T) {
27 env := New()
28
29 envVars := env.Env()
30
31 // Environment should not be empty in normal circumstances
32 assert.NotNil(t, envVars)
33 assert.Greater(t, len(envVars), 0)
34
35 // Each environment variable should be in key=value format
36 for _, envVar := range envVars {
37 assert.Contains(t, envVar, "=")
38 }
39}
40
41func TestNewFromMap(t *testing.T) {
42 testMap := map[string]string{
43 "KEY1": "value1",
44 "KEY2": "value2",
45 }
46
47 env := NewFromMap(testMap)
48 assert.NotNil(t, env)
49 assert.IsType(t, &mapEnv{}, env)
50}
51
52func TestMapEnv_Get(t *testing.T) {
53 testMap := map[string]string{
54 "KEY1": "value1",
55 "KEY2": "value2",
56 }
57
58 env := NewFromMap(testMap)
59
60 // Test getting existing keys
61 assert.Equal(t, "value1", env.Get("KEY1"))
62 assert.Equal(t, "value2", env.Get("KEY2"))
63
64 // Test getting non-existent key
65 assert.Equal(t, "", env.Get("NON_EXISTENT"))
66}
67
68func TestMapEnv_Env(t *testing.T) {
69 t.Run("with values", func(t *testing.T) {
70 testMap := map[string]string{
71 "KEY1": "value1",
72 "KEY2": "value2",
73 }
74
75 env := NewFromMap(testMap)
76 envVars := env.Env()
77
78 assert.Len(t, envVars, 2)
79
80 // Convert to map for easier testing (order is not guaranteed)
81 envMap := make(map[string]string)
82 for _, envVar := range envVars {
83 parts := strings.SplitN(envVar, "=", 2)
84 assert.Len(t, parts, 2)
85 envMap[parts[0]] = parts[1]
86 }
87
88 assert.Equal(t, "value1", envMap["KEY1"])
89 assert.Equal(t, "value2", envMap["KEY2"])
90 })
91
92 t.Run("empty map", func(t *testing.T) {
93 env := NewFromMap(map[string]string{})
94 envVars := env.Env()
95 assert.Nil(t, envVars)
96 })
97
98 t.Run("nil map", func(t *testing.T) {
99 env := NewFromMap(nil)
100 envVars := env.Env()
101 assert.Nil(t, envVars)
102 })
103}
104
105func TestMapEnv_GetEmptyValue(t *testing.T) {
106 testMap := map[string]string{
107 "EMPTY_KEY": "",
108 "NORMAL_KEY": "value",
109 }
110
111 env := NewFromMap(testMap)
112
113 // Test that empty values are returned correctly
114 assert.Equal(t, "", env.Get("EMPTY_KEY"))
115 assert.Equal(t, "value", env.Get("NORMAL_KEY"))
116}
117
118func TestMapEnv_EnvFormat(t *testing.T) {
119 testMap := map[string]string{
120 "KEY_WITH_EQUALS": "value=with=equals",
121 "KEY_WITH_SPACES": "value with spaces",
122 }
123
124 env := NewFromMap(testMap)
125 envVars := env.Env()
126
127 assert.Len(t, envVars, 2)
128
129 // Check that the format is correct even with special characters
130 found := make(map[string]bool)
131 for _, envVar := range envVars {
132 if envVar == "KEY_WITH_EQUALS=value=with=equals" {
133 found["equals"] = true
134 }
135 if envVar == "KEY_WITH_SPACES=value with spaces" {
136 found["spaces"] = true
137 }
138 }
139
140 assert.True(t, found["equals"], "Should handle values with equals signs")
141 assert.True(t, found["spaces"], "Should handle values with spaces")
142}