2023-05-16 16:01:50 +00:00
|
|
|
package bundle
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
type mutatorWithError struct {
|
|
|
|
applyCalled int
|
|
|
|
errorMsg string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *mutatorWithError) Name() string {
|
|
|
|
return "mutatorWithError"
|
|
|
|
}
|
|
|
|
|
2023-05-24 12:45:19 +00:00
|
|
|
func (t *mutatorWithError) Apply(_ context.Context, b *Bundle) error {
|
2023-05-16 16:01:50 +00:00
|
|
|
t.applyCalled++
|
2023-05-24 12:45:19 +00:00
|
|
|
return fmt.Errorf(t.errorMsg)
|
2023-05-16 16:01:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestDeferredMutatorWhenAllMutatorsSucceed(t *testing.T) {
|
|
|
|
m1 := &testMutator{}
|
|
|
|
m2 := &testMutator{}
|
|
|
|
m3 := &testMutator{}
|
|
|
|
cleanup := &testMutator{}
|
2023-05-24 12:45:19 +00:00
|
|
|
deferredMutator := Defer(Seq(m1, m2, m3), cleanup)
|
2023-05-16 16:01:50 +00:00
|
|
|
|
2023-11-15 14:03:36 +00:00
|
|
|
b := &Bundle{}
|
|
|
|
err := Apply(context.Background(), b, deferredMutator)
|
2023-05-16 16:01:50 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
assert.Equal(t, 1, m1.applyCalled)
|
|
|
|
assert.Equal(t, 1, m2.applyCalled)
|
|
|
|
assert.Equal(t, 1, m3.applyCalled)
|
|
|
|
assert.Equal(t, 1, cleanup.applyCalled)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDeferredMutatorWhenFirstFails(t *testing.T) {
|
|
|
|
m1 := &testMutator{}
|
|
|
|
m2 := &testMutator{}
|
|
|
|
mErr := &mutatorWithError{errorMsg: "mutator error occurred"}
|
|
|
|
cleanup := &testMutator{}
|
2023-05-24 12:45:19 +00:00
|
|
|
deferredMutator := Defer(Seq(mErr, m1, m2), cleanup)
|
2023-05-16 16:01:50 +00:00
|
|
|
|
2023-11-15 14:03:36 +00:00
|
|
|
b := &Bundle{}
|
|
|
|
err := Apply(context.Background(), b, deferredMutator)
|
2023-05-16 16:01:50 +00:00
|
|
|
assert.ErrorContains(t, err, "mutator error occurred")
|
|
|
|
|
|
|
|
assert.Equal(t, 1, mErr.applyCalled)
|
|
|
|
assert.Equal(t, 0, m1.applyCalled)
|
|
|
|
assert.Equal(t, 0, m2.applyCalled)
|
|
|
|
assert.Equal(t, 1, cleanup.applyCalled)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDeferredMutatorWhenMiddleOneFails(t *testing.T) {
|
|
|
|
m1 := &testMutator{}
|
|
|
|
m2 := &testMutator{}
|
|
|
|
mErr := &mutatorWithError{errorMsg: "mutator error occurred"}
|
|
|
|
cleanup := &testMutator{}
|
2023-05-24 12:45:19 +00:00
|
|
|
deferredMutator := Defer(Seq(m1, mErr, m2), cleanup)
|
2023-05-16 16:01:50 +00:00
|
|
|
|
2023-11-15 14:03:36 +00:00
|
|
|
b := &Bundle{}
|
|
|
|
err := Apply(context.Background(), b, deferredMutator)
|
2023-05-16 16:01:50 +00:00
|
|
|
assert.ErrorContains(t, err, "mutator error occurred")
|
|
|
|
|
|
|
|
assert.Equal(t, 1, m1.applyCalled)
|
|
|
|
assert.Equal(t, 1, mErr.applyCalled)
|
|
|
|
assert.Equal(t, 0, m2.applyCalled)
|
|
|
|
assert.Equal(t, 1, cleanup.applyCalled)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDeferredMutatorWhenLastOneFails(t *testing.T) {
|
|
|
|
m1 := &testMutator{}
|
|
|
|
m2 := &testMutator{}
|
|
|
|
mErr := &mutatorWithError{errorMsg: "mutator error occurred"}
|
|
|
|
cleanup := &testMutator{}
|
2023-05-24 12:45:19 +00:00
|
|
|
deferredMutator := Defer(Seq(m1, m2, mErr), cleanup)
|
2023-05-16 16:01:50 +00:00
|
|
|
|
2023-11-15 14:03:36 +00:00
|
|
|
b := &Bundle{}
|
|
|
|
err := Apply(context.Background(), b, deferredMutator)
|
2023-05-16 16:01:50 +00:00
|
|
|
assert.ErrorContains(t, err, "mutator error occurred")
|
|
|
|
|
|
|
|
assert.Equal(t, 1, m1.applyCalled)
|
|
|
|
assert.Equal(t, 1, m2.applyCalled)
|
|
|
|
assert.Equal(t, 1, mErr.applyCalled)
|
|
|
|
assert.Equal(t, 1, cleanup.applyCalled)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDeferredMutatorCombinesErrorMessages(t *testing.T) {
|
|
|
|
m1 := &testMutator{}
|
|
|
|
m2 := &testMutator{}
|
|
|
|
mErr := &mutatorWithError{errorMsg: "mutator error occurred"}
|
|
|
|
cleanupErr := &mutatorWithError{errorMsg: "cleanup error occurred"}
|
2023-05-24 12:45:19 +00:00
|
|
|
deferredMutator := Defer(Seq(m1, m2, mErr), cleanupErr)
|
2023-05-16 16:01:50 +00:00
|
|
|
|
2023-11-15 14:03:36 +00:00
|
|
|
b := &Bundle{}
|
|
|
|
err := Apply(context.Background(), b, deferredMutator)
|
2023-05-16 16:01:50 +00:00
|
|
|
assert.ErrorContains(t, err, "mutator error occurred\ncleanup error occurred")
|
|
|
|
|
|
|
|
assert.Equal(t, 1, m1.applyCalled)
|
|
|
|
assert.Equal(t, 1, m2.applyCalled)
|
|
|
|
assert.Equal(t, 1, mErr.applyCalled)
|
|
|
|
assert.Equal(t, 1, cleanupErr.applyCalled)
|
|
|
|
}
|