diff --git a/api_test.go b/api_test.go
index 9e89b7c..0651ab5 100644
--- a/api_test.go
+++ b/api_test.go
@@ -59,6 +59,7 @@
 		})
 
 		It("should get empty set if no deployments", func() {
+			// setup http client
 			uri, err := url.Parse(testUrl)
 			Expect(err).Should(Succeed())
 			uri.Path = deploymentsEndpoint + strconv.Itoa(testCount)
@@ -82,6 +83,7 @@
 		})
 
 		It("should get correct config format", func() {
+			// setup http client
 			uri, err := url.Parse(testUrl)
 			Expect(err).Should(Succeed())
 			uri.Path = deploymentsEndpoint + strconv.Itoa(testCount)
@@ -107,6 +109,42 @@
 
 		})
 
+		It("should get iso8601 time", func() {
+			testTimes := []string{"", "2017-04-05 04:47:36.462 +0000 UTC", "2017-04-05 04:47:36.462-07:00", "2017-04-05T04:47:36.462Z", "2017-04-05 23:23:38.162+00:00", "2017-06-22 16:41:02.334"}
+			isoTime := []string{"", "2017-04-05T04:47:36.462Z", "2017-04-05T04:47:36.462-07:00", "2017-04-05T04:47:36.462Z", "2017-04-05T23:23:38.162Z", "2017-06-22T16:41:02.334Z"}
+
+			// setup http client
+			uri, err := url.Parse(testUrl)
+			Expect(err).Should(Succeed())
+			uri.Path = deploymentsEndpoint + strconv.Itoa(testCount)
+
+			for i, t := range testTimes {
+				log.Debug("insert deployment with timestamp: " + t)
+				// set test data
+				dep := makeTestDeployment()
+				dep.Created = t
+				dep.Updated = t
+				dummyDbMan.readyDeployments = []DataDeployment{*dep}
+				detail := makeExpectedDetail(dep, uri.String())
+				detail.Created = isoTime[i]
+				detail.Updated = isoTime[i]
+				// 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.ApiDeploymentsResponse).Should(Equal([]ApiDeploymentDetails{*detail}))
+
+			}
+		})
+
 		It("should debounce requests", func(done Done) {
 			var in = make(chan interface{})
 			var out = make(chan []interface{})
@@ -135,47 +173,18 @@
 })
 
 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
+	deployments := make([]DataDeployment, count)
+	details := make([]ApiDeploymentDetails, count)
 
 	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",
-		}
+		dep := makeTestDeployment()
+		detail := makeExpectedDetail(dep, self)
 
-		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)
+		deployments[i] = *dep
+		details[i] = *detail
 	}
 
 	dummyDbMan.readyDeployments = deployments
@@ -184,6 +193,45 @@
 	return details
 }
 
+func makeTestDeployment() *DataDeployment {
+	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",
+	}
+	return dep
+}
+
+func makeExpectedDetail(dep *DataDeployment, self string) *ApiDeploymentDetails {
+	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,
+	}
+	return detail
+}
+
 type dummyDbManager struct {
 	unreadyDeployments []DataDeployment
 	readyDeployments   []DataDeployment
