git-lfs/config/config_test.go

299 lines
6.6 KiB
Go

package config
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestBasicTransfersOnlySetValue(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{
"lfs.basictransfersonly": []string{"true"},
},
})
b := cfg.BasicTransfersOnly()
assert.Equal(t, true, b)
}
func TestBasicTransfersOnlyDefault(t *testing.T) {
cfg := NewFrom(Values{})
b := cfg.BasicTransfersOnly()
assert.Equal(t, false, b)
}
func TestBasicTransfersOnlyInvalidValue(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{
"lfs.basictransfersonly": []string{"wat"},
},
})
b := cfg.BasicTransfersOnly()
assert.Equal(t, false, b)
}
func TestTusTransfersAllowedSetValue(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{
"lfs.tustransfers": []string{"true"},
},
})
b := cfg.TusTransfersAllowed()
assert.Equal(t, true, b)
}
func TestTusTransfersAllowedDefault(t *testing.T) {
cfg := NewFrom(Values{})
b := cfg.TusTransfersAllowed()
assert.Equal(t, false, b)
}
func TestTusTransfersAllowedInvalidValue(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{
"lfs.tustransfers": []string{"wat"},
},
})
b := cfg.TusTransfersAllowed()
assert.Equal(t, false, b)
}
func TestLoadValidExtension(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{},
})
cfg.extensions = map[string]Extension{
"foo": Extension{
"foo",
"foo-clean %f",
"foo-smudge %f",
2,
},
}
ext := cfg.Extensions()["foo"]
assert.Equal(t, "foo", ext.Name)
assert.Equal(t, "foo-clean %f", ext.Clean)
assert.Equal(t, "foo-smudge %f", ext.Smudge)
assert.Equal(t, 2, ext.Priority)
}
func TestLoadInvalidExtension(t *testing.T) {
cfg := NewFrom(Values{})
ext := cfg.Extensions()["foo"]
assert.Equal(t, "", ext.Name)
assert.Equal(t, "", ext.Clean)
assert.Equal(t, "", ext.Smudge)
assert.Equal(t, 0, ext.Priority)
}
func TestFetchPruneConfigDefault(t *testing.T) {
cfg := NewFrom(Values{})
fp := cfg.FetchPruneConfig()
assert.Equal(t, 7, fp.FetchRecentRefsDays)
assert.Equal(t, 0, fp.FetchRecentCommitsDays)
assert.Equal(t, 3, fp.PruneOffsetDays)
assert.True(t, fp.FetchRecentRefsIncludeRemotes)
assert.Equal(t, 3, fp.PruneOffsetDays)
assert.Equal(t, "origin", fp.PruneRemoteName)
assert.False(t, fp.PruneVerifyRemoteAlways)
}
func TestFetchPruneConfigCustom(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{
"lfs.fetchrecentrefsdays": []string{"12"},
"lfs.fetchrecentremoterefs": []string{"false"},
"lfs.fetchrecentcommitsdays": []string{"9"},
"lfs.pruneoffsetdays": []string{"30"},
"lfs.pruneverifyremotealways": []string{"true"},
"lfs.pruneremotetocheck": []string{"upstream"},
},
})
fp := cfg.FetchPruneConfig()
assert.Equal(t, 12, fp.FetchRecentRefsDays)
assert.Equal(t, 9, fp.FetchRecentCommitsDays)
assert.False(t, fp.FetchRecentRefsIncludeRemotes)
assert.Equal(t, 30, fp.PruneOffsetDays)
assert.Equal(t, "upstream", fp.PruneRemoteName)
assert.True(t, fp.PruneVerifyRemoteAlways)
}
func TestFetchIncludeExcludesAreCleaned(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{
"lfs.fetchinclude": []string{"/path/to/clean/"},
"lfs.fetchexclude": []string{"/other/path/to/clean/"},
},
})
assert.Equal(t, []string{"/path/to/clean"}, cfg.FetchIncludePaths())
assert.Equal(t, []string{"/other/path/to/clean"}, cfg.FetchExcludePaths())
}
func TestUnmarshalMultipleTypes(t *testing.T) {
cfg := NewFrom(Values{
Git: map[string][]string{
"string": []string{"string"},
"int": []string{"1"},
"bool": []string{"true"},
},
Os: map[string][]string{
"string": []string{"string"},
"int": []string{"1"},
"bool": []string{"true"},
},
})
v := &struct {
GitString string `git:"string"`
GitInt int `git:"int"`
GitBool bool `git:"bool"`
OsString string `os:"string"`
OsInt int `os:"int"`
OsBool bool `os:"bool"`
}{}
assert.Nil(t, cfg.Unmarshal(v))
assert.Equal(t, "string", v.GitString)
assert.Equal(t, 1, v.GitInt)
assert.Equal(t, true, v.GitBool)
assert.Equal(t, "string", v.OsString)
assert.Equal(t, 1, v.OsInt)
assert.Equal(t, true, v.OsBool)
}
func TestUnmarshalErrsOnNonPointerType(t *testing.T) {
type T struct {
Foo string `git:"foo"`
}
cfg := NewFrom(Values{})
err := cfg.Unmarshal(T{})
assert.Equal(t, "lfs/config: unable to parse non-pointer type of config.T", err.Error())
}
func TestUnmarshalLeavesNonZeroValuesWhenKeysEmpty(t *testing.T) {
v := &struct {
String string `git:"string"`
Int int `git:"int"`
Bool bool `git:"bool"`
}{"foo", 1, true}
cfg := NewFrom(Values{})
err := cfg.Unmarshal(v)
assert.Nil(t, err)
assert.Equal(t, "foo", v.String)
assert.Equal(t, 1, v.Int)
assert.Equal(t, true, v.Bool)
}
func TestUnmarshalOverridesNonZeroValuesWhenValuesPresent(t *testing.T) {
v := &struct {
String string `git:"string"`
Int int `git:"int"`
Bool bool `git:"bool"`
}{"foo", 1, true}
cfg := NewFrom(Values{
Git: map[string][]string{
"string": []string{"bar"},
"int": []string{"2"},
"bool": []string{"false"},
},
})
err := cfg.Unmarshal(v)
assert.Nil(t, err)
assert.Equal(t, "bar", v.String)
assert.Equal(t, 2, v.Int)
assert.Equal(t, false, v.Bool)
}
func TestUnmarshalAllowsBothOsAndGitTags(t *testing.T) {
v := &struct {
String string `git:"string" os:"STRING"`
}{}
cfg := NewFrom(Values{
Git: map[string][]string{"string": []string{"foo"}},
Os: map[string][]string{"STRING": []string{"bar"}},
})
err := cfg.Unmarshal(v)
assert.Nil(t, err)
assert.Equal(t, "foo", v.String)
}
func TestUnmarshalYieldsToDefaultIfBothEnvsMissing(t *testing.T) {
v := &struct {
String string `git:"string" os:"STRING"`
}{"foo"}
cfg := NewFrom(Values{})
err := cfg.Unmarshal(v)
assert.Nil(t, err)
assert.Equal(t, "foo", v.String)
}
func TestUnmarshalOverridesDefaultIfAnyEnvPresent(t *testing.T) {
v := &struct {
String string `git:"string" os:"STRING"`
}{"foo"}
cfg := NewFrom(Values{
Git: map[string][]string{"string": []string{"bar"}},
Os: map[string][]string{"STRING": []string{"baz"}},
})
err := cfg.Unmarshal(v)
assert.Nil(t, err)
assert.Equal(t, "bar", v.String)
}
func TestUnmarshalIgnoresUnknownEnvironments(t *testing.T) {
v := &struct {
String string `unknown:"string"`
}{}
cfg := NewFrom(Values{})
assert.Nil(t, cfg.Unmarshal(v))
}
func TestUnmarshalErrsOnUnsupportedTypes(t *testing.T) {
v := &struct {
Unsupported time.Duration `git:"duration"`
}{}
cfg := NewFrom(Values{
Git: map[string][]string{"duration": []string{"foo"}},
})
err := cfg.Unmarshal(v)
assert.Equal(t, "lfs/config: unsupported target type for field \"Unsupported\": time.Duration", err.Error())
}