// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package accessEntity

import (
	"github.com/apid/apid-core"
	"github.com/apid/apidApiMetadata/common"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"io/ioutil"
	"sync"
)

const (
	fileDataTest = "data_test.sql"
	// SQL Injection
	// If select foo from bar where id in (' + condition + ') is used,
	// the hacked sql would be like "select XXX from XXX where id in ('1') or ('1'=='1');"
	sqlInjectionStmt = "1') or ('1'=='1"
)

var _ = Describe("DataTest", func() {

	Context("query Db to get entities", func() {
		var dataTestTempDir string
		var dbMan *DbManager
		BeforeEach(func() {
			var err error
			dataTestTempDir, err = ioutil.TempDir(testTempDirBase, "sqlite3")
			Expect(err).NotTo(HaveOccurred())
			services.Config().Set("local_storage_path", dataTestTempDir)

			dbMan = &DbManager{
				DbManager: common.DbManager{
					Data:  services.Data(),
					DbMux: sync.RWMutex{},
				},
			}
			dbMan.SetDbVersion(dataTestTempDir)
			setupTestDb(dbMan.GetDb())
		})

		Describe("Get structs", func() {
			It("should get apiProducts", func() {
				testData := [][]string{
					//positive tests
					{IdentifierApiProductName, "apstest", "", "", "apid-haoming"},
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", "apid-haoming"},
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", IdentifierApiResource, "/**", "apid-haoming"},
					{IdentifierAppName, "apstest", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "abcd", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "abcd", IdentifierApiResource, "/**", "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierDeveloperId, "e41f04e8-9d3f-470a-8bfd-c7939945896c", "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierDeveloperEmail, "bar@google.com", "apid-haoming"},
					{IdentifierAppName, "testappahhis", IdentifierCompanyName, "testcompanyhflxv", "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierApiResource, "/**", "apid-haoming"},
					// negative tests
					{IdentifierApiProductName, "apstest", "", "", "non-existent"},
					{IdentifierApiProductName, "non-existent", "", "", "apid-haoming"},
					{IdentifierAppId, "non-existent", "", "", "apid-haoming"},
					{IdentifierAppId, "non-existent", IdentifierApiResource, "non-existent", "apid-haoming"},
					{IdentifierAppName, "non-existent", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "non-existent", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "non-existent", IdentifierApiResource, "non-existent", "apid-haoming"},
					{IdentifierAppName, "non-existent", IdentifierDeveloperId, "non-existent", "apid-haoming"},
					{IdentifierAppName, "non-existent", IdentifierDeveloperEmail, "non-existent", "apid-haoming"},
					{IdentifierAppName, "non-existent", IdentifierCompanyName, "non-existent", "apid-haoming"},
					{IdentifierAppName, "non-existent", IdentifierApiResource, "non-existent", "apid-haoming"},
					// SQL Injection
					{IdentifierApiProductName, "apstest", "", "", sqlInjectionStmt},
					{IdentifierApiProductName, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierAppId, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierAppName, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierConsumerKey, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierDeveloperId, sqlInjectionStmt, "apid-haoming"},
					{IdentifierAppName, "testappahhis", IdentifierDeveloperEmail, sqlInjectionStmt, "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierCompanyName, sqlInjectionStmt, "apid-haoming"},
				}

				var expectedDevApiProd = common.ApiProduct{
					Id:            "b7e0970c-4677-4b05-8105-5ea59fdcf4e7",
					Name:          "apstest",
					DisplayName:   "apstest",
					Description:   "",
					ApiResources:  "{/**}",
					ApprovalType:  "AUTO",
					Scopes:        `{""}`,
					Proxies:       `{aps,perfBenchmark}`,
					Environments:  `{prod,test}`,
					Quota:         "10000000",
					QuotaTimeUnit: "MINUTE",
					QuotaInterval: 1,
					CreatedAt:     "2017-08-18 22:12:49.363+00:00",
					CreatedBy:     "haoming@apid.git",
					UpdatedAt:     "2017-08-18 22:26:50.153+00:00",
					UpdatedBy:     "haoming@apid.git",
					TenantId:      "515211e9",
				}

				var expectedComApiProd = common.ApiProduct{
					Id:            "fea8a6d5-8d34-477f-ac82-c397eaec06af",
					Name:          "testproductsdljnkpt",
					DisplayName:   "testproductsdljnkpt",
					Description:   "",
					ApiResources:  "{/res1}",
					ApprovalType:  "AUTO",
					Scopes:        `{}`,
					Proxies:       `{}`,
					Environments:  `{test}`,
					Quota:         "",
					QuotaTimeUnit: "",
					QuotaInterval: 0,
					CreatedAt:     "2017-11-02 16:00:15.608+00:00",
					CreatedBy:     "haoming@apid.git",
					UpdatedAt:     "2017-11-02 16:00:18.125+00:00",
					UpdatedBy:     "haoming@apid.git",
					TenantId:      "515211e9",
				}

				results := [][]common.ApiProduct{
					{expectedDevApiProd},
					{expectedDevApiProd},
					{expectedDevApiProd},
					{expectedDevApiProd},
					{expectedDevApiProd},
					{expectedDevApiProd},
					{expectedDevApiProd},
					{expectedDevApiProd},
					{expectedComApiProd},
					{expectedDevApiProd},
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
				}

				for i, data := range testData {
					priKey, priVal, secKey, secVal, org := data[0], data[1], data[2], data[3], data[4]
					prods, err := dbMan.GetApiProducts(org, priKey, priVal, secKey, secVal)
					Expect(err).Should(Succeed())
					if len(results[i]) > 0 {
						Expect(prods).Should(Equal(results[i]))
					} else {
						Expect(prods).Should(BeZero())
					}
				}
			})

			It("should get apps", func() {
				testData := [][]string{
					//positive tests
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", "apid-haoming"},
					{IdentifierAppName, "apstest", "", "", "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierDeveloperId, "e41f04e8-9d3f-470a-8bfd-c7939945896c", "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierDeveloperEmail, "bar@google.com", "apid-haoming"},
					{IdentifierAppName, "testappahhis", IdentifierCompanyName, "testcompanyhflxv", "apid-haoming"},
					{IdentifierConsumerKey, "abcd", "", "", "apid-haoming"},
					// negative tests
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", "non-existent"},
					{IdentifierAppId, "non-existent", "", "", "apid-haoming"},
					{IdentifierAppName, "non-existent", "", "", "apid-haoming"},
					{IdentifierAppName, "non-existent", IdentifierDeveloperId, "non-existent", "apid-haoming"},
					{IdentifierAppName, "non-existent", IdentifierDeveloperEmail, "non-existent", "apid-haoming"},
					{IdentifierAppName, "non-existent", IdentifierCompanyName, "non-existent", "apid-haoming"},
					{IdentifierConsumerKey, "non-existent", "", "", "apid-haoming"},
					// SQL Injection
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", sqlInjectionStmt},
					{IdentifierAppId, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierAppName, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierDeveloperId, sqlInjectionStmt, "apid-haoming"},
					{IdentifierAppName, "apstest", IdentifierDeveloperEmail, sqlInjectionStmt, "apid-haoming"},
					{IdentifierAppName, "testappahhis", IdentifierCompanyName, sqlInjectionStmt, "apid-haoming"},
					{IdentifierConsumerKey, sqlInjectionStmt, "", "", "apid-haoming"},
				}

				var expectedDevApp = common.App{
					Id:          "408ad853-3fa0-402f-90ee-103de98d71a5",
					TenantId:    "515211e9",
					Name:        "apstest",
					DisplayName: "apstest",
					AccessType:  "READ",
					CallbackUrl: "https://www.google.com",
					Status:      "APPROVED",
					AppFamily:   "default",
					CompanyId:   "",
					DeveloperId: "e41f04e8-9d3f-470a-8bfd-c7939945896c",
					ParentId:    "e41f04e8-9d3f-470a-8bfd-c7939945896c",
					Type:        "DEVELOPER",
					CreatedAt:   "2017-08-18 22:13:18.325+00:00",
					CreatedBy:   "haoming@apid.git",
					UpdatedAt:   "2017-08-18 22:13:18.325+00:00",
					UpdatedBy:   "haoming@apid.git",
				}

				var expectedComApp = common.App{
					Id:          "35608afe-2715-4064-bb4d-3cbb4e82c474",
					TenantId:    "515211e9",
					Name:        "testappahhis",
					DisplayName: "testappahhis",
					AccessType:  "READ",
					CallbackUrl: "",
					Status:      "APPROVED",
					AppFamily:   "default",
					CompanyId:   "a94f75e2-69b0-44af-8776-155df7c7d22e",
					DeveloperId: "",
					ParentId:    "a94f75e2-69b0-44af-8776-155df7c7d22e",
					Type:        "COMPANY",
					CreatedAt:   "2017-11-02 16:00:16.504+00:00",
					CreatedBy:   "haoming@apid.git",
					UpdatedAt:   "2017-11-02 16:00:16.504+00:00",
					UpdatedBy:   "haoming@apid.git",
				}

				results := [][]common.App{
					{expectedDevApp},
					{expectedDevApp},
					{expectedDevApp},
					{expectedDevApp},
					{expectedComApp},
					{expectedDevApp},
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
				}

				for i, data := range testData {
					priKey, priVal, secKey, secVal, org := data[0], data[1], data[2], data[3], data[4]
					apps, err := dbMan.GetApps(org, priKey, priVal, secKey, secVal)
					Expect(err).Should(Succeed())
					if len(results[i]) > 0 {
						Expect(apps).Should(Equal(results[i]))
					} else {
						Expect(apps).Should(BeZero())
					}
				}
			})

			It("should get Companies", func() {
				testData := [][]string{
					//positive tests
					{IdentifierAppId, "35608afe-2715-4064-bb4d-3cbb4e82c474", "", "", "apid-haoming"},
					{IdentifierCompanyName, "testcompanyhflxv", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "wxyz", "", "", "apid-haoming"},
					// negative tests
					{IdentifierAppId, "35608afe-2715-4064-bb4d-3cbb4e82c474", "", "", "non-existent"},
					{IdentifierAppId, "non-existent", "", "", "apid-haoming"},
					{IdentifierCompanyName, "non-existent", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "non-existent", "", "", "apid-haoming"},
					// SQL Injection
					{IdentifierAppId, "35608afe-2715-4064-bb4d-3cbb4e82c474", "", "", sqlInjectionStmt},
					{IdentifierAppId, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierCompanyName, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierConsumerKey, sqlInjectionStmt, "", "", "apid-haoming"},
				}

				var expectedCom = common.Company{
					Id:          "a94f75e2-69b0-44af-8776-155df7c7d22e",
					TenantId:    "515211e9",
					Name:        "testcompanyhflxv",
					DisplayName: "testcompanyhflxv",
					Status:      "ACTIVE",
					CreatedAt:   "2017-11-02 16:00:16.287+00:00",
					CreatedBy:   "haoming@apid.git",
					UpdatedAt:   "2017-11-02 16:00:16.287+00:00",
					UpdatedBy:   "haoming@apid.git",
				}

				results := [][]common.Company{
					{expectedCom},
					{expectedCom},
					{expectedCom},
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
				}

				for i, data := range testData {
					priKey, priVal, secKey, secVal, org := data[0], data[1], data[2], data[3], data[4]
					apps, err := dbMan.GetCompanies(org, priKey, priVal, secKey, secVal)
					Expect(err).Should(Succeed())
					if len(results[i]) > 0 {
						Expect(apps).Should(Equal(results[i]))
					} else {
						Expect(apps).Should(BeZero())
					}
				}
			})

			It("should get developers", func() {
				testData := [][]string{
					//positive tests
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "abcd", "", "", "apid-haoming"},
					{IdentifierDeveloperEmail, "bar@google.com", "", "", "apid-haoming"},
					{IdentifierDeveloperId, "e41f04e8-9d3f-470a-8bfd-c7939945896c", "", "", "apid-haoming"},

					// negative tests
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", "non-existent"},
					{IdentifierAppId, "non-existent", "", "", "apid-haoming"},
					{IdentifierConsumerKey, "non-existent", "", "", "apid-haoming"},
					{IdentifierDeveloperEmail, "non-existent", "", "", "apid-haoming"},
					{IdentifierDeveloperId, "non-existent", "", "", "apid-haoming"},
					// SQL Injection
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", sqlInjectionStmt},
					{IdentifierAppId, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierConsumerKey, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierDeveloperEmail, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierDeveloperId, sqlInjectionStmt, "", "", "apid-haoming"},
				}

				var expectedDev = common.Developer{
					Id:                "e41f04e8-9d3f-470a-8bfd-c7939945896c",
					TenantId:          "515211e9",
					UserName:          "haoming",
					FirstName:         "haoming",
					LastName:          "zhang",
					Password:          "",
					Email:             "bar@google.com",
					Status:            "ACTIVE",
					EncryptedPassword: "",
					Salt:              "",
					CreatedAt:         "2017-08-16 22:39:46.669+00:00",
					CreatedBy:         "foo@google.com",
					UpdatedAt:         "2017-08-16 22:39:46.669+00:00",
					UpdatedBy:         "foo@google.com",
				}

				results := [][]common.Developer{
					{expectedDev},
					{expectedDev},
					{expectedDev},
					{expectedDev},
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
				}

				for i, data := range testData {
					priKey, priVal, secKey, secVal, org := data[0], data[1], data[2], data[3], data[4]
					prods, err := dbMan.GetDevelopers(org, priKey, priVal, secKey, secVal)
					Expect(err).Should(Succeed())
					if len(results[i]) > 0 {
						Expect(prods).Should(Equal(results[i]))
					} else {
						Expect(prods).Should(BeZero())
					}
				}
			})

			It("should get appCredentials", func() {
				testData := [][]string{
					// positive tests
					{IdentifierConsumerKey, "abcd", "", "", "apid-haoming"},
					{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", "", "apid-haoming"},
					// negative tests
					{IdentifierConsumerKey, "abcd", "", "", "non-existent"},
					{IdentifierConsumerKey, "non-existent", "", "", "apid-haoming"},
					{IdentifierAppId, "non-existent", "", "", "apid-haoming"},
					// SQL Injection
					{IdentifierConsumerKey, "abcd", "", "", sqlInjectionStmt},
					{IdentifierConsumerKey, sqlInjectionStmt, "", "", "apid-haoming"},
					{IdentifierAppId, sqlInjectionStmt, "", "", "apid-haoming"},
				}

				var expectedCred = common.AppCredential{
					Id:             "abcd",
					TenantId:       "515211e9",
					ConsumerSecret: "secret1",
					AppId:          "408ad853-3fa0-402f-90ee-103de98d71a5",
					MethodType:     "",
					Status:         "APPROVED",
					IssuedAt:       "2017-08-18 22:13:18.35+00:00",
					ExpiresAt:      "",
					AppStatus:      "",
					Scopes:         "{}",
					CreatedAt:      "2017-08-18 22:13:18.35+00:00",
					CreatedBy:      "-NA-",
					UpdatedAt:      "2017-08-18 22:13:18.352+00:00",
					UpdatedBy:      "-NA-",
				}

				results := [][]common.AppCredential{
					{expectedCred},
					{expectedCred},
					nil,
					nil,
					nil,
					nil,
					nil,
					nil,
				}

				for i, data := range testData {
					priKey, priVal, secKey, secVal, org := data[0], data[1], data[2], data[3], data[4]
					prods, err := dbMan.GetAppCredentials(org, priKey, priVal, secKey, secVal)
					Expect(err).Should(Succeed())
					if len(results[i]) > 0 {
						Expect(prods).Should(Equal(results[i]))
					} else {
						Expect(prods).Should(BeZero())
					}
				}
			})

			It("should get CompanyDevelopers", func() {
				testData := [][]string{
					// positive tests
					{IdentifierCompanyName, "testcompanyhflxv", "", "", "apid-haoming"},
					// negative tests
					{IdentifierCompanyName, "testcompanyhflxv", "", "", "non-existent"},
					{IdentifierCompanyName, "non-existent", "", "", "apid-haoming"},
					// SQL Injection
					{IdentifierCompanyName, "testcompanyhflxv", "", "", sqlInjectionStmt},
					{IdentifierCompanyName, sqlInjectionStmt, "", "", "apid-haoming"},
				}

				var expectedComDev = common.CompanyDeveloper{
					TenantId:    "515211e9",
					CompanyId:   "a94f75e2-69b0-44af-8776-155df7c7d22e",
					DeveloperId: "590f33bf-f05c-48c1-bb93-183759bd9ee1",
					Roles:       "admin",
					CreatedAt:   "2017-11-02 16:00:16.287+00:00",
					CreatedBy:   "haoming@apid.git",
					UpdatedAt:   "2017-11-02 16:00:16.287+00:00",
					UpdatedBy:   "haoming@apid.git",
				}

				results := [][]common.CompanyDeveloper{
					{expectedComDev},
					nil,
					nil,
					nil,
					nil,
				}

				for i, data := range testData {
					priKey, priVal, secKey, secVal, org := data[0], data[1], data[2], data[3], data[4]
					prods, err := dbMan.GetCompanyDevelopers(org, priKey, priVal, secKey, secVal)
					Expect(err).Should(Succeed())
					if len(results[i]) > 0 {
						Expect(prods).Should(Equal(results[i]))
					} else {
						Expect(prods).Should(BeZero())
					}
				}
			})

		})

		Describe("utils", func() {
			It("GetApiProductNamesByConsumerKey", func() {
				data := "abcd"
				expected := []string{"apstest"}
				Expect(dbMan.GetApiProductNames(data, TypeConsumerKey)).Should(Equal(expected))

				data = "408ad853-3fa0-402f-90ee-103de98d71a5"
				expected = []string{"apstest"}
				Expect(dbMan.GetApiProductNames(data, TypeApp)).Should(Equal(expected))
			})

			It("GetAppNames", func() {
				data := "a94f75e2-69b0-44af-8776-155df7c7d22e"
				expected := []string{"testappahhis"}
				Expect(dbMan.GetAppNames(data, TypeCompany)).Should(Equal(expected))

				data = "e41f04e8-9d3f-470a-8bfd-c7939945896c"
				expected = []string{"apstest"}
				Expect(dbMan.GetAppNames(data, TypeDeveloper)).Should(Equal(expected))
			})

			It("GetComNames", func() {
				data := "8ba5b747-5104-4a40-89ca-a0a51798fe34"
				expected := []string{"DevCompany"}
				Expect(dbMan.GetComNames(data, TypeCompany)).Should(Equal(expected))
				data = "590f33bf-f05c-48c1-bb93-183759bd9ee1"
				expected = []string{"testcompanyhflxv"}
				Expect(dbMan.GetComNames(data, TypeDeveloper)).Should(Equal(expected))
			})

			It("GetDevEmailByDevId", func() {
				data := "e41f04e8-9d3f-470a-8bfd-c7939945896c"
				expected := "bar@google.com"
				Expect(dbMan.GetDevEmailByDevId(data)).Should(Equal(expected))
			})

			It("GetStatus", func() {
				data := "e41f04e8-9d3f-470a-8bfd-c7939945896c"
				expected := "ACTIVE"
				Expect(dbMan.GetStatus(data, AppTypeDeveloper)).Should(Equal(expected))
				data = "8ba5b747-5104-4a40-89ca-a0a51798fe34"
				expected = "ACTIVE"
				Expect(dbMan.GetStatus(data, AppTypeCompany)).Should(Equal(expected))
			})

		})

	})

})

func setupTestDb(db apid.DB) {
	bytes, err := ioutil.ReadFile(fileDataTest)
	Expect(err).Should(Succeed())
	query := string(bytes)
	_, err = db.Exec(query)
	Expect(err).Should(Succeed())
}
