diff options
author | Alexander Mazuruk <a.mazuruk@samsung.com> | 2018-09-17 18:45:29 +0200 |
---|---|---|
committer | Alexander Mazuruk <a.mazuruk@samsung.com> | 2018-09-19 16:38:20 +0200 |
commit | a4ae7889d804f7d784a1cc9d65d2a68cef446a6e (patch) | |
tree | b6f655d92b73ac491b33bcfc49e441423b2b341c | |
parent | 5d1f5d6be32b71aed054704d31708e1c98fd817b (diff) | |
download | weles-a4ae7889d804f7d784a1cc9d65d2a68cef446a6e.tar.gz weles-a4ae7889d804f7d784a1cc9d65d2a68cef446a6e.tar.bz2 weles-a4ae7889d804f7d784a1cc9d65d2a68cef446a6e.zip |
Refactor job lister tests
Previous tests of job lister had little to no value.
Change-Id: Iae66d511b9610b03102a1a4e84aca9d3e8a47a89
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
-rw-r--r-- | server/job_lister_handler_test.go | 933 | ||||
-rw-r--r-- | server/server_suite_test.go | 1 |
2 files changed, 320 insertions, 614 deletions
diff --git a/server/job_lister_handler_test.go b/server/job_lister_handler_test.go index 41f74af..b126278 100644 --- a/server/job_lister_handler_test.go +++ b/server/job_lister_handler_test.go @@ -23,23 +23,21 @@ import ( "net/http" "net/http/httptest" "strconv" - "strings" "time" - "git.tizen.org/tools/weles" - "git.tizen.org/tools/weles/mock" - "git.tizen.org/tools/weles/server" - "git.tizen.org/tools/weles/server/operations/jobs" - "github.com/go-openapi/strfmt" "github.com/golang/mock/gomock" . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" -) -var _ = Describe("JobListerHandler", func() { + "git.tizen.org/tools/weles" + "git.tizen.org/tools/weles/mock" + "git.tizen.org/tools/weles/server" + "git.tizen.org/tools/weles/server/operations/jobs" +) +var _ = Describe("Listing jobs with server initialized", func() { var ( mockCtrl *gomock.Controller apiDefaults *server.APIDefaults @@ -47,705 +45,412 @@ var _ = Describe("JobListerHandler", func() { testserver *httptest.Server ) - BeforeEach(func() { - mockCtrl, mockJobManager, _, apiDefaults, testserver = testServerSetup() - }) - - AfterEach(func() { - mockCtrl.Finish() - testserver.Close() - }) + type queryPaginator struct { + query string + paginator weles.JobPagination + } + // data to test against + var ( + emptyJobFilter = weles.JobFilter{} - Describe("Listing jobs", func() { - createRequest := func( - reqBody io.Reader, - path string, - query string, - contentH string, - acceptH string) (req *http.Request) { - if path == "" { - path = "/api/v1/jobs/list" - } - req, err := http.NewRequest(http.MethodPost, testserver.URL+path+query, reqBody) - Expect(err).ToNot(HaveOccurred()) - req.Header.Set("Content-Type", contentH) - req.Header.Set("Accept", acceptH) - return req + filledJobFilter = weles.JobFilter{ + JobID: []weles.JobID{10, 100, 131}, + Info: []string{"something", "and something else"}, + Name: []string{"name123"}, + // time.Date nsec arg must be 0 as it is 0ed out when transported via api + CreatedAfter: strfmt.DateTime(time.Date(2017, time.May, 3, 11, 34, 55, 0, time.UTC)), } - filterSorterReqBody := func( - filter weles.JobFilter, - sorter weles.JobSorter, - contentH string) ( - rb *bytes.Reader) { - - jobFilterSort := jobs.JobListerBody{ - Filter: &filter, - Sorter: &sorter} + sorterEmpty = weles.JobSorter{} - jobFilterSortMarshalled, err := json.Marshal(jobFilterSort) - Expect(err).ToNot(HaveOccurred()) + sorterDescNoBy = weles.JobSorter{ + SortOrder: weles.SortOrderDescending, + } - return bytes.NewReader(jobFilterSortMarshalled) + sorterAscNoBy = weles.JobSorter{ + SortOrder: weles.SortOrderAscending, + } + sorterNoOrderID = weles.JobSorter{ + SortBy: weles.JobSortByID, } - checkReceivedJobInfo := func(respBody []byte, jobInfo []weles.JobInfo, acceptH string) { - jobInfoMarshalled, err := json.Marshal(jobInfo) - Expect(err).ToNot(HaveOccurred()) - Expect(string(respBody)).To(MatchJSON(string(jobInfoMarshalled))) + sorterNoOrderCreatedDate = weles.JobSorter{ + SortBy: weles.JobSortByCreatedDate, + } + sorterDescID = weles.JobSorter{ + SortOrder: weles.SortOrderDescending, + SortBy: weles.JobSortByID, } - checkReceivedErr := func(respBody []byte, jmerr error, acceptH string) { - errMarshalled, err := json.Marshal(weles.ErrResponse{ - Message: jmerr.Error(), - Type: ""}) - Expect(err).ToNot(HaveOccurred()) - Expect(string(respBody)).To(MatchJSON(string(errMarshalled))) + sorterAscID = weles.JobSorter{ + SortOrder: weles.SortOrderAscending, + SortBy: weles.JobSortByID, } - //few structs to test against - someTime := strfmt.DateTime(time.Date(2017, time.May, 3, 11, 34, 55, 0, time.UTC)) - // time.Date nsec argument must be 0 as it is 0ed out when transported via api. + // default value + sorterDefault = sorterAscID - filledFilter1 := weles.JobFilter{ - CreatedAfter: someTime, - Status: []weles.JobStatus{ - weles.JobStatusNEW, - weles.JobStatusPARSING, - weles.JobStatusDOWNLOADING}} + // when pagination is on and no query params are set. When used, limit should also be set. + emptyPaginatorOn = weles.JobPagination{Forward: true} + // when pagination is off + emptyPaginatorOff = weles.JobPagination{} - filledFilter2 := weles.JobFilter{ - JobID: []weles.JobID{10, 100, 131}, - Info: []string{ - "something", - "something else", - "some really different thing"}} + jobInfo420 = createJobInfoSlice(420) + ) - filledFilter3 := weles.JobFilter{ - UpdatedBefore: someTime, - Name: []string{ - "daass", - "sdasa", - "asdasf32qw;;dq"}} + BeforeEach(func() { + mockCtrl, mockJobManager, _, apiDefaults, testserver = testServerSetup() + }) - emptyFilter := weles.JobFilter{} + AfterEach(func() { + mockCtrl.Finish() + testserver.Close() + }) - filledSorter1 := weles.JobSorter{ - SortBy: weles.JobSortByID, - SortOrder: weles.SortOrderAscending} - - filledSorter2 := weles.JobSorter{ - SortBy: weles.JobSortByJobStatus, - SortOrder: weles.SortOrderDescending} - - emptySorter := weles.JobSorter{} - - emptyPaginator := weles.JobPagination{} - emptyPaginator2 := weles.JobPagination{Forward: true} - after100 := "?after=100" - pAfter100 := weles.JobPagination{ - JobID: weles.JobID(100), - Forward: true} - after100Limit50 := "?after=100&limit=50" - pAfter100Limit50 := weles.JobPagination{ - JobID: weles.JobID(100), - Forward: true, - Limit: int32(50)} - - before100 := "?before=100" - pBefore100 := weles.JobPagination{ - JobID: weles.JobID(100), - Forward: false} - - before100Limit50 := "?before=100&limit=50" - pBefore100Limit50 := weles.JobPagination{ - JobID: weles.JobID(100), - Forward: false, - Limit: int32(50)} - - limit50 := "?limit=50" - pLimit50 := weles.JobPagination{ - Forward: true, - Limit: int32(50)} - - type queryPaginator struct { - query string - paginator weles.JobPagination + // helper functions + createRequest := func(reqBody io.Reader, query, contentH, acceptH string) (req *http.Request) { + req, err := http.NewRequest(http.MethodPost, testserver.URL+basePath+listJobsPath+query, + reqBody) + Expect(err).ToNot(HaveOccurred()) + req.Header.Set("Content-Type", contentH) + req.Header.Set("Accept", acceptH) + return req + } + + createRequestBody := func(f weles.JobFilter, s weles.JobSorter) *bytes.Reader { + tomarshall := jobs.JobListerBody{ + Filter: &f, + Sorter: &s, } + marshalled, err := json.Marshal(tomarshall) + Expect(err).ToNot(HaveOccurred()) + return bytes.NewReader(marshalled) + } - queryPaginatorOK := []queryPaginator{ - { - query: "", - paginator: emptyPaginator2}, - { - query: before100, - paginator: pBefore100}, - { - query: before100Limit50, - paginator: pBefore100Limit50}, - { - query: after100, - paginator: pAfter100}, - { - query: after100Limit50, - paginator: pAfter100Limit50}, - { - query: limit50, - paginator: pLimit50}} - - queriesOK := []string{"", before100, before100Limit50, after100, after100Limit50, limit50} - - jobInfoSlice420 := createJobInfoSlice(420) - - Context("j: Server receives correct request and has pagination turned off", func() { - for _, currQuery := range queriesOK { // expected behaviour - handler should ignore - // different queries when pagination is turned off globally. - DescribeTable("should respond with all avaliable jobs, ignoring query params", - func(filter weles.JobFilter, sorter weles.JobSorter, query string) { - apiDefaults.PageLimit = 0 - - listInfo := weles.ListInfo{ - TotalRecords: uint64(len(jobInfoSlice420)), - RemainingRecords: 0} - if sorter.SortOrder == "" { - sorter.SortOrder = weles.SortOrderAscending - } - if sorter.SortBy == "" { - sorter.SortBy = weles.JobSortByID - } - mockJobManager.EXPECT().ListJobs( - filter, sorter, emptyPaginator).Return( - jobInfoSlice420, listInfo, nil) - - reqBody := filterSorterReqBody(filter, sorter, JSON) - - client := testserver.Client() - req := createRequest(reqBody, "", query, JSON, JSON) - resp, err := client.Do(req) - Expect(err).ToNot(HaveOccurred()) - - defer resp.Body.Close() - respBody, err := ioutil.ReadAll(resp.Body) - Expect(err).ToNot(HaveOccurred()) - - checkReceivedJobInfo(respBody, jobInfoSlice420, JSON) - - Expect(resp.StatusCode).To(Equal(200)) - Expect(resp.Header.Get("Next")).To(Equal("")) - Expect(resp.Header.Get("Previous")).To(Equal("")) - Expect(resp.Header.Get("RemainingRecords")).To(Equal("")) - Expect(resp.Header.Get("TotalRecords")).To(Equal(strconv.Itoa(len( - jobInfoSlice420)))) - - }, - - Entry("given empty filter and sorter", emptyFilter, emptySorter, - currQuery), - - Entry("given filled filter and sorter", filledFilter2, filledSorter2, - currQuery), - - Entry("given filled filter and empty sorter", filledFilter1, emptySorter, - currQuery), - - Entry("given empty filter and filled sorter", emptyFilter, filledSorter1, - currQuery), - ) - } - }) + checkReceivedJobInfo := func(respBody []byte, jobInfo []weles.JobInfo) { - Context("server receives correct request and has pagination turned on", func() { - jobInfoAll := createJobInfoSlice(100) - globalLimit := []int32{70, 100, 111} - for _, currgl := range globalLimit { - for _, curr := range queryPaginatorOK { - // expected behaviour - handler passes query parameters to JM. - // this should impact data returned by JM. It is not reflected in the - // below mock of JM as it is out of scope of server unit tests. - DescribeTable("should respond with all jobs", - func(jobInfo []weles.JobInfo, - filter weles.JobFilter, - sorter weles.JobSorter, - paginator weles.JobPagination, - query string, gl int32) { - - apiDefaults.PageLimit = gl - - if !strings.Contains(query, "limit") { - paginator.Limit = apiDefaults.PageLimit - } - - listInfo := weles.ListInfo{ - TotalRecords: uint64(len(jobInfo)), - RemainingRecords: 0} - - if sorter.SortOrder == "" { - sorter.SortOrder = weles.SortOrderAscending - } - if sorter.SortBy == "" { - sorter.SortBy = weles.JobSortByID - } - mockJobManager.EXPECT().ListJobs( - filter, sorter, paginator).Return( - jobInfo, listInfo, nil) - - reqBody := filterSorterReqBody(filter, sorter, JSON) - req := createRequest(reqBody, "", query, JSON, JSON) - - client := testserver.Client() - resp, err := client.Do(req) - Expect(err).ToNot(HaveOccurred()) - - defer resp.Body.Close() - respBody, err := ioutil.ReadAll(resp.Body) - Expect(err).ToNot(HaveOccurred()) - - checkReceivedJobInfo(respBody, jobInfo, JSON) - - Expect(resp.StatusCode).To(Equal(200)) - // Next and Previous headers are ignored here as they are tested - // in other context. - Expect(resp.Header.Get("RemainingRecords")).To(Equal("")) - Expect(resp.Header.Get("TotalRecords")).To( - Equal(strconv.Itoa(len(jobInfo)))) - }, - Entry("given empty request, when JM has less jobs than page size", - jobInfoAll[:40], emptyFilter, emptySorter, curr.paginator, curr.query, - currgl), - - Entry("given filled filter, when JM returns less jobs than Default "+ - "Page size", - jobInfoAll[10:67], filledFilter3, emptySorter, curr.paginator, - curr.query, currgl), - - Entry("given filled filter, when JM returns same amount of filtered jobs"+ - " as Default Page Size", - jobInfoAll, filledFilter1, filledSorter2, curr.paginator, curr.query, - currgl), - ) - } - } - }) + marshalled, err := json.Marshal(jobInfo) + Expect(err).ToNot(HaveOccurred()) + Expect(string(respBody)).To(MatchJSON(string(marshalled))) - Context("Pagination on", func() { - jobInfoAll := createJobInfoSlice(400) - DescribeTable("paginating forward", - func(jobInfo []weles.JobInfo, - startingPageNo int, - filter weles.JobFilter, - sorter weles.JobSorter) { + } - apiDefaults.PageLimit = 100 + checkReceivedJobErr := func(respBody []byte, e error) { + errMarshalled, err := json.Marshal(weles.ErrResponse{ + Message: e.Error(), + Type: "", + }) + Expect(err).ToNot(HaveOccurred()) + Expect(string(respBody)).To(MatchJSON(string(errMarshalled))) + } + + Describe("Pagination is turned off", func() { + Describe("client sends correct request", func() { + It("server should accept empty post request", func() { + apiDefaults.PageLimit = 0 + + listInfo := weles.ListInfo{ + TotalRecords: uint64(len(jobInfo420)), + RemainingRecords: 0, + } + // should pass correct default values of Sorter to JobManager + mockJobManager.EXPECT().ListJobs( + emptyJobFilter, sorterDefault, emptyPaginatorOff).Return( + jobInfo420, listInfo, nil) - //prepare data for first call - jobInfoStartingPage := jobInfo[(startingPageNo-1)* - int(apiDefaults.PageLimit) : startingPageNo* - int(apiDefaults.PageLimit)] //first page of data + client := testserver.Client() + req := createRequest(nil, "", JSON, JSON) + req.Close = true + _, err := client.Do(req) + Expect(err).ToNot(HaveOccurred()) - startingPageQuery := "" + }) - paginator := weles.JobPagination{Limit: apiDefaults.PageLimit} - paginator.Forward = true - if startingPageNo != 1 { - paginator.JobID = jobInfoStartingPage[0].JobID - startingPageQuery = "?after=" + - jobInfo[(startingPageNo-1)*int(apiDefaults.PageLimit)].JobID.String() - } + DescribeTable("server should ignore query params", + func(query string) { + apiDefaults.PageLimit = 0 listInfo := weles.ListInfo{ - TotalRecords: uint64(len(jobInfo)), - RemainingRecords: uint64(len(jobInfo) - startingPageNo*len( - jobInfoStartingPage)), + TotalRecords: uint64(len(jobInfo420)), + RemainingRecords: 0, } + mockJobManager.EXPECT().ListJobs(emptyJobFilter, + sorterDefault, emptyPaginatorOff).Return( + jobInfo420, listInfo, nil) - if sorter.SortOrder == "" { - sorter.SortOrder = weles.SortOrderAscending - } - if sorter.SortBy == "" { - sorter.SortBy = weles.JobSortByID - } - first := mockJobManager.EXPECT().ListJobs(filter, sorter, paginator).Return( - jobInfoStartingPage, listInfo, nil) - - reqBody := filterSorterReqBody(filter, sorter, JSON) - req := createRequest(reqBody, "", startingPageQuery, JSON, JSON) - req.Close = true client := testserver.Client() - resp, err := client.Do(req) + req := createRequest(nil, query, JSON, JSON) + req.Close = true + _, err := client.Do(req) Expect(err).ToNot(HaveOccurred()) + }, - respBody, err := ioutil.ReadAll(resp.Body) - Expect(err).ToNot(HaveOccurred()) + Entry("no query params set", ""), + Entry("after query set", "?after=50"), + Entry("after and limit query set", "?after=50&limit=10"), + Entry("after and before query set", "?after=50&before=20"), + Entry("after and before and limit query set", "?after=50&before=30&limit=13"), + Entry("before query set", "?before=100"), + Entry("before and limit query set", "?before=100&limit=12"), + ) - checkReceivedJobInfo(respBody, jobInfoStartingPage, JSON) - Expect(resp.StatusCode).To(Equal(206)) + DescribeTable("server should pass filter to JobManager", + func(filter weles.JobFilter) { - Expect(resp.Header.Get("Next")).To( - Equal("/api/v1/jobs/list" + "?after=" + - jobInfoStartingPage[apiDefaults.PageLimit-1].JobID.String())) - prevCheck := "" - if startingPageNo != 1 { - prevCheck = "/api/v1/jobs/list" + "?before=" + - jobInfoStartingPage[0].JobID.String() - } + apiDefaults.PageLimit = 0 - Expect(resp.Header.Get("Previous")).To(Equal(prevCheck)) - Expect(resp.Header.Get("RemainingRecords")).To( - Equal(strconv.Itoa(len(jobInfo) - (startingPageNo * len( - jobInfoStartingPage))))) - Expect(resp.Header.Get("TotalRecords")).To(Equal(strconv.Itoa(len(jobInfo)))) - - nextPage := resp.Header.Get("Next") - resp.Body.Close() - testserver.CloseClientConnections() - - //prepare data for second call based on previous - var jobInfo2 []weles.JobInfo - var secondReturnCode int - if (len(jobInfo) - startingPageNo*int(apiDefaults.PageLimit)) <= int( - apiDefaults.PageLimit) { - - jobInfo2 = jobInfo[startingPageNo*int(apiDefaults.PageLimit):] - //next page is not full - secondReturnCode = 200 - } else { - jobInfo2 = jobInfo[startingPageNo* - int(apiDefaults.PageLimit) : (startingPageNo+1)* - int(apiDefaults.PageLimit)] //last page is full - secondReturnCode = 206 + listInfo := weles.ListInfo{ + TotalRecords: uint64(len(jobInfo420)), + RemainingRecords: 0, } - paginator2 := weles.JobPagination{ - Limit: apiDefaults.PageLimit, - Forward: true, - JobID: jobInfoStartingPage[int(apiDefaults.PageLimit)-1].JobID} - - listInfo2 := weles.ListInfo{TotalRecords: listInfo.TotalRecords} - - if tmp := len(jobInfo) - (startingPageNo+1)* - int(apiDefaults.PageLimit); tmp < 0 { - listInfo2.RemainingRecords = 0 - } else { - listInfo2.RemainingRecords = uint64(tmp) - } - //filter and sorter should stay the same. mockJobManager.EXPECT().ListJobs( - filter, sorter, paginator2).Return(jobInfo2, listInfo2, nil).After(first) + filter, sorterDefault, emptyPaginatorOff).Return( + jobInfo420, listInfo, nil) + reqBody := createRequestBody(filter, sorterEmpty) - client2 := testserver.Client() - reqBody = filterSorterReqBody(filter, sorter, JSON) - req2 := createRequest(reqBody, nextPage, "", JSON, JSON) - req2.Close = true - resp2, err := client2.Do(req2) - Expect(err).ToNot(HaveOccurred()) + client := testserver.Client() + req := createRequest(reqBody, "", JSON, JSON) - defer resp2.Body.Close() - respBody2, err := ioutil.ReadAll(resp2.Body) + _, err := client.Do(req) Expect(err).ToNot(HaveOccurred()) + }, + Entry("when receiving empty filter", emptyJobFilter), + Entry("when receiving filled filter", filledJobFilter), + ) - checkReceivedJobInfo(respBody2, jobInfo2, JSON) - - Expect(resp2.StatusCode).To(Equal(secondReturnCode)) - - if secondReturnCode == 200 { - Expect(resp2.Header.Get("Next")).To(Equal("")) - prevCheck = "/api/v1/jobs/list" + "?before=" + jobInfo2[0].JobID.String() - Expect(resp2.Header.Get("Previous")).To(Equal(prevCheck)) - } else { - prevCheck = "/api/v1/jobs/list" + "?before=" + - jobInfo2[0].JobID.String() + DescribeTable("server should pass sorter to JobManager, but set default values "+ + "on empty fields", + func(sent, expected weles.JobSorter) { - nextCheck := "/api/v1/jobs/list" + "?after=" + - jobInfo2[int(apiDefaults.PageLimit)-1].JobID.String() + apiDefaults.PageLimit = 0 - Expect(resp2.Header.Get("Next")).To(Equal(nextCheck)) - Expect(resp2.Header.Get("Previous")).To(Equal(prevCheck)) + listInfo := weles.ListInfo{ + TotalRecords: uint64(len(jobInfo420)), + RemainingRecords: 0, } - if tmp := strconv.Itoa( - len(jobInfo) - startingPageNo*len(jobInfoStartingPage) - len( - jobInfo2)); tmp != "0" { - Expect(resp2.Header.Get("RemainingRecords")).To(Equal(tmp)) - } else { - Expect(resp2.Header.Get("RemainingRecords")).To(Equal("")) - } - Expect(resp2.Header.Get("TotalRecords")).To(Equal(strconv.Itoa(len(jobInfo)))) + mockJobManager.EXPECT().ListJobs( + emptyJobFilter, expected, emptyPaginatorOff).Return( + jobInfo420, listInfo, nil) + reqBody := createRequestBody(emptyJobFilter, sent) + + client := testserver.Client() + req := createRequest(reqBody, "", JSON, JSON) + _, err := client.Do(req) + Expect(err).ToNot(HaveOccurred()) }, - Entry("1->2/2", // from 1 to 2 out of 2 (pages) - jobInfoAll[:170], 1, emptyFilter, emptySorter), - Entry("1->2/3", - jobInfoAll[:270], 1, emptyFilter, emptySorter), - Entry("2->3/3", - jobInfoAll[:300], 2, emptyFilter, emptySorter), - Entry("2->3/4", - jobInfoAll[:350], 2, emptyFilter, emptySorter), + Entry("should set default order and by", + sorterEmpty, sorterDefault), + Entry("should pass ascending order and by ID", + sorterAscID, sorterAscID), + Entry("should pass descending order and by ID", + sorterDescID, sorterDescID), + Entry("should pass descending order and set default by", + sorterDescNoBy, weles.JobSorter{ + SortOrder: sorterDescNoBy.SortOrder, + SortBy: sorterDefault.SortBy, + }), + Entry("should pass ascending order and set default by", + sorterAscNoBy, weles.JobSorter{ + SortOrder: sorterAscNoBy.SortOrder, + SortBy: sorterDefault.SortBy, + }), + Entry("should pass by ID and set default order", + sorterNoOrderID, weles.JobSorter{ + SortOrder: sorterDefault.SortOrder, + SortBy: sorterNoOrderID.SortBy, + }), + Entry("should pass by CreatedDate and set default order", + sorterNoOrderCreatedDate, weles.JobSorter{ + SortOrder: sorterDefault.SortOrder, + SortBy: sorterNoOrderCreatedDate.SortBy, + }), ) - DescribeTable("paginating backward", - func(jobInfo []weles.JobInfo, - startingPageNo int, pages int, - filter weles.JobFilter, - sorter weles.JobSorter) { + DescribeTable("should respond with all jobs and correct headers", + func(recordCount int) { + apiDefaults.PageLimit = 0 - apiDefaults.PageLimit = 100 - paginator := weles.JobPagination{Limit: apiDefaults.PageLimit} - //prepare data for first call - var jobInfoStartingPage []weles.JobInfo - var startingPageQuery string - listInfo := weles.ListInfo{} - if startingPageNo == pages { - jobInfoStartingPage = jobInfo[(startingPageNo-1)* - int(apiDefaults.PageLimit) : len(jobInfo)-1] - paginator.Forward = true - paginator.JobID = jobInfoStartingPage[len(jobInfoStartingPage)-1].JobID - startingPageQuery = "?after=" + paginator.JobID.String() - listInfo = weles.ListInfo{ - TotalRecords: uint64(len(jobInfo)), - RemainingRecords: 0} - - } else { - jobInfoStartingPage = jobInfo[(startingPageNo)* - int(apiDefaults.PageLimit) : (startingPageNo+1)* - int(apiDefaults.PageLimit)] //first page of data - paginator.Forward = false - paginator.JobID = jobInfo[(startingPageNo*int( - apiDefaults.PageLimit))-1].JobID - startingPageQuery = "?before=" + paginator.JobID.String() - listInfo = weles.ListInfo{ - TotalRecords: uint64(len(jobInfo)), - RemainingRecords: uint64(len(jobInfo) - (int(apiDefaults.PageLimit) * - startingPageNo))} + jobInfo := createJobInfoSlice(recordCount) + listInfo := weles.ListInfo{ + TotalRecords: uint64(len(jobInfo)), + RemainingRecords: 0, } - if sorter.SortOrder == "" { - sorter.SortOrder = weles.SortOrderAscending - } - if sorter.SortBy == "" { - sorter.SortBy = weles.JobSortByID - } - first := mockJobManager.EXPECT().ListJobs( - filter, sorter, paginator).Return(jobInfoStartingPage, listInfo, nil) + mockJobManager.EXPECT().ListJobs(emptyJobFilter, + sorterDefault, emptyPaginatorOff).Return( + jobInfo, listInfo, nil) + + reqBody := createRequestBody(emptyJobFilter, sorterDefault) - reqBody := filterSorterReqBody(filter, sorter, JSON) - req := createRequest(reqBody, "", startingPageQuery, JSON, JSON) - req.Close = true client := testserver.Client() + req := createRequest(reqBody, "", JSON, JSON) resp, err := client.Do(req) Expect(err).ToNot(HaveOccurred()) + defer resp.Body.Close() respBody, err := ioutil.ReadAll(resp.Body) Expect(err).ToNot(HaveOccurred()) - checkReceivedJobInfo(respBody, jobInfoStartingPage, JSON) - - if startingPageNo == pages { - Expect(resp.StatusCode).To(Equal(200)) - Expect(resp.Header.Get("Previous")).To( - Equal("/api/v1/jobs/list?before=" + - jobInfoStartingPage[0].JobID.String())) - Expect(resp.Header.Get("Next")).To( - Equal("")) - Expect(resp.Header.Get("TotalRecords")).To( - Equal(strconv.Itoa(len(jobInfo)))) - Expect(resp.Header.Get("RemainingRecords")).To( - Equal("")) - } else { - Expect(resp.StatusCode).To( - Equal(206)) - Expect(resp.Header.Get("Previous")).To( - Equal("/api/v1/jobs/list?before=" + - jobInfoStartingPage[0].JobID.String())) - Expect(resp.Header.Get("Next")).To( - Equal("/api/v1/jobs/list?after=" + - jobInfoStartingPage[len(jobInfoStartingPage)-1].JobID.String())) - Expect(resp.Header.Get("TotalRecords")).To( - Equal(strconv.Itoa(len(jobInfo)))) - Expect(resp.Header.Get("RemainingRecords")).To( - Equal(strconv.FormatUint(listInfo.RemainingRecords, 10))) - } + checkReceivedJobInfo(respBody, jobInfo) - prevPage := resp.Header.Get("Previous") + Expect(resp.StatusCode).To(Equal(200)) + Expect(resp.Header.Get("Next")).To(Equal("")) + Expect(resp.Header.Get("Previous")).To(Equal("")) + Expect(resp.Header.Get("RemainingRecords")).To(Equal("")) + Expect(resp.Header.Get("TotalRecords")).To(Equal(strconv.Itoa( + len(jobInfo)))) - resp.Body.Close() - testserver.CloseClientConnections() + }, + Entry("20 records avaliable", 20), + Entry("420 records avaliable", 420), + ) - //prepare data for second call based on previous + }) - var jobInfo2 []weles.JobInfo - paginator2 := weles.JobPagination{ - Limit: apiDefaults.PageLimit, - Forward: false, - JobID: jobInfoStartingPage[0].JobID, - } + }) + + Describe("JobManager returns error", func() { + DescribeTable("Server should return appropriate status code and error message", + func(pageLimit int32, statusCode int, amerr error) { + + apiDefaults.PageLimit = pageLimit + + listInfo := weles.ListInfo{ + TotalRecords: uint64(len(jobInfo420)), + RemainingRecords: 0, + } + var paginator weles.JobPagination + if pageLimit == 0 { + paginator = emptyPaginatorOff + } else { + paginator = emptyPaginatorOn + paginator.Limit = pageLimit + } + mockJobManager.EXPECT().ListJobs( + emptyJobFilter, sorterDefault, paginator).Return( + jobInfo420, listInfo, amerr) + reqBody := createRequestBody(emptyJobFilter, sorterDefault) + + client := testserver.Client() + req := createRequest(reqBody, "", JSON, JSON) + resp, err := client.Do(req) + Expect(err).ToNot(HaveOccurred()) + + defer resp.Body.Close() + respBody, err := ioutil.ReadAll(resp.Body) + Expect(err).ToNot(HaveOccurred()) - listInfo2 := weles.ListInfo{TotalRecords: listInfo.TotalRecords} - if startingPageNo == pages { - jobInfo2 = jobInfo[(startingPageNo-2)* - int(apiDefaults.PageLimit) : (startingPageNo-1)* - int(apiDefaults.PageLimit)] - - if startingPageNo-1 == 1 { - listInfo2.RemainingRecords = 0 - } else { - listInfo2.RemainingRecords = uint64((pages - (startingPageNo - 1)) * - int(apiDefaults.PageLimit)) - } - } else { - jobInfo2 = jobInfo[(startingPageNo-1)* - int(apiDefaults.PageLimit) : startingPageNo* - int(apiDefaults.PageLimit)] - - listInfo2.RemainingRecords = uint64(apiDefaults.PageLimit) + checkReceivedJobErr(respBody, amerr) + Expect(resp.StatusCode).To(Equal(statusCode)) + Expect(resp.Header.Get("Next")).To(Equal("")) + Expect(resp.Header.Get("Previous")).To(Equal("")) + Expect(resp.Header.Get("TotalRecords")).To(Equal("")) + Expect(resp.Header.Get("RemainingRecords")).To(Equal("")) + + }, + Entry("pagination off, 404 status, Job not found error", + int32(0), 404, weles.ErrJobNotFound), + Entry("pagination on, 404 status, Job not found error", + int32(100), 404, weles.ErrJobNotFound), + Entry("pagination off, 500 status, Unexpected error", + int32(0), 500, errors.New("This is unexpected error")), + Entry("pagination on, 500 status, Unexpected error", + int32(100), 500, errors.New("This is unexpected error")), + ) + }) + Describe("Pagination turned on", func() { + Describe("Correct request", func() { + DescribeTable("server should set paginator object depending on query params", + func(query string, expectedPaginator weles.JobPagination) { + apiDefaults.PageLimit = 500 + + listInfo := weles.ListInfo{ + TotalRecords: uint64(len(jobInfo420)), + RemainingRecords: 0, } mockJobManager.EXPECT().ListJobs( - filter, sorter, paginator2).Return(jobInfo2, listInfo2, nil).After(first) - client2 := testserver.Client() - reqBody = filterSorterReqBody(filter, sorter, JSON) - req2 := createRequest(reqBody, prevPage, "", JSON, JSON) - req2.Close = true - resp2, err := client2.Do(req2) + emptyJobFilter, sorterDefault, expectedPaginator).Return( + jobInfo420, listInfo, nil) + reqBody := createRequestBody(emptyJobFilter, sorterDefault) + + client := testserver.Client() + req := createRequest(reqBody, query, JSON, JSON) + _, err := client.Do(req) Expect(err).ToNot(HaveOccurred()) - defer resp2.Body.Close() - respBody2, err := ioutil.ReadAll(resp2.Body) + }, + Entry("when no query params set", "", + weles.JobPagination{Forward: true, Limit: 500}), + Entry("when after param is set", "?after=30", + weles.JobPagination{Forward: true, Limit: 500, JobID: 30}), + Entry("when after and limit params are set", "?after=30&limit=20", + weles.JobPagination{Forward: true, Limit: 20, JobID: 30}), + Entry("when before param is set", "?before=30", + weles.JobPagination{Forward: false, Limit: 500, JobID: 30}), + Entry("when before and limit params are set", "?before=30&limit=15", + weles.JobPagination{Forward: false, Limit: 15, JobID: 30}), + Entry("when limit param is set", "?limit=30", + weles.JobPagination{Forward: true, Limit: 30}), + ) + + DescribeTable("server should respond with 200/206 depending on "+ + "ListInfo.RemainingRecords returned by JobManager", + func(listInfo weles.ListInfo, statusCode int) { + + apiDefaults.PageLimit = 100 + paginator := emptyPaginatorOn + paginator.Limit = apiDefaults.PageLimit + mockJobManager.EXPECT().ListJobs( + emptyJobFilter, sorterDefault, paginator).Return( + jobInfo420, listInfo, nil) + reqBody := createRequestBody(emptyJobFilter, sorterDefault) + + client := testserver.Client() + req := createRequest(reqBody, "", JSON, JSON) + _, err := client.Do(req) Expect(err).ToNot(HaveOccurred()) - checkReceivedJobInfo(respBody2, jobInfo2, JSON) - if startingPageNo == pages { - - if startingPageNo-1 == 1 { - Expect(resp2.StatusCode).To(Equal(200)) - Expect(resp2.Header.Get("RemainingRecords")).To(Equal("")) - Expect(resp2.Header.Get("Previous")).To(Equal("")) - - } else { - Expect(resp2.StatusCode).To(Equal(206)) - Expect(resp2.Header.Get("RemainingRecords")).To( - Equal(strconv.FormatInt(int64(apiDefaults.PageLimit), 10))) - Expect(resp2.Header.Get("Previous")).To( - Equal("/api/v1/jobs/list?before=" + jobInfo2[0].JobID.String())) - } - } else { - Expect(resp2.StatusCode).To(Equal(206)) - Expect(resp2.Header.Get("RemainingRecords")).To( - Equal(strconv.FormatInt(int64(apiDefaults.PageLimit), 10))) - } - Expect(resp2.Header.Get("Next")).To( - Equal("/api/v1/jobs/list?after=" + - jobInfo2[len(jobInfo2)-1].JobID.String())) - Expect(resp2.Header.Get("TotalRecords")).To(Equal(strconv.Itoa(len(jobInfo)))) + //TODO: check headers }, - // ginkgo does not like It clauses with the same name. To avoid conflicts with - // tests of listing artifacts, each it clause not referring to jobs exlicitly - // is prefixed with j: - Entry("j: 2->1/2", //meaning: from 1 to 2 out of 2 (pages) - jobInfoAll[:170], 2, 2, emptyFilter, emptySorter), - Entry("j: 2->1/3", - jobInfoAll[:270], 2, 3, emptyFilter, emptySorter), - Entry("j: 3->2/4", - jobInfoAll[:350], 3, 4, emptyFilter, emptySorter), - Entry("j: 3->2/3", - jobInfoAll[:300], 3, 3, emptyFilter, emptySorter), + Entry("first and last page", + weles.ListInfo{RemainingRecords: 0}, 200), + Entry("first page out of n (n>3)", + weles.ListInfo{RemainingRecords: 20}, 206), ) }) - Context("There is an error", func() { - DescribeTable("Server should respond with error from JobManager", - func(pageLimit, aviJobs int, filter weles.JobFilter, sorter weles.JobSorter, - statusCode int, jmerr error) { - - apiDefaults.PageLimit = int32(pageLimit) - jobInfo := createJobInfoSlice(aviJobs) - paginator := weles.JobPagination{Limit: apiDefaults.PageLimit} - if pageLimit == 0 { - paginator.Forward = false - } else { - paginator.Forward = true - } - listInfo := weles.ListInfo{TotalRecords: uint64(aviJobs), RemainingRecords: 0} + Describe("Error ", func() { + DescribeTable("returned by server due to both before and after query params set", + func(query string) { + apiDefaults.PageLimit = 100 + + req := createRequest(nil, query, JSON, JSON) - if sorter.SortOrder == "" { - sorter.SortOrder = weles.SortOrderAscending - } - if sorter.SortBy == "" { - sorter.SortBy = weles.JobSortByID - } - mockJobManager.EXPECT().ListJobs(filter, sorter, paginator).Return( - jobInfo, listInfo, jmerr) - reqBody := filterSorterReqBody(filter, sorter, JSON) client := testserver.Client() - req := createRequest(reqBody, "", "", JSON, JSON) resp, err := client.Do(req) Expect(err).ToNot(HaveOccurred()) - defer resp.Body.Close() + respBody, err := ioutil.ReadAll(resp.Body) Expect(err).ToNot(HaveOccurred()) + checkReceivedJobErr(respBody, weles.ErrBeforeAfterNotAllowed) - checkReceivedErr(respBody, jmerr, JSON) - - Expect(resp.StatusCode).To(Equal(statusCode)) + Expect(resp.StatusCode).To(Equal(400)) Expect(resp.Header.Get("Next")).To(Equal("")) Expect(resp.Header.Get("Previous")).To(Equal("")) Expect(resp.Header.Get("TotalRecords")).To(Equal("")) Expect(resp.Header.Get("RemainingRecords")).To(Equal("")) }, - Entry("404 status, Job not found error "+ - "when server has 0 jobs avaliable,pagination off", - 0, 0, emptyFilter, emptySorter, 404, weles.ErrJobNotFound), - Entry("404 status, Job not found error "+ - "when server has 100 jobs but none fulfilling filter, pagination off", - 0, 100, filledFilter1, emptySorter, 404, weles.ErrJobNotFound), - Entry("500 status, JobManager unexpected error "+ - "when server has 100 jobs, pagination off", - 0, 100, emptyFilter, emptySorter, 500, errors.New( - "This is some errors string")), - Entry("404 status, Job not found error "+ - "when server has 0 jobs avaliable,pagination on", - 100, 0, emptyFilter, emptySorter, 404, weles.ErrJobNotFound), - Entry("404 status, Job not found error "+ - "when server has 100 jobs but none fulfilling filter, pagination on", - 100, 100, filledFilter1, emptySorter, 404, weles.ErrJobNotFound), - Entry("500 status, JobManager unexpected error "+ - "when server has 100 jobs, pagination on", - 100, 100, emptyFilter, emptySorter, 500, errors.New( - "This is some errors string")), + Entry("empty body", "?before=10&after=20"), + Entry("empty body, additional limit query set", "?before=10&after=20&limit=10"), ) }) - - DescribeTable("error returned by server due to both before and after query params set", - func(defaultPageLimit int32, query, acceptH, contentH string, filter weles.JobFilter, - sorter weles.JobSorter) { - - apiDefaults.PageLimit = defaultPageLimit - - reqBody := filterSorterReqBody(filter, sorter, contentH) - req := createRequest(reqBody, "", query, contentH, acceptH) - - client := testserver.Client() - resp, err := client.Do(req) - Expect(err).ToNot(HaveOccurred()) - defer resp.Body.Close() - - respBody, err := ioutil.ReadAll(resp.Body) - Expect(err).ToNot(HaveOccurred()) - checkReceivedErr(respBody, weles.ErrBeforeAfterNotAllowed, acceptH) - - Expect(resp.StatusCode).To(Equal(400)) - Expect(resp.Header.Get("Next")).To(Equal("")) - Expect(resp.Header.Get("Previous")).To(Equal("")) - Expect(resp.Header.Get("TotalRecords")).To(Equal("")) - Expect(resp.Header.Get("RemainingRecords")).To(Equal("")) - - }, - Entry("json, pagination on", - int32(100), "?before=10&after=20", JSON, JSON, emptyFilter, emptySorter), - ) - }) }) diff --git a/server/server_suite_test.go b/server/server_suite_test.go index f5dee35..ed6fec4 100644 --- a/server/server_suite_test.go +++ b/server/server_suite_test.go @@ -44,6 +44,7 @@ const ( basePath = "/api/v1" listArtifactsPath = "/artifacts/list" + listJobsPath = "/jobs/list" ) func TestServer(t *testing.T) { |