package skip import ( "bytes" "fmt" "testing" "gotest.tools/v3/assert" "gotest.tools/v3/assert/cmp" ) type fakeSkipT struct { reason string logs []string } func (f *fakeSkipT) Skip(args ...interface{}) { buf := new(bytes.Buffer) for _, arg := range args { buf.WriteString(fmt.Sprintf("%s", arg)) } f.reason = buf.String() } func (f *fakeSkipT) Log(args ...interface{}) { f.logs = append(f.logs, fmt.Sprintf("%s", args[0])) } func (f *fakeSkipT) Helper() {} func version(v string) string { return v } func TestIfCondition(t *testing.T) { skipT := &fakeSkipT{} apiVersion := "v1.4" If(skipT, apiVersion < version("v1.6")) assert.Equal(t, `apiVersion < version("v1.6")`, skipT.reason) assert.Assert(t, cmp.Len(skipT.logs, 0)) } func TestIfConditionWithMessage(t *testing.T) { skipT := &fakeSkipT{} apiVersion := "v1.4" If(skipT, apiVersion < "v1.6", "see notes") assert.Equal(t, `apiVersion < "v1.6": see notes`, skipT.reason) assert.Assert(t, cmp.Len(skipT.logs, 0)) } func TestIfConditionMultiline(t *testing.T) { skipT := &fakeSkipT{} apiVersion := "v1.4" If( skipT, apiVersion < "v1.6") assert.Equal(t, `apiVersion < "v1.6"`, skipT.reason) assert.Assert(t, cmp.Len(skipT.logs, 0)) } func TestIfConditionMultilineWithMessage(t *testing.T) { skipT := &fakeSkipT{} apiVersion := "v1.4" If( skipT, apiVersion < "v1.6", "see notes") assert.Equal(t, `apiVersion < "v1.6": see notes`, skipT.reason) assert.Assert(t, cmp.Len(skipT.logs, 0)) } func TestIfConditionNoSkip(t *testing.T) { skipT := &fakeSkipT{} If(skipT, false) assert.Equal(t, "", skipT.reason) assert.Assert(t, cmp.Len(skipT.logs, 0)) } func SkipBecauseISaidSo() bool { return true } func TestIf(t *testing.T) { skipT := &fakeSkipT{} If(skipT, SkipBecauseISaidSo) assert.Equal(t, "SkipBecauseISaidSo", skipT.reason) } func TestIfWithMessage(t *testing.T) { skipT := &fakeSkipT{} If(skipT, SkipBecauseISaidSo, "see notes") assert.Equal(t, "SkipBecauseISaidSo: see notes", skipT.reason) } func TestIf_InvalidCondition(t *testing.T) { skipT := &fakeSkipT{} assert.Assert(t, cmp.Panics(func() { If(skipT, "just a string") })) } func TestIfWithSkipResultFunc(t *testing.T) { t.Run("no extra message", func(t *testing.T) { skipT := &fakeSkipT{} If(skipT, alwaysSkipWithMessage) assert.Equal(t, "alwaysSkipWithMessage: skip because I said so!", skipT.reason) }) t.Run("with extra message", func(t *testing.T) { skipT := &fakeSkipT{} If(skipT, alwaysSkipWithMessage, "also %v", 4) assert.Equal(t, "alwaysSkipWithMessage: skip because I said so!: also 4", skipT.reason) }) } func alwaysSkipWithMessage() Result { return skipResult{} } type skipResult struct{} func (s skipResult) Skip() bool { return true } func (s skipResult) Message() string { return "skip because I said so!" }