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:])
+}