summaryrefslogtreecommitdiff
path: root/vendor/github.com/onsi/ginkgo/internal/spec_iterator/parallel_spec_iterator_test.go
blob: c5a762fd5dd90fd79d4d14a898dc66d2df787345 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package spec_iterator_test

import (
	"net/http"

	. "github.com/onsi/ginkgo/internal/spec_iterator"
	"github.com/onsi/gomega/ghttp"

	"github.com/onsi/ginkgo/internal/codelocation"
	"github.com/onsi/ginkgo/internal/containernode"
	"github.com/onsi/ginkgo/internal/leafnodes"
	"github.com/onsi/ginkgo/internal/spec"
	"github.com/onsi/ginkgo/types"

	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
)

var _ = Describe("ParallelSpecIterator", func() {
	var specs []*spec.Spec
	var iterator *ParallelIterator
	var server *ghttp.Server

	newSpec := func(text string, flag types.FlagType) *spec.Spec {
		subject := leafnodes.NewItNode(text, func() {}, flag, codelocation.New(0), 0, nil, 0)
		return spec.New(subject, []*containernode.ContainerNode{}, false)
	}

	BeforeEach(func() {
		specs = []*spec.Spec{
			newSpec("A", types.FlagTypePending),
			newSpec("B", types.FlagTypeNone),
			newSpec("C", types.FlagTypeNone),
			newSpec("D", types.FlagTypeNone),
		}
		specs[3].Skip()

		server = ghttp.NewServer()

		iterator = NewParallelIterator(specs, "http://"+server.Addr())
	})

	AfterEach(func() {
		server.Close()
	})

	It("should report the total number of specs", func() {
		Ω(iterator.NumberOfSpecsPriorToIteration()).Should(Equal(4))
	})

	It("should not report the number to be processed", func() {
		n, known := iterator.NumberOfSpecsToProcessIfKnown()
		Ω(n).Should(Equal(-1))
		Ω(known).Should(BeFalse())
	})

	It("should not report the number that will be run", func() {
		n, known := iterator.NumberOfSpecsThatWillBeRunIfKnown()
		Ω(n).Should(Equal(-1))
		Ω(known).Should(BeFalse())
	})

	Describe("iterating", func() {
		Describe("when the server returns well-formed responses", func() {
			BeforeEach(func() {
				server.AppendHandlers(
					ghttp.RespondWithJSONEncoded(http.StatusOK, Counter{Index: 0}),
					ghttp.RespondWithJSONEncoded(http.StatusOK, Counter{Index: 1}),
					ghttp.RespondWithJSONEncoded(http.StatusOK, Counter{Index: 3}),
					ghttp.RespondWithJSONEncoded(http.StatusOK, Counter{Index: 4}),
				)
			})

			It("should return the specs in question", func() {
				Ω(iterator.Next()).Should(Equal(specs[0]))
				Ω(iterator.Next()).Should(Equal(specs[1]))
				Ω(iterator.Next()).Should(Equal(specs[3]))
				spec, err := iterator.Next()
				Ω(spec).Should(BeNil())
				Ω(err).Should(MatchError(ErrClosed))
			})
		})

		Describe("when the server 404s", func() {
			BeforeEach(func() {
				server.AppendHandlers(
					ghttp.RespondWith(http.StatusNotFound, ""),
				)
			})

			It("should return an error", func() {
				spec, err := iterator.Next()
				Ω(spec).Should(BeNil())
				Ω(err).Should(MatchError("unexpected status code 404"))
			})
		})

		Describe("when the server returns gibberish", func() {
			BeforeEach(func() {
				server.AppendHandlers(
					ghttp.RespondWith(http.StatusOK, "ß"),
				)
			})

			It("should error", func() {
				spec, err := iterator.Next()
				Ω(spec).Should(BeNil())
				Ω(err).ShouldNot(BeNil())
			})
		})
	})
})