go_sysutils/envs/funcs_test.go
2024-04-11 12:46:13 -04:00

183 lines
5.6 KiB
Go

package envs
import (
`errors`
`os`
`testing`
`time`
`github.com/davecgh/go-spew/spew`
`r00t2.io/sysutils/errs`
)
type (
testCustom string
testStruct struct {
Hello string `envpop:"USER"`
HelloPtr *string `envpop:"USER"`
HelloForce string `envpop:"USER,force"`
HelloPtrForce *string `envpop:"USER,force"`
HelloNo string `envsub:"-" envpop:"-"`
HelloNoPtr *string `envsub:"-" envpop:"-"`
BadType int
NilField *string `envpop:"NONEXISTENTBADVAR,allow_empty"`
PtrInt *int
Custom testCustom
MapStr map[string]string
SliceStr []string
SliceSlice [][]string
SliceMap []map[string]string
SliceStruct []testStruct
}
)
func TestInterpolateString(t *testing.T) {
var err error
var s string = "My username is ${USER}; hello!"
var sp *string = &s
if err = InterpolateString(&s); err != nil {
t.Fatalf("Failed interpolation: %v", err)
}
t.Logf("String test passed:\n%v", s)
if err = InterpolateString(sp); err != nil {
t.Fatalf("Failed interpolation: %v", err)
}
t.Logf("String pointer test passed:\n%v", *sp)
}
func TestInterpolateStruct(t *testing.T) {
var err error
for _, i := range []interface{}{
"i am ${USER}, it is ${CURDATETIME}",
new(string),
/*
testStruct{
Hello: "i am ${USER}, it is ${CURDATETIME}",
HelloPtr: new(string),
HelloForce: "i am ${USER}, it is ${CURDATETIME}",
HelloPtrForce: new(string),
HelloNo: "i am ${USER}, it is ${CURDATETIME}",
HelloNoPtr: new(string),
BadType: 4,
NilField: nil,
PtrInt: new(int),
Custom: testCustom("i am ${USER}, it is ${CURDATETIME}"),
SliceStr: []string{"i am ${USER}, it is ${CURDATETIME}"},
SliceSlice: [][]string{[]string{"i am ${USER}, it is ${CURDATETIME}"}},
SliceMap: []map[string]string{map[string]string{"i am ${USER} key": "i am ${USER} value, it is ${CURDATETIME}"}},
SliceStruct: []testStruct{
{
Hello: "i am nested ${USER}, it is ${CURDATETIME}",
HelloPtr: nil,
HelloForce: "i am nested ${USER}, it is ${CURDATETIME}",
HelloPtrForce: nil,
HelloNo: "i am nested ${USER}, it is ${CURDATETIME}",
HelloNoPtr: nil,
BadType: 0,
NilField: nil,
PtrInt: nil,
Custom: testCustom("i am nested ${USER}, it is ${CURDATETIME}"),
SliceStr: []string{"i am nested ${USER}, it is ${CURDATETIME}"},
SliceSlice: [][]string{[]string{"i am nested ${USER}, it is ${CURDATETIME}"}},
SliceMap: []map[string]string{map[string]string{"i am nested ${USER} key": "i am ${USER} value, it is ${CURDATETIME}"}},
SliceStruct: nil,
},
},
},
*/
&testStruct{
Hello: "i am ${USER}, it is ${CURDATETIME}",
HelloPtr: new(string),
HelloForce: "i am ${USER}, it is ${CURDATETIME}",
HelloPtrForce: new(string),
HelloNo: "i am ${USER}, it is ${CURDATETIME}",
HelloNoPtr: new(string),
BadType: 4,
NilField: nil,
PtrInt: new(int),
Custom: testCustom("i am ${USER}, it is ${CURDATETIME}"),
MapStr: map[string]string{"i am ${USER} key": "i am ${USER} value, it is ${CURDATETIME}"},
SliceStr: []string{"i am ${USER}, it is ${CURDATETIME}"},
SliceSlice: [][]string{[]string{"i am ${USER}, it is ${CURDATETIME}"}},
SliceMap: []map[string]string{map[string]string{"i am ${USER} key": "i am ${USER} value, it is ${CURDATETIME}"}},
SliceStruct: []testStruct{
{
Hello: "i am nested ${USER}, it is ${CURDATETIME}",
HelloPtr: nil,
HelloForce: "i am nested ${USER}, it is ${CURDATETIME}",
HelloPtrForce: nil,
HelloNo: "i am nested ${USER}, it is ${CURDATETIME}",
HelloNoPtr: nil,
BadType: 0,
NilField: nil,
PtrInt: nil,
Custom: testCustom("i am nested ${USER}, it is ${CURDATETIME}"),
SliceStr: []string{"i am nested ${USER}, it is ${CURDATETIME}"},
SliceSlice: [][]string{[]string{"i am nested ${USER}, it is ${CURDATETIME}"}},
SliceMap: []map[string]string{map[string]string{"i am nested ${USER} key": "i am ${USER} value, it is ${CURDATETIME}"}},
SliceStruct: nil,
},
},
},
} {
if err = os.Setenv("CURDATETIME", time.Now().String()); err != nil {
t.Fatalf("Received error setting CURDATETIME: %v", err)
}
switch x := i.(type) {
case *string:
*x = "i am ${USER}, it is ${CURDATETIME}"
case testStruct:
*x.HelloPtr = x.Hello
*x.HelloPtrForce = x.HelloForce
*x.HelloNoPtr = x.HelloNo
*x.PtrInt = x.BadType
case *testStruct:
*x.HelloPtr = x.Hello
*x.HelloPtrForce = x.HelloForce
*x.HelloNoPtr = x.HelloNo
*x.PtrInt = x.BadType
}
t.Logf("Before (%T):\n%v", i, spew.Sdump(i))
if err = Interpolate(i); err != nil {
t.Fatalf("Failed interpolation: %v", err)
}
t.Logf("After (%T):\n%v\n", i, spew.Sdump(i))
}
}
func TestPopulateStruct(t *testing.T) {
var err error
var greet string = "My username is ${USER}; hello!"
var num int = 4
var sp *testStruct = &testStruct{
Hello: greet,
HelloPtr: &greet,
HelloForce: greet,
HelloPtrForce: &greet,
HelloNo: greet,
HelloNoPtr: &greet,
BadType: 4,
PtrInt: &num,
}
if err = PopulateStruct(sp); err != nil {
if errors.Is(err, errs.ErrNilPtr) {
err = nil
t.Logf("Detected nil.")
} else if errors.Is(err, errs.ErrBadType) {
err = nil
t.Log("Detected bad type.")
} else {
t.Fatalf("Failed interpolation: %v", err)
}
}
t.Logf("Evaluated:\n%v", spew.Sdump(sp))
}