113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package env
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"os"
 | 
						|
	"testing"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/micro/go-micro/v2/config/source"
 | 
						|
)
 | 
						|
 | 
						|
func TestEnv_Read(t *testing.T) {
 | 
						|
	expected := map[string]map[string]string{
 | 
						|
		"database": {
 | 
						|
			"host":       "localhost",
 | 
						|
			"password":   "password",
 | 
						|
			"datasource": "user:password@tcp(localhost:port)/db?charset=utf8mb4&parseTime=True&loc=Local",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	os.Setenv("DATABASE_HOST", "localhost")
 | 
						|
	os.Setenv("DATABASE_PASSWORD", "password")
 | 
						|
	os.Setenv("DATABASE_DATASOURCE", "user:password@tcp(localhost:port)/db?charset=utf8mb4&parseTime=True&loc=Local")
 | 
						|
 | 
						|
	source := NewSource()
 | 
						|
	c, err := source.Read()
 | 
						|
	if err != nil {
 | 
						|
		t.Error(err)
 | 
						|
	}
 | 
						|
 | 
						|
	var actual map[string]interface{}
 | 
						|
	if err := json.Unmarshal(c.Data, &actual); err != nil {
 | 
						|
		t.Error(err)
 | 
						|
	}
 | 
						|
 | 
						|
	actualDB := actual["database"].(map[string]interface{})
 | 
						|
 | 
						|
	for k, v := range expected["database"] {
 | 
						|
		a := actualDB[k]
 | 
						|
 | 
						|
		if a != v {
 | 
						|
			t.Errorf("expected %v got %v", v, a)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestEnvvar_Prefixes(t *testing.T) {
 | 
						|
	os.Setenv("APP_DATABASE_HOST", "localhost")
 | 
						|
	os.Setenv("APP_DATABASE_PASSWORD", "password")
 | 
						|
	os.Setenv("VAULT_ADDR", "vault:1337")
 | 
						|
	os.Setenv("MICRO_REGISTRY", "mdns")
 | 
						|
 | 
						|
	var prefixtests = []struct {
 | 
						|
		prefixOpts   []source.Option
 | 
						|
		expectedKeys []string
 | 
						|
	}{
 | 
						|
		{[]source.Option{WithPrefix("APP", "MICRO")}, []string{"app", "micro"}},
 | 
						|
		{[]source.Option{WithPrefix("MICRO"), WithStrippedPrefix("APP")}, []string{"database", "micro"}},
 | 
						|
		{[]source.Option{WithPrefix("MICRO"), WithStrippedPrefix("APP")}, []string{"database", "micro"}},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, pt := range prefixtests {
 | 
						|
		source := NewSource(pt.prefixOpts...)
 | 
						|
 | 
						|
		c, err := source.Read()
 | 
						|
		if err != nil {
 | 
						|
			t.Error(err)
 | 
						|
		}
 | 
						|
 | 
						|
		var actual map[string]interface{}
 | 
						|
		if err := json.Unmarshal(c.Data, &actual); err != nil {
 | 
						|
			t.Error(err)
 | 
						|
		}
 | 
						|
 | 
						|
		// assert other prefixes ignored
 | 
						|
		if l := len(actual); l != len(pt.expectedKeys) {
 | 
						|
			t.Errorf("expected %v top keys, got %v", len(pt.expectedKeys), l)
 | 
						|
		}
 | 
						|
 | 
						|
		for _, k := range pt.expectedKeys {
 | 
						|
			if !containsKey(actual, k) {
 | 
						|
				t.Errorf("expected key %v, not found", k)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestEnvvar_WatchNextNoOpsUntilStop(t *testing.T) {
 | 
						|
	src := NewSource(WithStrippedPrefix("GOMICRO_"))
 | 
						|
	w, err := src.Watch()
 | 
						|
	if err != nil {
 | 
						|
		t.Error(err)
 | 
						|
	}
 | 
						|
 | 
						|
	go func() {
 | 
						|
		time.Sleep(50 * time.Millisecond)
 | 
						|
		w.Stop()
 | 
						|
	}()
 | 
						|
 | 
						|
	if _, err := w.Next(); err != source.ErrWatcherStopped {
 | 
						|
		t.Errorf("expected watcher stopped error, got %v", err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func containsKey(m map[string]interface{}, s string) bool {
 | 
						|
	for k := range m {
 | 
						|
		if k == s {
 | 
						|
			return true
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return false
 | 
						|
}
 |