package failer_test import ( . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/internal/failer" . "github.com/onsi/gomega" "github.com/onsi/ginkgo/internal/codelocation" "github.com/onsi/ginkgo/types" ) var _ = Describe("Failer", func() { var ( failer *Failer codeLocationA types.CodeLocation codeLocationB types.CodeLocation ) BeforeEach(func() { codeLocationA = codelocation.New(0) codeLocationB = codelocation.New(0) failer = New() }) Context("with no failures", func() { It("should return success when drained", func() { failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(BeZero()) Ω(state).Should(Equal(types.SpecStatePassed)) }) }) Describe("Skip", func() { It("should handle failures", func() { failer.Skip("something skipped", codeLocationA) failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(Equal(types.SpecFailure{ Message: "something skipped", Location: codeLocationA, ForwardedPanic: "", ComponentType: types.SpecComponentTypeIt, ComponentIndex: 3, ComponentCodeLocation: codeLocationB, })) Ω(state).Should(Equal(types.SpecStateSkipped)) }) }) Describe("Fail", func() { It("should handle failures", func() { failer.Fail("something failed", codeLocationA) failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(Equal(types.SpecFailure{ Message: "something failed", Location: codeLocationA, ForwardedPanic: "", ComponentType: types.SpecComponentTypeIt, ComponentIndex: 3, ComponentCodeLocation: codeLocationB, })) Ω(state).Should(Equal(types.SpecStateFailed)) }) }) Describe("Panic", func() { It("should handle panics", func() { failer.Panic(codeLocationA, "some forwarded panic") failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(Equal(types.SpecFailure{ Message: "Test Panicked", Location: codeLocationA, ForwardedPanic: "some forwarded panic", ComponentType: types.SpecComponentTypeIt, ComponentIndex: 3, ComponentCodeLocation: codeLocationB, })) Ω(state).Should(Equal(types.SpecStatePanicked)) }) }) Describe("Timeout", func() { It("should handle timeouts", func() { failer.Timeout(codeLocationA) failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(Equal(types.SpecFailure{ Message: "Timed out", Location: codeLocationA, ForwardedPanic: "", ComponentType: types.SpecComponentTypeIt, ComponentIndex: 3, ComponentCodeLocation: codeLocationB, })) Ω(state).Should(Equal(types.SpecStateTimedOut)) }) }) Context("when multiple failures are registered", func() { BeforeEach(func() { failer.Fail("something failed", codeLocationA) failer.Fail("something else failed", codeLocationA) }) It("should only report the first one when drained", func() { failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(Equal(types.SpecFailure{ Message: "something failed", Location: codeLocationA, ForwardedPanic: "", ComponentType: types.SpecComponentTypeIt, ComponentIndex: 3, ComponentCodeLocation: codeLocationB, })) Ω(state).Should(Equal(types.SpecStateFailed)) }) It("should report subsequent failures after being drained", func() { failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) failer.Fail("yet another thing failed", codeLocationA) failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(Equal(types.SpecFailure{ Message: "yet another thing failed", Location: codeLocationA, ForwardedPanic: "", ComponentType: types.SpecComponentTypeIt, ComponentIndex: 3, ComponentCodeLocation: codeLocationB, })) Ω(state).Should(Equal(types.SpecStateFailed)) }) It("should report sucess on subsequent drains if no errors occur", func() { failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) failure, state := failer.Drain(types.SpecComponentTypeIt, 3, codeLocationB) Ω(failure).Should(BeZero()) Ω(state).Should(Equal(types.SpecStatePassed)) }) }) })