1 package integration_test
2
3 import (
4 "os"
5 "path/filepath"
6 "time"
7
8 . "github.com/onsi/ginkgo/v2"
9 . "github.com/onsi/gomega"
10 "github.com/onsi/gomega/gbytes"
11 "github.com/onsi/gomega/gexec"
12 )
13
14 var _ = Describe("Watch", Label("SLOW"), func() {
15 var session *gexec.Session
16
17 BeforeEach(func() {
18 fm.MountFixture("watch", "A")
19 fm.MountFixture("watch", "B")
20 fm.MountFixture("watch", "C")
21 })
22
23 modifyFile := func(path string) {
24 time.Sleep(time.Second)
25 content, err := os.ReadFile(path)
26 Ω(err).ShouldNot(HaveOccurred())
27 content = append(content, []byte("//")...)
28 err = os.WriteFile(path, content, 0666)
29 Ω(err).ShouldNot(HaveOccurred())
30 }
31
32 modifyCode := func(pkgToModify string) {
33 path := filepath.Join(pkgToModify, pkgToModify+".go")
34 modifyFile(fm.PathTo("watch", path))
35 }
36
37 modifyJSON := func(pkgToModify string) {
38 path := filepath.Join(pkgToModify, pkgToModify+".json")
39 modifyFile(fm.PathTo("watch", path))
40 }
41
42 modifyTest := func(pkgToModify string) {
43 path := filepath.Join(pkgToModify, pkgToModify+"_test.go")
44 modifyFile(fm.PathTo("watch", path))
45 }
46
47 AfterEach(func() {
48 if session != nil {
49 session.Kill().Wait()
50 }
51 })
52
53 It("should be set up correctly", func() {
54 session = startGinkgo(fm.PathTo("watch"), "-r")
55 Eventually(session).Should(gexec.Exit(0))
56 Ω(session.Out.Contents()).Should(ContainSubstring("A Suite"))
57 Ω(session.Out.Contents()).Should(ContainSubstring("B Suite"))
58 Ω(session.Out.Contents()).Should(ContainSubstring("C Suite"))
59 Ω(session.Out.Contents()).Should(ContainSubstring("Ginkgo ran 3 suites"))
60 })
61
62 Context("when watching just one test suite", func() {
63 It("should immediately run, and should rerun when the test suite changes", func() {
64 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "A")
65 Eventually(session).Should(gbytes.Say("A Suite"))
66 modifyCode("A")
67 Eventually(session).Should(gbytes.Say("Detected changes in"))
68 Eventually(session).Should(gbytes.Say("A Suite"))
69 session.Kill().Wait()
70 })
71 })
72
73 Context("when watching several test suites", func() {
74 It("should not immediately run, but should rerun a test when its code changes", func() {
75 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r")
76 Eventually(session).Should(gbytes.Say("Identified 3 test suites"))
77 Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite|C Suite"))
78 modifyCode("A")
79 Eventually(session).Should(gbytes.Say("Detected changes in"))
80 Eventually(session).Should(gbytes.Say("A Suite"))
81 Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite"))
82 session.Kill().Wait()
83 })
84 })
85
86 Describe("watching dependencies", func() {
87 Context("with a depth of 2", func() {
88 It("should watch down to that depth", func() {
89 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r", "-depth=2")
90 Eventually(session).Should(gbytes.Say("Identified 3 test suites"))
91 Eventually(session).Should(gbytes.Say(`A \[`))
92 Eventually(session).Should(gbytes.Say(`B \[`))
93 Eventually(session).Should(gbytes.Say(`C \[`))
94
95 modifyCode("A")
96 Eventually(session).Should(gbytes.Say("Detected changes in"))
97 Eventually(session).Should(gbytes.Say("A Suite"))
98 Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite"))
99
100 modifyCode("B")
101 Eventually(session).Should(gbytes.Say("Detected changes in"))
102 Eventually(session).Should(gbytes.Say("B Suite"))
103 Eventually(session).Should(gbytes.Say("A Suite"))
104 Consistently(session).ShouldNot(gbytes.Say("C Suite"))
105
106 modifyCode("C")
107 Eventually(session).Should(gbytes.Say("Detected changes in"))
108 Eventually(session).Should(gbytes.Say("C Suite"))
109 Eventually(session).Should(gbytes.Say("B Suite"))
110 Eventually(session).Should(gbytes.Say("A Suite"))
111 })
112 })
113
114 Context("with a depth of 1", func() {
115 It("should watch down to that depth", func() {
116 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r", "-depth=1")
117 Eventually(session).Should(gbytes.Say("Identified 3 test suites"))
118 Eventually(session).Should(gbytes.Say(`A \[`))
119 Eventually(session).Should(gbytes.Say(`B \[`))
120 Eventually(session).Should(gbytes.Say(`C \[`))
121
122 modifyCode("A")
123 Eventually(session).Should(gbytes.Say("Detected changes in"))
124 Eventually(session).Should(gbytes.Say("A Suite"))
125 Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite"))
126
127 modifyCode("B")
128 Eventually(session).Should(gbytes.Say("Detected changes in"))
129 Eventually(session).Should(gbytes.Say("B Suite"))
130 Eventually(session).Should(gbytes.Say("A Suite"))
131 Consistently(session).ShouldNot(gbytes.Say("C Suite"))
132
133 modifyCode("C")
134 Eventually(session).Should(gbytes.Say("Detected changes in"))
135 Eventually(session).Should(gbytes.Say("C Suite"))
136 Eventually(session).Should(gbytes.Say("B Suite"))
137 Consistently(session).ShouldNot(gbytes.Say("A Suite"))
138 })
139 })
140
141 Context("with a depth of 0", func() {
142 It("should not watch any dependencies", func() {
143 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r", "-depth=0")
144 Eventually(session).Should(gbytes.Say("Identified 3 test suites"))
145 Eventually(session).Should(gbytes.Say(`A \[`))
146 Eventually(session).Should(gbytes.Say(`B \[`))
147 Eventually(session).Should(gbytes.Say(`C \[`))
148
149 modifyCode("A")
150 Eventually(session).Should(gbytes.Say("Detected changes in"))
151 Eventually(session).Should(gbytes.Say("A Suite"))
152 Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite"))
153
154 modifyCode("B")
155 Eventually(session).Should(gbytes.Say("Detected changes in"))
156 Eventually(session).Should(gbytes.Say("B Suite"))
157 Consistently(session).ShouldNot(gbytes.Say("A Suite|C Suite"))
158
159 modifyCode("C")
160 Eventually(session).Should(gbytes.Say("Detected changes in"))
161 Eventually(session).Should(gbytes.Say("C Suite"))
162 Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite"))
163 })
164 })
165
166 It("should not trigger dependents when tests are changed", func() {
167 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r", "-depth=2")
168 Eventually(session).Should(gbytes.Say("Identified 3 test suites"))
169 Eventually(session).Should(gbytes.Say(`A \[`))
170 Eventually(session).Should(gbytes.Say(`B \[`))
171 Eventually(session).Should(gbytes.Say(`C \[`))
172
173 modifyTest("A")
174 Eventually(session).Should(gbytes.Say("Detected changes in"))
175 Eventually(session).Should(gbytes.Say("A Suite"))
176 Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite"))
177
178 modifyTest("B")
179 Eventually(session).Should(gbytes.Say("Detected changes in"))
180 Eventually(session).Should(gbytes.Say("B Suite"))
181 Consistently(session).ShouldNot(gbytes.Say("A Suite|C Suite"))
182
183 modifyTest("C")
184 Eventually(session).Should(gbytes.Say("Detected changes in"))
185 Eventually(session).Should(gbytes.Say("C Suite"))
186 Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite"))
187 })
188 })
189
190 Describe("adjusting the watch regular expression", func() {
191 Describe("the default regular expression", func() {
192 It("should only trigger when go files are changed", func() {
193 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r", "-depth=2")
194 Eventually(session).Should(gbytes.Say("Identified 3 test suites"))
195 Eventually(session).Should(gbytes.Say(`A \[`))
196 Eventually(session).Should(gbytes.Say(`B \[`))
197 Eventually(session).Should(gbytes.Say(`C \[`))
198
199 modifyJSON("C")
200 Consistently(session).ShouldNot(gbytes.Say("Detected changes in"))
201 Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite|C Suite"))
202 })
203 })
204
205 Describe("modifying the regular expression", func() {
206 It("should trigger if the regexp matches", func() {
207 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r", "-depth=2", `-watch-regexp=\.json$`)
208 Eventually(session).Should(gbytes.Say("Identified 3 test suites"))
209 Eventually(session).Should(gbytes.Say(`A \[`))
210 Eventually(session).Should(gbytes.Say(`B \[`))
211 Eventually(session).Should(gbytes.Say(`C \[`))
212
213 modifyJSON("C")
214 Eventually(session).Should(gbytes.Say("Detected changes in"))
215 Eventually(session).Should(gbytes.Say("C Suite"))
216 Eventually(session).Should(gbytes.Say("B Suite"))
217 Eventually(session).Should(gbytes.Say("A Suite"))
218 })
219 })
220 })
221
222 Describe("when new test suite is added", func() {
223 It("should start monitoring that test suite", func() {
224 session = startGinkgo(fm.PathTo("watch"), "watch", "-succinct", "-r", "-depth=1")
225 Eventually(session).Should(gbytes.Say("Watching 3 suites"))
226
227 fm.MountFixture("watch", "D")
228
229 Eventually(session).Should(gbytes.Say("Detected 1 new suite"))
230 Eventually(session).Should(gbytes.Say(`D \[`))
231 Eventually(session).Should(gbytes.Say("D Suite"))
232
233 modifyCode("D")
234
235 Eventually(session).Should(gbytes.Say("Detected changes in"))
236 Eventually(session).Should(gbytes.Say("D Suite"))
237
238 modifyCode("C")
239
240 Eventually(session).Should(gbytes.Say("Detected changes in"))
241 Eventually(session).Should(gbytes.Say("C Suite"))
242 Eventually(session).Should(gbytes.Say("D Suite"))
243 })
244 })
245 })
246
View as plain text