composite_test.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package cleanups
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "testing"
  7. "gotest.tools/v3/assert"
  8. is "gotest.tools/v3/assert/cmp"
  9. )
  10. func TestCall(t *testing.T) {
  11. c := Composite{}
  12. var err1 = errors.New("error1")
  13. var err2 = errors.New("error2")
  14. var errX = errors.New("errorX")
  15. var errY = errors.New("errorY")
  16. var errZ = errors.New("errorZ")
  17. var errYZ = errors.Join(errY, errZ)
  18. c.Add(func(ctx context.Context) error {
  19. return err1
  20. })
  21. c.Add(func(ctx context.Context) error {
  22. return nil
  23. })
  24. c.Add(func(ctx context.Context) error {
  25. return fmt.Errorf("something happened: %w", err2)
  26. })
  27. c.Add(func(ctx context.Context) error {
  28. return errors.Join(errX, fmt.Errorf("joined: %w", errYZ))
  29. })
  30. err := c.Call(context.Background())
  31. errs := err.(interface{ Unwrap() []error }).Unwrap()
  32. assert.Check(t, is.ErrorContains(err, err1.Error()))
  33. assert.Check(t, is.ErrorContains(err, err2.Error()))
  34. assert.Check(t, is.ErrorContains(err, errX.Error()))
  35. assert.Check(t, is.ErrorContains(err, errY.Error()))
  36. assert.Check(t, is.ErrorContains(err, errZ.Error()))
  37. assert.Check(t, is.ErrorContains(err, "something happened: "+err2.Error()))
  38. t.Logf(err.Error())
  39. assert.Assert(t, is.Len(errs, 3))
  40. // Cleanups executed in reverse order.
  41. assert.Check(t, is.ErrorIs(errs[2], err1))
  42. assert.Check(t, is.ErrorIs(errs[1], err2))
  43. assert.Check(t, is.ErrorIs(errs[0], errX))
  44. assert.Check(t, is.ErrorIs(errs[0], errYZ))
  45. }