add test case
diff --git a/api.go b/api.go index 3d4fe23..e757122 100644 --- a/api.go +++ b/api.go
@@ -307,7 +307,7 @@ Env: d.EnvID, Scope: a.getDeploymentScope(), Revision: d.Revision, - BlobId: d.GWBlobID, + BlobId: d.BlobID, BlobURL: d.BlobURL, ResourceBlobId: d.BlobResourceID, Created: convertTime(d.Created),
diff --git a/api_test.go b/api_test.go index aceb65d..9e89b7c 100644 --- a/api_test.go +++ b/api_test.go
@@ -19,8 +19,11 @@ "net/http" "net/url" + "crypto/rand" + "fmt" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + mathrand "math/rand" "strconv" "time" ) @@ -32,13 +35,14 @@ var _ = Describe("api", func() { Context("GET /deployments", func() { var testCount int + var dummyDbMan *dummyDbManager var testApiMan *apiManager var _ = BeforeEach(func() { testCount += 1 - dbMan := &dummyDbMan{} + dummyDbMan = &dummyDbManager{} testApiMan = &apiManager{ - dbMan: dbMan, + dbMan: dummyDbMan, deploymentsEndpoint: deploymentsEndpoint + strconv.Itoa(testCount), blobEndpoint: blobEndpointPath + strconv.Itoa(testCount) + "/{blobId}", eTag: int64(testCount * 10), @@ -58,53 +62,166 @@ uri, err := url.Parse(testUrl) Expect(err).Should(Succeed()) uri.Path = deploymentsEndpoint + strconv.Itoa(testCount) - log.Debug("uri string: " + uri.String()) - log.Debug("port: " + config.GetString("api_port")) + // http get res, err := http.Get(uri.String()) Expect(err).Should(Succeed()) defer res.Body.Close() - Expect(res.StatusCode).Should(Equal(http.StatusOK)) - + // parse response var depRes ApiDeploymentResponse body, err := ioutil.ReadAll(res.Body) - Expect(err).ShouldNot(HaveOccurred()) - json.Unmarshal(body, &depRes) - + Expect(err).Should(Succeed()) + err = json.Unmarshal(body, &depRes) + Expect(err).Should(Succeed()) + // verify response Expect(len(depRes.ApiDeploymentsResponse)).To(Equal(0)) Expect(depRes.Kind).Should(Equal(kindCollection)) Expect(depRes.Self).Should(Equal(testUrl + deploymentsEndpoint + strconv.Itoa(testCount))) }) + + It("should get correct config format", func() { + uri, err := url.Parse(testUrl) + Expect(err).Should(Succeed()) + uri.Path = deploymentsEndpoint + strconv.Itoa(testCount) + + // set test data + details := setTestDeployments(dummyDbMan, uri.String()) + + // http get + res, err := http.Get(uri.String()) + Expect(err).Should(Succeed()) + defer res.Body.Close() + Expect(res.StatusCode).Should(Equal(http.StatusOK)) + // parse response + var depRes ApiDeploymentResponse + body, err := ioutil.ReadAll(res.Body) + Expect(err).Should(Succeed()) + err = json.Unmarshal(body, &depRes) + Expect(err).Should(Succeed()) + // verify response + Expect(depRes.Kind).Should(Equal(kindCollection)) + Expect(depRes.Self).Should(Equal(uri.String())) + Expect(depRes.ApiDeploymentsResponse).Should(Equal(details)) + + }) + + It("should debounce requests", func(done Done) { + var in = make(chan interface{}) + var out = make(chan []interface{}) + + go testApiMan.debounce(in, out, 3*time.Millisecond) + + go func() { + defer GinkgoRecover() + + received, ok := <-out + Expect(ok).To(BeTrue()) + Expect(len(received)).To(Equal(2)) + + close(in) + received, ok = <-out + Expect(ok).To(BeFalse()) + + close(done) + }() + + in <- "x" + in <- "y" + }) + }) }) -type dummyDbMan struct { +func setTestDeployments(dummyDbMan *dummyDbManager, self string) []ApiDeploymentDetails { + deployments := make([]DataDeployment, 0) + details := make([]ApiDeploymentDetails, 0) + mathrand.Seed(time.Now().UnixNano()) + count := mathrand.Intn(5) + 1 + + for i := 0; i < count; i++ { + dep := DataDeployment{ + ID: GenerateUUID(), + OrgID: GenerateUUID(), + EnvID: GenerateUUID(), + Type: "virtual-host", + Name: "vh-secure", + Revision: "1", + BlobID: GenerateUUID(), + GWBlobID: GenerateUUID(), + BlobResourceID: GenerateUUID(), + Updated: time.Now().Format(time.RFC3339), + UpdatedBy: "haoming@google.com", + Created: time.Now().Format(time.RFC3339), + CreatedBy: "haoming@google.com", + BlobFSLocation: "BlobFSLocation", + BlobURL: "http://localhost:6666/testBlobURL", + } + + detail := ApiDeploymentDetails{ + Self: self + "/" + dep.ID, + Name: dep.Name, + Type: dep.Type, + Org: dep.OrgID, + Env: dep.EnvID, + Scope: "", + Revision: dep.Revision, + BlobId: dep.BlobID, + BlobURL: dep.BlobURL, + ResourceBlobId: dep.BlobResourceID, + Created: dep.Created, + Updated: dep.Updated, + } + + deployments = append(deployments, dep) + details = append(details, detail) + } + + dummyDbMan.readyDeployments = deployments + dummyDbMan.unreadyDeployments = deployments + + return details +} + +type dummyDbManager struct { unreadyDeployments []DataDeployment readyDeployments []DataDeployment } -func (d *dummyDbMan) setDbVersion(version string) { +func (d *dummyDbManager) setDbVersion(version string) { } -func (d *dummyDbMan) initDb() error { +func (d *dummyDbManager) initDb() error { return nil } -func (d *dummyDbMan) getUnreadyDeployments() ([]DataDeployment, error) { +func (d *dummyDbManager) getUnreadyDeployments() ([]DataDeployment, error) { return d.unreadyDeployments, nil } -func (d *dummyDbMan) getReadyDeployments() ([]DataDeployment, error) { - return nil, nil +func (d *dummyDbManager) getReadyDeployments() ([]DataDeployment, error) { + return d.readyDeployments, nil } -func (d *dummyDbMan) updateLocalFsLocation(string, string, string) error { +func (d *dummyDbManager) updateLocalFsLocation(string, string, string) error { return nil } -func (d *dummyDbMan) getLocalFSLocation(string) (string, error) { +func (d *dummyDbManager) getLocalFSLocation(string) (string, error) { return "", nil } + +func GenerateUUID() string { + + buff := make([]byte, 16) + numRead, err := rand.Read(buff) + if numRead != len(buff) || err != nil { + panic(err) + } + /* uuid v4 spec */ + buff[6] = (buff[6] | 0x40) & 0x4F + buff[8] = (buff[8] | 0x80) & 0xBF + return fmt.Sprintf("%x-%x-%x-%x-%x", buff[0:4], buff[4:6], buff[6:8], buff[8:10], buff[10:]) +}