func (s *Server) ListJobBuilds(pipelineDB db.PipelineDB) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var ( builds []db.Build err error until int since int limit int ) jobName := r.FormValue(":job_name") urlUntil := r.FormValue(atc.PaginationQueryUntil) until, _ = strconv.Atoi(urlUntil) urlSince := r.FormValue(atc.PaginationQuerySince) since, _ = strconv.Atoi(urlSince) urlLimit := r.FormValue(atc.PaginationQueryLimit) limit, _ = strconv.Atoi(urlLimit) if limit == 0 { limit = atc.PaginationAPIDefaultLimit } builds, pagination, err := pipelineDB.GetJobBuilds(jobName, db.Page{ Since: since, Until: until, Limit: limit, }) if err != nil { w.WriteHeader(http.StatusNotFound) return } if pagination.Next != nil { s.addNextLink(w, pipelineDB.GetPipelineName(), jobName, *pagination.Next) } if pagination.Previous != nil { s.addPreviousLink(w, pipelineDB.GetPipelineName(), jobName, *pagination.Previous) } w.WriteHeader(http.StatusOK) jobBuilds := make([]atc.Build, len(builds)) for i := 0; i < len(builds); i++ { jobBuilds[i] = present.Build(builds[i]) } json.NewEncoder(w).Encode(jobBuilds) }) }
BeforeEach(func() { for i := 0; i < 10; i++ { build, err := pipelineDB.CreateJobBuild("job-name") Expect(err).NotTo(HaveOccurred()) _, err = pipelineDB.CreateJobBuild("other-name") Expect(err).NotTo(HaveOccurred()) builds[i] = build } }) Context("when there are no builds to be found", func() { It("returns the builds, with previous/next pages", func() { buildsPage, pagination, err := pipelineDB.GetJobBuilds("nope", db.Page{}) Expect(err).ToNot(HaveOccurred()) Expect(buildsPage).To(Equal([]db.Build{})) Expect(pagination).To(Equal(db.Pagination{})) }) }) Context("with no since/until", func() { It("returns the first page, with the given limit, and a next page", func() { buildsPage, pagination, err := pipelineDB.GetJobBuilds("job-name", db.Page{Limit: 2}) Expect(err).ToNot(HaveOccurred()) Expect(buildsPage).To(Equal([]db.Build{builds[9], builds[8]})) Expect(pagination.Previous).To(BeNil()) Expect(pagination.Next).To(Equal(&db.Page{Since: builds[8].ID, Limit: 2})) }) })
BeforeEach(func() { for i := 0; i < 10; i++ { build, err := pipelineDB.CreateJobBuild("some-job") Expect(err).NotTo(HaveOccurred()) _, err = pipelineDB.CreateJobBuild("some-other-job") Expect(err).NotTo(HaveOccurred()) builds[i] = build } }) Context("when there are no builds to be found", func() { It("returns the builds, with previous/next pages", func() { buildsPage, pagination, err := pipelineDB.GetJobBuilds("some-other-job", db.Page{}) Expect(err).ToNot(HaveOccurred()) Expect(buildsPage).To(Equal([]db.Build{})) Expect(pagination).To(Equal(db.Pagination{})) }) }) Context("with no since/until", func() { It("returns the first page, with the given limit, and a next page", func() { buildsPage, pagination, err := pipelineDB.GetJobBuilds("some-job", db.Page{Limit: 2}) Expect(err).ToNot(HaveOccurred()) Expect(buildsPage).To(Equal([]db.Build{builds[9], builds[8]})) Expect(pagination.Previous).To(BeNil()) Expect(pagination.Next).To(Equal(&db.Page{Since: builds[8].ID, Limit: 2})) }) })