github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/util/railway/railway_test.go (about)

     1  package railway_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
     7  	"code.cloudfoundry.org/cli/util/railway"
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  )
    11  
    12  var _ = Describe("Sequentially()", func() {
    13  	Describe("with no errors", func() {
    14  		It("calls all the tracks", func() {
    15  			var (
    16  				i = 0
    17  				j = 0
    18  			)
    19  
    20  			_, _ = railway.Sequentially(
    21  				func() (ccv3.Warnings, error) { i = 1; return ccv3.Warnings{}, nil },
    22  				func() (ccv3.Warnings, error) { j = 2; return ccv3.Warnings{}, nil },
    23  			)
    24  
    25  			Expect(i).To(Equal(1))
    26  			Expect(j).To(Equal(2))
    27  		})
    28  
    29  		It("calls the tracks in order", func() {
    30  			i := 0
    31  
    32  			_, _ = railway.Sequentially(
    33  				func() (ccv3.Warnings, error) { i = 1; return ccv3.Warnings{}, nil },
    34  				func() (ccv3.Warnings, error) { i = 2; return ccv3.Warnings{}, nil },
    35  			)
    36  
    37  			Expect(i).To(Equal(2))
    38  		})
    39  	})
    40  
    41  	Describe("with errors", func() {
    42  		It("returns the first error", func() {
    43  			_, err := railway.Sequentially(
    44  				func() (ccv3.Warnings, error) { return ccv3.Warnings{}, errors.New("error 1") },
    45  				func() (ccv3.Warnings, error) { return ccv3.Warnings{}, errors.New("error 2") },
    46  			)
    47  
    48  			Expect(err).To(Equal(errors.New("error 1")))
    49  		})
    50  
    51  		It("runs all tracks before the error", func() {
    52  			i := 0
    53  
    54  			_, err := railway.Sequentially(
    55  				func() (ccv3.Warnings, error) { i = 1; return ccv3.Warnings{}, nil },
    56  				func() (ccv3.Warnings, error) { return ccv3.Warnings{}, errors.New("error 1") },
    57  			)
    58  
    59  			Expect(err).To(Equal(errors.New("error 1")))
    60  			Expect(i).To(Equal(1))
    61  		})
    62  	})
    63  
    64  	Describe("with warnings", func() {
    65  		It("returns empty warnings when nothing runs", func() {
    66  			Expect(railway.Sequentially()).To(BeEmpty())
    67  		})
    68  
    69  		It("returns combines warnings on successes", func() {
    70  			warnings, _ := railway.Sequentially(
    71  				func() (ccv3.Warnings, error) { return ccv3.Warnings{"warning 1"}, nil },
    72  				func() (ccv3.Warnings, error) { return ccv3.Warnings{"warning 2"}, nil },
    73  			)
    74  
    75  			Expect(warnings).To(ConsistOf("warning 1", "warning 2"))
    76  		})
    77  
    78  		It("returns warnings that happened before an error", func() {
    79  			warnings, _ := railway.Sequentially(
    80  				func() (ccv3.Warnings, error) { return ccv3.Warnings{"warning 1"}, nil },
    81  				func() (ccv3.Warnings, error) { return ccv3.Warnings{}, errors.New("error 1") },
    82  				func() (ccv3.Warnings, error) { return ccv3.Warnings{"warning 3"}, nil },
    83  			)
    84  
    85  			Expect(warnings).To(ConsistOf("warning 1"))
    86  		})
    87  
    88  		It("includes warnings from the failed track", func() {
    89  			warnings, _ := railway.Sequentially(
    90  				func() (ccv3.Warnings, error) { return ccv3.Warnings{"warning 1"}, nil },
    91  				func() (ccv3.Warnings, error) { return ccv3.Warnings{"warning 2"}, errors.New("error 1") },
    92  				func() (ccv3.Warnings, error) { return ccv3.Warnings{"warning 3"}, nil },
    93  			)
    94  
    95  			Expect(warnings).To(ConsistOf("warning 1", "warning 2"))
    96  		})
    97  	})
    98  })