...

Source file src/github.com/onsi/ginkgo/v2/integration/watch_test.go

Documentation: github.com/onsi/ginkgo/v2/integration

     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