// 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 (
	"encoding/json"
	"github.com/apid/apidVerifyApiKey/common"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"io/ioutil"
	"net/http"
	"net/url"
	"strconv"
	"time"
)

const (
	apiTestUrl = "http://127.0.0.1:9000"
)

var _ = Describe("API Tests", func() {
	var apiMan *ApiManager
	testCount := 0
	client := &http.Client{}
	dbMan := &DummyDbMan{}
	var attrs []common.Attribute
	var testId string
	clientGet := func(path string, pars map[string][]string) (int, []byte) {
		uri, err := url.Parse(apiTestUrl + path)
		Expect(err).Should(Succeed())
		query := url.Values(pars)
		uri.RawQuery = query.Encode()
		httpReq, err := http.NewRequest("GET", uri.String(), nil)
		Expect(err).Should(Succeed())
		res, err := client.Do(httpReq)
		Expect(err).Should(Succeed())
		defer res.Body.Close()
		responseBody, err := ioutil.ReadAll(res.Body)
		Expect(err).Should(Succeed())
		return res.StatusCode, responseBody
	}

	BeforeEach(func() {
		testCount++
		testId = "test-" + strconv.Itoa(testCount)
		apiMan = &ApiManager{
			DbMan:            dbMan,
			AccessEntityPath: AccessEntityPath + strconv.Itoa(testCount),
			apiInitialized:   false,
		}
		attrs = setAttrs(dbMan, testId)
		apiMan.InitAPI()
		time.Sleep(100 * time.Millisecond)
	})

	It("ApiProduct", func() {
		testProd := []common.ApiProduct{
			{
				Id:            testId,
				Name:          "apstest",
				DisplayName:   "apstest",
				Description:   "",
				ApiResources:  "{/**}",
				ApprovalType:  "AUTO",
				Scopes:        `{foo,bar}`,
				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",
			},
		}

		expected := ApiProductSuccessResponse{
			ApiProduct: &ApiProductDetails{
				ApiProxies:     []string{"aps", "perfBenchmark"},
				ApiResources:   []string{"/**"},
				ApprovalType:   testProd[0].ApprovalType,
				Attributes:     attrs,
				CreatedAt:      testProd[0].CreatedAt,
				CreatedBy:      testProd[0].CreatedBy,
				Description:    testProd[0].Description,
				DisplayName:    testProd[0].DisplayName,
				Environments:   []string{"prod", "test"},
				ID:             testProd[0].Id,
				LastModifiedAt: testProd[0].UpdatedAt,
				LastModifiedBy: testProd[0].UpdatedBy,
				Name:           testProd[0].Name,
				QuotaInterval:  testProd[0].QuotaInterval,
				QuotaLimit:     10000000,
				QuotaTimeUnit:  testProd[0].QuotaTimeUnit,
				Scopes:         []string{"foo", "bar"},
			},
			Organization:             "test-org",
			PrimaryIdentifierType:    IdentifierAppName,
			PrimaryIdentifierValue:   "test-app",
			SecondaryIdentifierType:  IdentifierDeveloperId,
			SecondaryIdentifierValue: "test-dev",
		}

		testData := [][]common.ApiProduct{
			testProd,
			nil,
			testProd,
			testProd,
		}

		testPars := []map[string][]string{
			// positive
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppName:      {"test-app"},
				IdentifierDeveloperId:  {"test-dev"},
			},
			// negative
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppName:      {"test-app"},
				IdentifierDeveloperId:  {"test-dev"},
			},
			{
				IdentifierAppName:     {"test-app"},
				IdentifierDeveloperId: {"test-dev"},
			},
			{
				IdentifierDeveloperId: {"test-dev"},
			},
		}

		results := [][]interface{}{
			{http.StatusOK, expected},
			{http.StatusNotFound, nil},
			{http.StatusBadRequest, nil},
			{http.StatusBadRequest, nil},
		}

		for i, data := range testData {
			dbMan.apiProducts = data
			code, body := clientGet(apiMan.AccessEntityPath+EndpointApiProduct, testPars[i])
			Expect(code).Should(Equal(results[i][0]))
			if results[i][1] != nil {
				var res ApiProductSuccessResponse
				Expect(json.Unmarshal(body, &res)).Should(Succeed())
				Expect(res).Should(Equal(results[i][1]))
			}
		}

	})

	It("Apps", func() {
		testApp := []common.App{
			{
				Id:          testId,
				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",
			},
		}

		testComApp := []common.App{
			{
				Id:          testId,
				TenantId:    "515211e9",
				Name:        "apstest",
				DisplayName: "apstest",
				AccessType:  "READ",
				CallbackUrl: "https://www.google.com",
				Status:      "APPROVED",
				AppFamily:   "default",
				CompanyId:   "a94f75e2-69b0-44af-8776-155df7c7d22e",
				DeveloperId: "",
				ParentId:    "a94f75e2-69b0-44af-8776-155df7c7d22e",
				Type:        "COMPANY",
				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",
			},
		}

		testProductNames := []string{"foo", "bar"}
		testStatus := "test-status"
		testCreds := []common.AppCredential{
			{
				Id:             testId,
				TenantId:       "515211e9",
				ConsumerSecret: "secret1",
				AppId:          testId,
				MethodType:     "GET",
				Status:         "APPROVED",
				IssuedAt:       "2017-08-18 22:13:18.35+00:00",
				ExpiresAt:      "2018-08-18 22:13:18.35+00:00",
				AppStatus:      "APPROVED",
				Scopes:         "{foo,bar}",
				CreatedAt:      "2017-08-18 22:13:18.35+00:00",
				CreatedBy:      "-NA-",
				UpdatedAt:      "2017-08-18 22:13:18.352+00:00",
				UpdatedBy:      "-NA-",
			},
		}
		expected := AppSuccessResponse{
			App: &AppDetails{
				AccessType:  testApp[0].AccessType,
				ApiProducts: testProductNames,
				AppCredentials: []*CredentialDetails{
					{
						ApiProductReferences: testProductNames,
						AppID:                testCreds[0].AppId,
						AppStatus:            testApp[0].Status,
						Attributes:           attrs,
						ConsumerKey:          testCreds[0].Id,
						ConsumerSecret:       testCreds[0].ConsumerSecret,
						ExpiresAt:            testCreds[0].ExpiresAt,
						IssuedAt:             testCreds[0].IssuedAt,
						MethodType:           testCreds[0].MethodType,
						Scopes:               []string{"foo", "bar"},
						Status:               testCreds[0].Status,
					},
				},
				AppFamily:       testApp[0].AppFamily,
				AppParentID:     testApp[0].ParentId,
				AppParentStatus: testStatus,
				AppType:         testApp[0].Type,
				Attributes:      attrs,
				CallbackUrl:     testApp[0].CallbackUrl,
				CreatedAt:       testApp[0].CreatedAt,
				CreatedBy:       testApp[0].CreatedBy,
				DisplayName:     testApp[0].DisplayName,
				Id:              testApp[0].Id,
				LastModifiedAt:  testApp[0].UpdatedAt,
				LastModifiedBy:  testApp[0].UpdatedBy,
				Name:            testApp[0].Name,
				Status:          testApp[0].Status,
			},
			Organization:             "test-org",
			PrimaryIdentifierType:    IdentifierAppName,
			PrimaryIdentifierValue:   "test-app",
			SecondaryIdentifierType:  IdentifierDeveloperId,
			SecondaryIdentifierValue: "test-dev",
		}

		expectedComApp := AppSuccessResponse{
			App: &AppDetails{
				AccessType:  testComApp[0].AccessType,
				ApiProducts: testProductNames,
				AppCredentials: []*CredentialDetails{
					{
						ApiProductReferences: testProductNames,
						AppID:                testCreds[0].AppId,
						AppStatus:            testComApp[0].Status,
						Attributes:           attrs,
						ConsumerKey:          testCreds[0].Id,
						ConsumerSecret:       testCreds[0].ConsumerSecret,
						ExpiresAt:            testCreds[0].ExpiresAt,
						IssuedAt:             testCreds[0].IssuedAt,
						MethodType:           testCreds[0].MethodType,
						Scopes:               []string{"foo", "bar"},
						Status:               testCreds[0].Status,
					},
				},
				AppFamily:       testComApp[0].AppFamily,
				AppParentID:     "testcompanyhflxv",
				AppParentStatus: testStatus,
				AppType:         testComApp[0].Type,
				Attributes:      attrs,
				CallbackUrl:     testComApp[0].CallbackUrl,
				CreatedAt:       testComApp[0].CreatedAt,
				CreatedBy:       testComApp[0].CreatedBy,
				DisplayName:     testComApp[0].DisplayName,
				Id:              testComApp[0].Id,
				LastModifiedAt:  testComApp[0].UpdatedAt,
				LastModifiedBy:  testComApp[0].UpdatedBy,
				Name:            testComApp[0].Name,
				Status:          testComApp[0].Status,
			},
			Organization:             "test-org",
			PrimaryIdentifierType:    IdentifierAppName,
			PrimaryIdentifierValue:   "test-app",
			SecondaryIdentifierType:  IdentifierDeveloperId,
			SecondaryIdentifierValue: "test-dev",
		}

		testData := [][]common.App{
			testApp,
			testComApp,
			nil,
			testApp,
			testApp,
		}

		testPars := []map[string][]string{
			// positive
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppName:      {"test-app"},
				IdentifierDeveloperId:  {"test-dev"},
			},
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppName:      {"test-app"},
				IdentifierDeveloperId:  {"test-dev"},
			},
			// negative
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppName:      {"test-app"},
				IdentifierDeveloperId:  {"test-dev"},
			},
			{
				IdentifierAppName:     {"test-app"},
				IdentifierDeveloperId: {"test-dev"},
			},
			{
				IdentifierDeveloperId: {"test-dev"},
			},
		}

		results := [][]interface{}{
			{http.StatusOK, expected},
			{http.StatusOK, expectedComApp},
			{http.StatusNotFound, nil},
			{http.StatusBadRequest, nil},
			{http.StatusBadRequest, nil},
		}

		dbMan.apiProductNames = testProductNames
		dbMan.status = testStatus
		dbMan.appCredentials = testCreds
		for i, data := range testData {
			dbMan.apps = data
			dbMan.comNames = []string{"testcompanyhflxv"}
			code, body := clientGet(apiMan.AccessEntityPath+EndpointApp, testPars[i])
			Expect(code).Should(Equal(results[i][0]))
			if results[i][1] != nil {
				var res AppSuccessResponse
				Expect(json.Unmarshal(body, &res)).Should(Succeed())
				Expect(res).Should(Equal(results[i][1]))
			}
		}

	})

	It("Company", func() {
		testCom := []common.Company{
			{
				Id:          testId,
				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",
			},
		}

		testAppNames := []string{"foo", "bar"}

		expected := CompanySuccessResponse{
			Company: &CompanyDetails{
				Apps:           testAppNames,
				Attributes:     attrs,
				CreatedAt:      testCom[0].CreatedAt,
				CreatedBy:      testCom[0].CreatedBy,
				DisplayName:    testCom[0].DisplayName,
				ID:             testCom[0].Id,
				LastModifiedAt: testCom[0].UpdatedAt,
				LastModifiedBy: testCom[0].UpdatedBy,
				Name:           testCom[0].Name,
				Status:         testCom[0].Status,
			},
			Organization:           "test-org",
			PrimaryIdentifierType:  IdentifierAppId,
			PrimaryIdentifierValue: "test-app",
		}

		testData := [][]common.Company{
			testCom,
			nil,
			testCom,
			testCom,
		}

		testPars := []map[string][]string{
			// positive
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppId:        {"test-app"},
			},
			// negative
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppId:        {"test-app"},
			},
			{
				IdentifierAppId: {"test-app"},
			},
			{
				IdentifierDeveloperId: {"test-dev"},
			},
		}

		results := [][]interface{}{
			{http.StatusOK, expected},
			{http.StatusNotFound, nil},
			{http.StatusBadRequest, nil},
			{http.StatusBadRequest, nil},
		}

		dbMan.appNames = testAppNames

		for i, data := range testData {
			dbMan.companies = data
			code, body := clientGet(apiMan.AccessEntityPath+EndpointCompany, testPars[i])
			Expect(code).Should(Equal(results[i][0]))
			if results[i][1] != nil {
				var res CompanySuccessResponse
				Expect(json.Unmarshal(body, &res)).Should(Succeed())
				Expect(res).Should(Equal(results[i][1]))
			}
		}

	})

	It("Developer", func() {
		testDev := []common.Developer{
			{
				Id:                testId,
				TenantId:          "515211e9",
				UserName:          "haoming",
				FirstName:         "haoming",
				LastName:          "zhang",
				Password:          "111",
				Email:             "bar@google.com",
				Status:            "ACTIVE",
				EncryptedPassword: "222",
				Salt:              "333",
				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",
			},
		}

		testAppNames := []string{"foo", "bar"}
		testComNames := []string{"foo", "bar"}

		expected := DeveloperSuccessResponse{
			Developer: &DeveloperDetails{
				Apps:           testAppNames,
				Attributes:     attrs,
				Companies:      testComNames,
				CreatedAt:      testDev[0].CreatedAt,
				CreatedBy:      testDev[0].CreatedBy,
				Email:          testDev[0].Email,
				FirstName:      testDev[0].FirstName,
				ID:             testDev[0].Id,
				LastModifiedAt: testDev[0].UpdatedAt,
				LastModifiedBy: testDev[0].UpdatedBy,
				LastName:       testDev[0].LastName,
				Password:       testDev[0].Password,
				Status:         testDev[0].Status,
				UserName:       testDev[0].UserName,
			},
			Organization:           "test-org",
			PrimaryIdentifierType:  IdentifierAppId,
			PrimaryIdentifierValue: "test-app",
		}

		testData := [][]common.Developer{
			testDev,
			nil,
			testDev,
			testDev,
		}

		testPars := []map[string][]string{
			// positive
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppId:        {"test-app"},
			},
			// negative
			{
				IdentifierOrganization: {"test-org"},
				IdentifierAppId:        {"test-app"},
			},
			{
				IdentifierAppId: {"test-app"},
			},
			{
				IdentifierDeveloperId: {"test-dev"},
			},
		}

		results := [][]interface{}{
			{http.StatusOK, expected},
			{http.StatusNotFound, nil},
			{http.StatusBadRequest, nil},
			{http.StatusBadRequest, nil},
		}

		dbMan.appNames = testAppNames
		dbMan.comNames = testComNames

		for i, data := range testData {
			dbMan.developers = data
			code, body := clientGet(apiMan.AccessEntityPath+EndpointDeveloper, testPars[i])
			Expect(code).Should(Equal(results[i][0]))
			if results[i][1] != nil {
				var res DeveloperSuccessResponse
				Expect(json.Unmarshal(body, &res)).Should(Succeed())
				Expect(res).Should(Equal(results[i][1]))
			}
		}

	})

	It("AppCredential", func() {
		testAppCred := []common.AppCredential{
			{
				Id:             testId,
				TenantId:       "515211e9",
				ConsumerSecret: "secret1",
				AppId:          testId,
				MethodType:     "GET",
				Status:         "APPROVED",
				IssuedAt:       "2017-08-18 22:13:18.35+00:00",
				ExpiresAt:      "2018-08-18 22:13:18.35+00:00",
				AppStatus:      "APPROVED",
				Scopes:         "{foo,bar}",
				CreatedAt:      "2017-08-18 22:13:18.35+00:00",
				CreatedBy:      "-NA-",
				UpdatedAt:      "2017-08-18 22:13:18.352+00:00",
				UpdatedBy:      "-NA-",
			},
		}
		testApp := []common.App{
			{
				Id:          testId,
				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",
			},
		}

		testProductNames := []string{"foo", "bar"}
		testStatus := "test-status"

		expected := AppCredentialSuccessResponse{
			AppCredential: &AppCredentialDetails{
				AppID:       testAppCred[0].AppId,
				AppName:     testApp[0].Name,
				Attributes:  attrs,
				ConsumerKey: testAppCred[0].Id,
				ConsumerKeyStatus: &ConsumerKeyStatusDetails{
					AppCredential: &CredentialDetails{
						ApiProductReferences: testProductNames,
						AppID:                testAppCred[0].AppId,
						AppStatus:            testApp[0].Status,
						Attributes:           attrs,
						ConsumerKey:          testAppCred[0].Id,
						ConsumerSecret:       testAppCred[0].ConsumerSecret,
						ExpiresAt:            testAppCred[0].ExpiresAt,
						IssuedAt:             testAppCred[0].IssuedAt,
						MethodType:           testAppCred[0].MethodType,
						Scopes:               []string{"foo", "bar"},
						Status:               testAppCred[0].Status,
					},
					AppID:           testAppCred[0].AppId,
					AppName:         testApp[0].Name,
					AppStatus:       testApp[0].Status,
					AppType:         testApp[0].Type,
					DeveloperID:     testApp[0].DeveloperId,
					DeveloperStatus: testStatus,
					IsValidKey:      true,
				},
				ConsumerSecret: testAppCred[0].ConsumerSecret,
				DeveloperID:    testApp[0].DeveloperId,
				RedirectUris:   []string{testApp[0].CallbackUrl},
				Scopes:         []string{"foo", "bar"},
				Status:         testAppCred[0].Status,
			},
			Organization:           "test-org",
			PrimaryIdentifierType:  IdentifierConsumerKey,
			PrimaryIdentifierValue: "test-key",
		}

		testData := [][]common.AppCredential{
			testAppCred,
			nil,
			testAppCred,
			testAppCred,
		}

		testPars := []map[string][]string{
			// positive
			{
				IdentifierOrganization: {"test-org"},
				IdentifierConsumerKey:  {"test-key"},
			},
			// negative
			{
				IdentifierOrganization: {"test-org"},
				IdentifierConsumerKey:  {"test-key"},
			},
			{
				IdentifierConsumerKey: {"test-key"},
			},
			{
				IdentifierDeveloperId: {"test-dev"},
			},
		}

		results := [][]interface{}{
			{http.StatusOK, expected},
			{http.StatusNotFound, nil},
			{http.StatusBadRequest, nil},
			{http.StatusBadRequest, nil},
		}

		dbMan.apiProductNames = testProductNames
		dbMan.status = testStatus
		dbMan.apps = testApp
		for i, data := range testData {
			dbMan.appCredentials = data
			code, body := clientGet(apiMan.AccessEntityPath+EndpointAppCredentials, testPars[i])
			Expect(code).Should(Equal(results[i][0]))
			if results[i][1] != nil {
				var res AppCredentialSuccessResponse
				Expect(json.Unmarshal(body, &res)).Should(Succeed())
				Expect(res).Should(Equal(results[i][1]))
			}
		}
	})

	It("CompanyDeveloper", func() {
		testDev := []common.CompanyDeveloper{
			{
				TenantId:    "515211e9",
				CompanyId:   "a94f75e2-69b0-44af-8776-155df7c7d22e",
				DeveloperId: "590f33bf-f05c-48c1-bb93-183759bd9ee1",
				Roles:       "{foo,bar}",
				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",
			},
		}

		testComNames := []string{"foo"}
		testEmail := "haoming@apid.git"

		expected := CompanyDevelopersSuccessResponse{
			CompanyDevelopers: []*CompanyDeveloperDetails{
				{
					CompanyName:    testComNames[0],
					CreatedAt:      testDev[0].CreatedAt,
					CreatedBy:      testDev[0].CreatedBy,
					DeveloperEmail: testEmail,
					LastModifiedAt: testDev[0].UpdatedAt,
					LastModifiedBy: testDev[0].UpdatedBy,
					Roles:          []string{"foo", "bar"},
				},
			},
			Organization:           "test-org",
			PrimaryIdentifierType:  IdentifierCompanyName,
			PrimaryIdentifierValue: "test-com",
		}

		testData := [][]common.CompanyDeveloper{
			testDev,
			nil,
			testDev,
			testDev,
		}

		testPars := []map[string][]string{
			// positive
			{
				IdentifierOrganization: {"test-org"},
				IdentifierCompanyName:  {"test-com"},
			},
			// negative
			{
				IdentifierOrganization: {"test-org"},
				IdentifierCompanyName:  {"test-com"},
			},
			{
				IdentifierCompanyName: {"test-com"},
			},
			{
				IdentifierDeveloperId: {"test-dev"},
			},
		}

		results := [][]interface{}{
			{http.StatusOK, expected},
			{http.StatusNotFound, nil},
			{http.StatusBadRequest, nil},
			{http.StatusBadRequest, nil},
		}

		dbMan.comNames = testComNames
		dbMan.email = testEmail

		for i, data := range testData {
			dbMan.companyDevelopers = data
			code, body := clientGet(apiMan.AccessEntityPath+EndpointCompanyDeveloper, testPars[i])
			Expect(code).Should(Equal(results[i][0]))
			if results[i][1] != nil {
				var res CompanyDevelopersSuccessResponse
				Expect(json.Unmarshal(body, &res)).Should(Succeed())
				Expect(res).Should(Equal(results[i][1]))
			}
		}

	})
})

func setAttrs(dbMan *DummyDbMan, id string) []common.Attribute {
	dbMan.attrs = map[string][]common.Attribute{
		id: {
			{
				Name:  "foo",
				Value: "bar",
			},
			{
				Name:  "bar",
				Value: "foo",
			},
		},
	}
	return dbMan.attrs[id]
}
