Add more test cases for all KMS tables (INS/UPD/DEL) and fixed issues
found while testing them
diff --git a/api_test.go b/api_test.go
index 369d540..7a0b86a 100644
--- a/api_test.go
+++ b/api_test.go
@@ -2,6 +2,7 @@
import (
"encoding/json"
+ "github.com/apigee-labs/transicator/common"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"io/ioutil"
@@ -13,14 +14,250 @@
var _ = Describe("api", func() {
- Context("verifyAPIKey() directly", func() {
+ Context("DB Inserts/Deletes verification", func() {
+
+ It("Positive DB test for Insert operations", func() {
+ db := getDB()
+ txn, err := db.Begin()
+ Expect(err).ShouldNot(HaveOccurred())
+
+ for i := 0; i < 10; i++ {
+ var rows []common.Row
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "api_product_" + result,
+ Type: 1,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "{/**, /test}",
+ Type: 1,
+ }
+ srvItems["api_resources"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "{Env_0, Env_1}",
+ Type: 1,
+ }
+ srvItems["environments"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "tenant_id_xxxx",
+ Type: 1,
+ }
+ srvItems["tenant_id"] = scv
+ rows = append(rows, srvItems)
+ res := insertAPIproducts(rows, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ for i := 0; i < 10; i++ {
+ var rows []common.Row
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "developer_id_" + result,
+ Type: 1,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "test@apigee.com",
+ Type: 1,
+ }
+ srvItems["email"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Active",
+ Type: 1,
+ }
+ srvItems["status"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Apigee",
+ Type: 1,
+ }
+ srvItems["firstName"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Google",
+ Type: 1,
+ }
+ srvItems["lastName"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "tenant_id_xxxx",
+ Type: 1,
+ }
+ srvItems["tenant_id"] = scv
+
+ rows = append(rows, srvItems)
+ res := insertDevelopers(rows, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ var j, k int
+ for i := 0; i < 10; i++ {
+ resulti := strconv.FormatInt(int64(i), 10)
+ for j = k; j < 10+k; j++ {
+ var rows []common.Row
+
+ srvItems := common.Row{}
+ resultj := strconv.FormatInt(int64(j), 10)
+
+ scv := &common.ColumnVal{
+ Value: "application_id_" + resultj,
+ Type: 1,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "developer_id_" + resulti,
+ Type: 1,
+ }
+ srvItems["developer_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "approved",
+ Type: 1,
+ }
+ srvItems["status"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "http://apigee.com",
+ Type: 1,
+ }
+ srvItems["callback_url"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "tenant_id_xxxx",
+ Type: 1,
+ }
+ srvItems["tenant_id"] = scv
+ rows = append(rows, srvItems)
+ res := insertApplications(rows, txn)
+ Expect(res).Should(BeTrue())
+ }
+ k = j
+ }
+
+ for i := 0; i < 10; i++ {
+ var rows []common.Row
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "app_credential_" + result,
+ Type: 1,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "application_id_" + result,
+ Type: 1,
+ }
+ srvItems["app_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "approved",
+ Type: 1,
+ }
+ srvItems["status"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "tenant_id_xxxx",
+ Type: 1,
+ }
+ srvItems["tenant_id"] = scv
+ rows = append(rows, srvItems)
+ res := insertCredentials(rows, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ for i := 0; i < 10; i++ {
+ var rows []common.Row
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "api_product_" + result,
+ Type: 1,
+ }
+ srvItems["apiprdt_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "application_id_" + result,
+ Type: 1,
+ }
+ srvItems["app_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "app_credential_" + result,
+ Type: 1,
+ }
+ srvItems["appcred_id"] = scv
+ scv = &common.ColumnVal{
+ Value: "approved",
+ Type: 1,
+ }
+ srvItems["status"] = scv
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "tenant_id_xxxx",
+ Type: 1,
+ }
+ srvItems["tenant_id"] = scv
+ rows = append(rows, srvItems)
+ res := insertAPIProductMappers(rows, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ txn.Commit()
+ var count int64
+ db.QueryRow("select count(*) from data_scope").Scan(&count)
+ log.Info("Found ", count)
+
+ })
It("should reject a bad key", func() {
v := url.Values{
- "key": []string{"credential_x"},
- "uriPath": []string{"/test"},
+ "key": []string{"credential_x"},
+ "uriPath": []string{"/test"},
"scopeuuid": []string{"ABCDE"},
- "action": []string{"verify"},
+ "action": []string{"verify"},
}
rsp, err := verifyAPIKey(v)
Expect(err).ShouldNot(HaveOccurred())
@@ -31,38 +268,15 @@
Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND"))
})
- /*
- It("should reject a key once it's deleted", func() {
- pd0 := &DataPayload{
- EntityIdentifier: "app_credential_0",
- }
- res := deleteCredential(*pd0, db)
- Expect(res).Should(BeTrue())
- var respj kmsResponseFail
- v := url.Values{
- "key": []string{"app_credential_0"},
- "path": []string{"/test"},
- "env": []string{"Env_0"},
- "organization": []string{"Org_0"},
- "action": []string{"verify"},
- }
- rsp, err := verifyAPIKey(v)
- Expect(err).ShouldNot(HaveOccurred())
-
- json.Unmarshal(rsp, &respj)
- Expect(respj.Type).Should(Equal("ErrorResult"))
- Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND"))
- })
- */
It("should successfully verify good keys", func() {
for i := 1; i < 10; i++ {
resulti := strconv.FormatInt(int64(i), 10)
v := url.Values{
- "key": []string{"app_credential_"+resulti},
- "uriPath": []string{"/test"},
+ "key": []string{"app_credential_" + resulti},
+ "uriPath": []string{"/test"},
"scopeuuid": []string{"ABCDE"},
- "action": []string{"verify"},
+ "action": []string{"verify"},
}
rsp, err := verifyAPIKey(v)
Expect(err).ShouldNot(HaveOccurred())
@@ -73,9 +287,231 @@
Expect(respj.RspInfo.Key).Should(Equal("app_credential_" + resulti))
}
})
- })
- Context("access via API", func() {
+ It("Positive DB test for Delete operations", func() {
+ db := getDB()
+ txn, err := db.Begin()
+ Expect(err).ShouldNot(HaveOccurred())
+
+ for i := 0; i < 10; i++ {
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "api_product_" + result,
+ Type: 3,
+ }
+ srvItems["apiprdt_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "application_id_" + result,
+ Type: 3,
+ }
+ srvItems["app_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "app_credential_" + result,
+ Type: 3,
+ }
+ srvItems["appcred_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 3,
+ }
+ srvItems["_change_selector"] = scv
+
+ res := deleteAPIproductMapper(srvItems, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ for i := 0; i < 10; i++ {
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "app_credential_" + result,
+ Type: 3,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 3,
+ }
+ srvItems["_change_selector"] = scv
+
+ res := deleteObject("APP_CREDENTIAL", srvItems, txn)
+ Expect(res).Should(BeTrue())
+ }
+ for i := 0; i < 100; i++ {
+
+ srvItems := common.Row{}
+ resultj := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "application_id_" + resultj,
+ Type: 1,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ res := deleteObject("APP", srvItems, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ for i := 0; i < 10; i++ {
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "developer_id_" + result,
+ Type: 1,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ res := deleteObject("DEVELOPER", srvItems, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ for i := 0; i < 10; i++ {
+ srvItems := common.Row{}
+ result := strconv.FormatInt(int64(i), 10)
+
+ scv := &common.ColumnVal{
+ Value: "api_product_" + result,
+ Type: 1,
+ }
+ srvItems["id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ res := deleteObject("API_PRODUCT", srvItems, txn)
+ Expect(res).Should(BeTrue())
+ }
+
+ txn.Commit()
+
+ })
+
+ It("Negative cases for DB Deletes on KMS tables", func() {
+ db := getDB()
+ txn, err := db.Begin()
+ Expect(err).ShouldNot(HaveOccurred())
+
+ srvItems := common.Row{}
+ result := "DEADBEEF"
+
+ scv := &common.ColumnVal{
+ Value: "api_product_" + result,
+ Type: 3,
+ }
+ srvItems["apiprdt_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "application_id_" + result,
+ Type: 3,
+ }
+ srvItems["app_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "app_credential_" + result,
+ Type: 3,
+ }
+ srvItems["appcred_id"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 3,
+ }
+ srvItems["_change_selector"] = scv
+
+ res := deleteAPIproductMapper(srvItems, txn)
+ Expect(res).Should(BeFalse())
+
+ res = deleteObject("API_PRODUCT", srvItems, txn)
+ Expect(res).Should(BeFalse())
+
+ res = deleteObject("APP_CREDENTIAL", srvItems, txn)
+ Expect(res).Should(BeFalse())
+
+ res = deleteObject("DEVELOPER", srvItems, txn)
+ Expect(res).Should(BeFalse())
+
+ res = deleteObject("APP", srvItems, txn)
+ Expect(res).Should(BeFalse())
+
+ txn.Rollback()
+
+ })
+ It("Negative cases for DB Inserts/updates on KMS tables", func() {
+
+ db := getDB()
+ txn, err := db.Begin()
+ Expect(err).ShouldNot(HaveOccurred())
+
+ var rows []common.Row
+ srvItems := common.Row{}
+ result := "NOPRODID_BADCASE"
+ scv := &common.ColumnVal{
+ Value: "foobar_" + result,
+ Type: 1,
+ }
+ srvItems[result] = scv
+
+ scv = &common.ColumnVal{
+ Value: "{/**, /test}",
+ Type: 1,
+ }
+ srvItems["api_resources"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "{Env_1, Env_0}",
+ Type: 1,
+ }
+ srvItems["environments"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "Org_0",
+ Type: 1,
+ }
+ srvItems["_change_selector"] = scv
+
+ scv = &common.ColumnVal{
+ Value: "tenant_id_xxxx",
+ Type: 1,
+ }
+ srvItems["tenant_id"] = scv
+
+ rows = append(rows, srvItems)
+ res := insertAPIproducts(rows, txn)
+ Expect(res).Should(BeFalse())
+
+ res = insertApplications(rows, txn)
+ Expect(res).Should(BeFalse())
+
+ res = insertCredentials(rows, txn)
+ Expect(res).Should(BeFalse())
+
+ res = insertAPIProductMappers(rows, txn)
+ Expect(res).Should(BeFalse())
+
+ })
It("should reject a bad key", func() {
@@ -103,33 +539,5 @@
Expect(respj.Type).Should(Equal("ErrorResult"))
Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND"))
})
-
- It("should successfully verify a good key", func() {
-
- uri, err := url.Parse(testServer.URL)
- uri.Path = apiPath
-
- v := url.Values{}
- v.Add("key", "app_credential_1")
- v.Add("scopeuuid", "ABCDE")
- v.Add("uriPath", "/test")
- v.Add("action", "verify")
-
- client := &http.Client{}
- req, err := http.NewRequest("POST", uri.String(), strings.NewReader(v.Encode()))
- req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
-
- res, err := client.Do(req)
- defer res.Body.Close()
- Expect(err).ShouldNot(HaveOccurred())
-
- var respj kmsResponseSuccess
- body, err := ioutil.ReadAll(res.Body)
- Expect(err).ShouldNot(HaveOccurred())
- json.Unmarshal(body, &respj)
- log.Info("Result test",respj)
- Expect(respj.Type).Should(Equal("APIKeyContext"))
- Expect(respj.RspInfo.Key).Should(Equal("app_credential_1"))
- })
})
})
diff --git a/init.go b/init.go
index a475420..98636b4 100644
--- a/init.go
+++ b/init.go
@@ -10,9 +10,9 @@
)
var (
- log apid.LogService
- data apid.DataService
- events apid.EventsService
+ log apid.LogService
+ data apid.DataService
+ events apid.EventsService
unsafeDB apid.DB
dbMux sync.RWMutex
)
@@ -160,7 +160,6 @@
}
}
-
func createApidClusterTables(db apid.DB) {
_, err := db.Exec(`
CREATE TABLE apid_cluster (
@@ -196,4 +195,3 @@
log.Panic("Unable to initialize DB", err)
}
}
-
diff --git a/listener.go b/listener.go
index b2e3f34..de80a9b 100644
--- a/listener.go
+++ b/listener.go
@@ -102,6 +102,12 @@
ele.Get("status", &status)
ele.Get("issued_at", &issuedAt)
ele.Get("tenant_id", &tenantId)
+
+ /* Mandatory params check */
+ if id == "" || scope == "" || tenantId == "" {
+ log.Error("INSERT APP_CREDENTIAL: i/p args missing")
+ return false
+ }
_, err = txn.Stmt(prep).Exec(
scope,
id,
@@ -152,6 +158,11 @@
ele.Get("updated_by", &LastModifiedBy)
ele.Get("tenant_id", &tenantId)
+ /* Mandatory params check */
+ if EntityIdentifier == "" || scope == "" || tenantId == "" {
+ log.Error("INSERT APP: i/p args missing")
+ return false
+ }
_, err = txn.Stmt(prep).Exec(
scope,
EntityIdentifier,
@@ -207,6 +218,11 @@
ele.Get("updated_at", &LastModifiedAt)
ele.Get("updated_by", &LastModifiedBy)
+ /* Mandatory params check */
+ if EntityIdentifier == "" || scope == "" || tenantId == "" {
+ log.Error("INSERT DEVELOPER: i/p args missing")
+ return false
+ }
_, err = txn.Stmt(prep).Exec(
scope,
Email,
@@ -253,6 +269,11 @@
ele.Get("environments", &env)
ele.Get("tenant_id", &tenantId)
+ /* Mandatory params check */
+ if apiProduct == "" || scope == "" || tenantId == "" {
+ log.Error("INSERT API_PRODUCT: i/p args missing")
+ return false
+ }
_, err = txn.Stmt(prep).Exec(
apiProduct,
res,
@@ -293,6 +314,12 @@
ele.Get("_change_selector", &Scope)
ele.Get("status", &Status)
+ /* Mandatory params check */
+ if ApiProduct == "" || AppId == "" || EntityIdentifier == "" || tenantId == "" || Scope == "" {
+ log.Error("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER : i/p args missing")
+ return false
+ }
+
/*
* If the credentials has been successfully inserted, insert the
* mapping entries associated with the credential
@@ -437,7 +464,7 @@
*/
func deleteObject(object string, ele common.Row, txn *sql.Tx) bool {
- var scope, apiProduct string
+ var scope, objid string
ssql := "DELETE FROM " + object + " WHERE id = $1 AND _change_selector = $2"
prep, err := txn.Prepare(ssql)
if err != nil {
@@ -446,16 +473,18 @@
}
defer prep.Close()
ele.Get("_change_selector", &scope)
- ele.Get("id", &apiProduct)
+ ele.Get("id", &objid)
- _, err = txn.Stmt(prep).Exec(apiProduct, scope)
- if err != nil {
- log.Error("DELETE ", object, " Failed: (", apiProduct, ", ", scope, ")", err)
- return false
- } else {
- log.Debug("DELETE ", object, " Success: (", apiProduct, ", ", scope, ")")
- return true
+ res, err := txn.Stmt(prep).Exec(objid, scope)
+ if err == nil {
+ affect, err := res.RowsAffected()
+ if err == nil && affect != 0 {
+ log.Debugf("DELETE %s (%s, %s) success.", object, objid, scope)
+ return true
+ }
}
+ log.Errorf("DELETE %s (%s, %s) failed.", object, objid, scope)
+ return false
}
@@ -478,23 +507,14 @@
ele.Get("appcred_id", &EntityIdentifier)
ele.Get("_change_selector", &apid_scope)
- _, err = txn.Stmt(prep).Exec(ApiProduct, AppId, EntityIdentifier, apid_scope)
- if err != nil {
- log.Error("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: (",
- ApiProduct, ", ",
- AppId, ", ",
- EntityIdentifier, ", ",
- apid_scope,
- ")",
- err)
- return false
- } else {
- log.Debug("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Success: (",
- ApiProduct, ", ",
- AppId, ", ",
- EntityIdentifier, ", ",
- apid_scope,
- ")")
- return true
+ res, err := txn.Stmt(prep).Exec(ApiProduct, AppId, EntityIdentifier, apid_scope)
+ if err == nil {
+ affect, err := res.RowsAffected()
+ if err == nil && affect != 0 {
+ log.Debugf("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER (%s, %s, %s, %s) success.", ApiProduct, AppId, EntityIdentifier, apid_scope)
+ return true
+ }
}
+ log.Errorf("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER (%s, %s, %s, %s) failed.", ApiProduct, AppId, EntityIdentifier, apid_scope, err)
+ return false
}
diff --git a/listener_test.go b/listener_test.go
index a8da554..8305836 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -11,151 +11,387 @@
var _ = Describe("listener", func() {
- It("should store data from ApigeeSync in the database", func(done Done) {
+ Context("KMS create/updates verification via changes", func() {
+ It("Create KMS tables via changes, and Verify via verifyApiKey", func(done Done) {
+ var event = common.ChangeList{}
+ closed := 0
+ /* API Product */
+ srvItems := common.Row{
+ "id": {
+ Value: "ch_api_product_2",
+ },
+ "apid_resources": {
+ Value: "{}",
+ },
+ "environments": {
+ Value: "{Env_0, Env_1}",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+ /* DEVELOPER */
+ devItems := common.Row{
+ "id": {
+ Value: "ch_developer_id_2",
+ },
+ "status": {
+ Value: "Active",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+
+ /* APP */
+ appItems := common.Row{
+ "id": {
+ Value: "ch_application_id_2",
+ },
+ "developer_id": {
+ Value: "ch_developer_id_2",
+ },
+ "status": {
+ Value: "Approved",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+
+ /* CRED */
+ credItems := common.Row{
+ "id": {
+ Value: "ch_app_credential_2",
+ },
+ "app_id": {
+ Value: "ch_application_id_2",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "status": {
+ Value: "Approved",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+
+ /* APP_CRED_APIPRD_MAPPER */
+ mpItems := common.Row{
+ "apiprdt_id": {
+ Value: "ch_api_product_2",
+ },
+ "app_id": {
+ Value: "ch_application_id_2",
+ },
+ "appcred_id": {
+ Value: "ch_app_credential_2",
+ },
+ "status": {
+ Value: "Approved",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ }
+
+ event.Changes = []common.Change{
+ {
+ Table: "kms.api_product",
+ NewRow: srvItems,
+ Operation: 1,
+ },
+ {
+ Table: "kms.developer",
+ NewRow: devItems,
+ Operation: 1,
+ },
+ {
+ Table: "kms.app",
+ NewRow: appItems,
+ Operation: 1,
+ },
+ {
+ Table: "kms.app_credential",
+ NewRow: credItems,
+ Operation: 1,
+ },
+ {
+ Table: "kms.app_credential_apiproduct_mapper",
+ NewRow: mpItems,
+ Operation: 1,
+ },
+ }
+
+ h := &test_handler{
+ "checkDatabase post Insertion",
+ func(e apid.Event) {
+ defer GinkgoRecover()
+
+ // ignore the first event, let standard listener process it
+ changeSet := e.(*common.ChangeList)
+ if len(changeSet.Changes) > 0 || closed == 1 {
+ return
+ }
+ v := url.Values{
+ "key": []string{"ch_app_credential_2"},
+ "uriPath": []string{"/test"},
+ "scopeuuid": []string{"XYZ"},
+ "action": []string{"verify"},
+ }
+ rsp, err := verifyAPIKey(v)
+ Expect(err).ShouldNot(HaveOccurred())
+ var respj kmsResponseSuccess
+ json.Unmarshal(rsp, &respj)
+ Expect(respj.Type).Should(Equal("APIKeyContext"))
+ Expect(respj.RspInfo.Key).Should(Equal("ch_app_credential_2"))
+ closed = 1
+ close(done)
+ },
+ }
+
+ apid.Events().Listen("ApigeeSync", h)
+ apid.Events().Emit("ApigeeSync", &event)
+ apid.Events().Emit("ApigeeSync", &common.ChangeList{})
+ })
+ })
+
+ It("Modify tables in KMS tables, and verify via verifyApiKey", func(done Done) {
+ closed := 0
var event = common.ChangeList{}
var event2 = common.ChangeList{}
+ /* Orig data */
/* API Product */
- srvItems := common.Row{
+ srvItemsOld := common.Row{
"id": {
Value: "ch_api_product_0",
- Type: 1,
},
"apid_resources": {
Value: "{}",
- Type: 1,
},
"environments": {
Value: "{Env_0, Env_1}",
- Type: 1,
},
"tenant_id": {
Value: "tenant_id_0",
- Type: 1,
},
"_change_selector": {
Value: "test_org0",
- Type: 1,
},
}
/* DEVELOPER */
- devItems := common.Row{
+ devItemsOld := common.Row{
"id": {
Value: "ch_developer_id_0",
- Type: 1,
},
"status": {
Value: "Active",
- Type: 1,
},
"tenant_id": {
Value: "tenant_id_0",
- Type: 1,
},
"_change_selector": {
Value: "test_org0",
- Type: 1,
},
}
/* APP */
- appItems := common.Row{
+ appItemsOld := common.Row{
"id": {
Value: "ch_application_id_0",
- Type: 1,
},
"developer_id": {
Value: "ch_developer_id_0",
- Type: 1,
},
"status": {
Value: "Approved",
- Type: 1,
},
"tenant_id": {
Value: "tenant_id_0",
- Type: 1,
},
"_change_selector": {
Value: "test_org0",
- Type: 1,
},
}
/* CRED */
- credItems := common.Row{
+ credItemsOld := common.Row{
"id": {
Value: "ch_app_credential_0",
- Type: 1,
},
"app_id": {
Value: "ch_application_id_0",
- Type: 1,
},
"tenant_id": {
Value: "tenant_id_0",
- Type: 1,
},
"status": {
Value: "Approved",
- Type: 1,
},
"_change_selector": {
Value: "test_org0",
- Type: 1,
},
}
/* APP_CRED_APIPRD_MAPPER */
- mpItems := common.Row{
+ mpItemsOld := common.Row{
"apiprdt_id": {
Value: "ch_api_product_0",
- Type: 1,
},
"app_id": {
Value: "ch_application_id_0",
- Type: 1,
},
"appcred_id": {
Value: "ch_app_credential_0",
- Type: 1,
},
"status": {
Value: "Approved",
- Type: 1,
},
"_change_selector": {
Value: "test_org0",
- Type: 1,
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ }
+
+ /* New to be replaced data */
+ /* API PRODUCT */
+ srvItemsNew := common.Row{
+ "id": {
+ Value: "ch_api_product_1",
+ },
+ "apid_resources": {
+ Value: "{}",
+ },
+ "environments": {
+ Value: "{Env_0, Env_1}",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+
+ /* DEVELOPER */
+ devItemsNew := common.Row{
+ "id": {
+ Value: "ch_developer_id_1",
+ },
+ "status": {
+ Value: "Active",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+
+ /* APP */
+ appItemsNew := common.Row{
+ "id": {
+ Value: "ch_application_id_1",
+ },
+ "developer_id": {
+ Value: "ch_developer_id_1",
+ },
+ "status": {
+ Value: "Approved",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+
+ /* CRED */
+ credItemsNew := common.Row{
+ "id": {
+ Value: "ch_app_credential_1",
+ },
+ "app_id": {
+ Value: "ch_application_id_1",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
+ },
+ "status": {
+ Value: "Approved",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ }
+
+ /* APP_CRED_APIPRD_MAPPER */
+ mpItemsNew := common.Row{
+ "apiprdt_id": {
+ Value: "ch_api_product_1",
+ },
+ "app_id": {
+ Value: "ch_application_id_1",
+ },
+ "appcred_id": {
+ Value: "ch_app_credential_1",
+ },
+ "status": {
+ Value: "Approved",
+ },
+ "_change_selector": {
+ Value: "test_org0",
+ },
+ "tenant_id": {
+ Value: "tenant_id_0",
},
}
event.Changes = []common.Change{
{
Table: "kms.api_product",
- NewRow: srvItems,
+ NewRow: srvItemsOld,
Operation: 1,
},
{
Table: "kms.developer",
- NewRow: devItems,
+ NewRow: devItemsOld,
Operation: 1,
},
{
Table: "kms.app",
- NewRow: appItems,
+ NewRow: appItemsOld,
Operation: 1,
},
{
Table: "kms.app_credential",
- NewRow: credItems,
+ NewRow: credItemsOld,
Operation: 1,
},
{
Table: "kms.app_credential_apiproduct_mapper",
- NewRow: mpItems,
+ NewRow: mpItemsOld,
Operation: 1,
},
}
@@ -163,30 +399,36 @@
event2.Changes = []common.Change{
{
Table: "kms.api_product",
- OldRow: srvItems,
- Operation: 3,
+ OldRow: srvItemsOld,
+ NewRow: srvItemsNew,
+ Operation: 2,
},
{
Table: "kms.developer",
- OldRow: devItems,
- Operation: 3,
+ OldRow: devItemsOld,
+ NewRow: devItemsNew,
+ Operation: 2,
},
{
Table: "kms.app",
- OldRow: appItems,
- Operation: 3,
+ OldRow: appItemsOld,
+ NewRow: appItemsNew,
+ Operation: 2,
},
{
Table: "kms.app_credential",
- OldRow: credItems,
- Operation: 3,
+ OldRow: credItemsOld,
+ NewRow: credItemsNew,
+ Operation: 2,
},
{
Table: "kms.app_credential_apiproduct_mapper",
- OldRow: mpItems,
- Operation: 3,
+ OldRow: mpItemsOld,
+ NewRow: mpItemsNew,
+ Operation: 2,
},
}
+
h := &test_handler{
"checkDatabase post Insertion",
func(e apid.Event) {
@@ -194,21 +436,22 @@
// ignore the first event, let standard listener process it
changeSet := e.(*common.ChangeList)
- if len(changeSet.Changes) > 0 {
+ if len(changeSet.Changes) > 0 || closed == 1 {
return
}
v := url.Values{
- "key": []string{"ch_app_credential_0"},
- "uriPath": []string{"/test"},
+ "key": []string{"ch_app_credential_1"},
+ "uriPath": []string{"/test"},
"scopeuuid": []string{"XYZ"},
- "action": []string{"verify"},
+ "action": []string{"verify"},
}
rsp, err := verifyAPIKey(v)
Expect(err).ShouldNot(HaveOccurred())
var respj kmsResponseSuccess
json.Unmarshal(rsp, &respj)
Expect(respj.Type).Should(Equal("APIKeyContext"))
- Expect(respj.RspInfo.Key).Should(Equal("ch_app_credential_0"))
+ Expect(respj.RspInfo.Key).Should(Equal("ch_app_credential_1"))
+ closed = 1
close(done)
},
}
@@ -216,7 +459,6 @@
apid.Events().Listen("ApigeeSync", h)
apid.Events().Emit("ApigeeSync", &event)
apid.Events().Emit("ApigeeSync", &event2)
- apid.Events().Emit("ApigeeSync", &event)
apid.Events().Emit("ApigeeSync", &common.ChangeList{})
})
@@ -234,3 +476,29 @@
func (t *test_handler) Handle(event apid.Event) {
t.f(event)
}
+
+func addScopes(db apid.DB) {
+ txn, _ := db.Begin()
+ txn.Exec("INSERT INTO DATA_SCOPE (id, _change_selector, apid_cluster_id, scope, org, env) "+
+ "VALUES"+
+ "($1,$2,$3,$4,$5,$6)",
+ "ABCDE",
+ "some_cluster_id",
+ "some_cluster_id",
+ "tenant_id_xxxx",
+ "test_org0",
+ "Env_0",
+ )
+ txn.Exec("INSERT INTO DATA_SCOPE (id, _change_selector, apid_cluster_id, scope, org, env) "+
+ "VALUES"+
+ "($1,$2,$3,$4,$5,$6)",
+ "XYZ",
+ "test_org0",
+ "somecluster_id",
+ "tenant_id_0",
+ "test_org0",
+ "Env_0",
+ )
+ log.Info("Inserted DATA_SCOPE for test")
+ txn.Commit()
+}
diff --git a/verifyAPIKey_suite_test.go b/verifyAPIKey_suite_test.go
index 870a376..a5e5b39 100644
--- a/verifyAPIKey_suite_test.go
+++ b/verifyAPIKey_suite_test.go
@@ -4,15 +4,13 @@
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
- "testing"
"github.com/30x/apid"
"github.com/30x/apid/factory"
"io/ioutil"
- "net/http/httptest"
"net/http"
+ "net/http/httptest"
"os"
- "strconv"
- "github.com/apigee-labs/transicator/common"
+ "testing"
)
var (
@@ -38,7 +36,7 @@
setDB(db)
createTables(db)
createApidClusterTables(db)
- insertTestData(db)
+ addScopes(db)
testServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
if req.URL.Path == apiPath {
handleRequest(w, req)
@@ -58,259 +56,3 @@
RegisterFailHandler(Fail)
RunSpecs(t, "VerifyAPIKey Suite")
}
-
-func insertTestData(db apid.DB) {
-
- txn, err := db.Begin()
- Expect(err).ShouldNot(HaveOccurred())
-
- for i := 0; i < 10; i++ {
- var rows []common.Row
- srvItems := common.Row{}
- result := strconv.FormatInt(int64(i), 10)
-
- scv := &common.ColumnVal{
- Value: "api_product_" + result,
- Type: 1,
- }
- srvItems["id"] = scv
-
- scv = &common.ColumnVal{
- Value: "{/**, /test}",
- Type: 1,
- }
- srvItems["api_resources"] = scv
-
- scv = &common.ColumnVal{
- Value: "{Env_0, Env_1}",
- Type: 1,
- }
- srvItems["environments"] = scv
-
- scv = &common.ColumnVal{
- Value: "Org_0",
- Type: 1,
- }
- srvItems["_change_selector"] = scv
-
- scv = &common.ColumnVal{
- Value: "tenant_id_xxxx",
- Type: 1,
- }
- srvItems["tenant_id"] = scv
- rows = append(rows, srvItems)
- res := insertAPIproducts(rows, txn)
- Expect(res).Should(BeTrue())
- }
-
- for i := 0; i < 10; i++ {
- var rows []common.Row
- srvItems := common.Row{}
- result := strconv.FormatInt(int64(i), 10)
-
- scv := &common.ColumnVal{
- Value: "developer_id_" + result,
- Type: 1,
- }
- srvItems["id"] = scv
-
- scv = &common.ColumnVal{
- Value: "test@apigee.com",
- Type: 1,
- }
- srvItems["email"] = scv
-
- scv = &common.ColumnVal{
- Value: "Active",
- Type: 1,
- }
- srvItems["status"] = scv
-
- scv = &common.ColumnVal{
- Value: "Apigee",
- Type: 1,
- }
- srvItems["firstName"] = scv
-
- scv = &common.ColumnVal{
- Value: "Google",
- Type: 1,
- }
- srvItems["lastName"] = scv
-
- scv = &common.ColumnVal{
- Value: "Org_0",
- Type: 1,
- }
- srvItems["_change_selector"] = scv
-
- scv = &common.ColumnVal{
- Value: "tenant_id_xxxx",
- Type: 1,
- }
- srvItems["tenant_id"] = scv
-
- rows = append(rows, srvItems)
- res := insertDevelopers(rows, txn)
- Expect(res).Should(BeTrue())
- }
-
- var j, k int
- for i := 0; i < 10; i++ {
- resulti := strconv.FormatInt(int64(i), 10)
- for j = k; j < 10 + k; j++ {
- var rows []common.Row
-
- srvItems := common.Row{}
- resultj := strconv.FormatInt(int64(j), 10)
-
- scv := &common.ColumnVal{
- Value: "application_id_" + resultj,
- Type: 1,
- }
- srvItems["id"] = scv
-
- scv = &common.ColumnVal{
- Value: "developer_id_" + resulti,
- Type: 1,
- }
- srvItems["developer_id"] = scv
-
- scv = &common.ColumnVal{
- Value: "approved",
- Type: 1,
- }
- srvItems["status"] = scv
-
- scv = &common.ColumnVal{
- Value: "http://apigee.com",
- Type: 1,
- }
- srvItems["callback_url"] = scv
-
- scv = &common.ColumnVal{
- Value: "Org_0",
- Type: 1,
- }
- srvItems["_change_selector"] = scv
-
- scv = &common.ColumnVal{
- Value: "tenant_id_xxxx",
- Type: 1,
- }
- srvItems["tenant_id"] = scv
- rows = append(rows, srvItems)
- res := insertApplications(rows, txn)
- Expect(res).Should(BeTrue())
- }
- k = j
- }
-
- for i := 0; i < 10; i++ {
- var rows []common.Row
- srvItems := common.Row{}
- result := strconv.FormatInt(int64(i), 10)
-
- scv := &common.ColumnVal{
- Value: "app_credential_" + result,
- Type: 1,
- }
- srvItems["id"] = scv
-
- scv = &common.ColumnVal{
- Value: "application_id_" + result,
- Type: 1,
- }
- srvItems["app_id"] = scv
-
- scv = &common.ColumnVal{
- Value: "approved",
- Type: 1,
- }
- srvItems["status"] = scv
-
- scv = &common.ColumnVal{
- Value: "Org_0",
- Type: 1,
- }
- srvItems["_change_selector"] = scv
-
- scv = &common.ColumnVal{
- Value: "tenant_id_xxxx",
- Type: 1,
- }
- srvItems["tenant_id"] = scv
- rows = append(rows, srvItems)
- res := insertCredentials(rows, txn)
- Expect(res).Should(BeTrue())
- }
-
- for i := 0; i < 10; i++ {
- var rows []common.Row
- srvItems := common.Row{}
- result := strconv.FormatInt(int64(i), 10)
-
- scv := &common.ColumnVal{
- Value: "api_product_" + result,
- Type: 1,
- }
- srvItems["apiprdt_id"] = scv
-
- scv = &common.ColumnVal{
- Value: "application_id_" + result,
- Type: 1,
- }
- srvItems["app_id"] = scv
-
- scv = &common.ColumnVal{
- Value: "app_credential_" + result,
- Type: 1,
- }
- srvItems["appcred_id"] = scv
- scv = &common.ColumnVal{
- Value: "approved",
- Type: 1,
- }
- srvItems["status"] = scv
- scv = &common.ColumnVal{
- Value: "Org_0",
- Type: 1,
- }
- srvItems["_change_selector"] = scv
-
- scv = &common.ColumnVal{
- Value: "tenant_id_xxxx",
- Type: 1,
- }
- srvItems["tenant_id"] = scv
- rows = append(rows, srvItems)
- res := insertAPIProductMappers(rows, txn)
- Expect(res).Should(BeTrue())
- }
- txn.Exec("INSERT INTO DATA_SCOPE (id, _change_selector, apid_cluster_id, scope, org, env) " +
- "VALUES" +
- "($1,$2,$3,$4,$5,$6)",
- "ABCDE",
- "some_cluster_id",
- "some_cluster_id",
- "tenant_id_xxxx",
- "test_org0",
- "Env_0",
- );
- txn.Exec("INSERT INTO DATA_SCOPE (id, _change_selector, apid_cluster_id, scope, org, env) " +
- "VALUES" +
- "($1,$2,$3,$4,$5,$6)",
- "XYZ",
- "test_org0",
- "somecluster_id",
- "tenant_id_0",
- "test_org0",
- "Env_0",
- );
- log.Info("Inserted DATA_SCOPE for test")
- txn.Commit()
- var count int64
- db.QueryRow("select count(*) from data_scope").Scan(&count);
- log.Info("Found ", count)
-
-}