package e2e

func ExecOpenApiApiKeyCase() {
	OpenApi_CreateApiKeyInOrg_Normal()
	OpenApi_CreateApiKeyInOrg_InvalidRole()
	OpenApi_CreateApiKeyInOrg_NonOrgOwnerCanNotCreate()
	OpenApi_CreateKeyInProject_Normal()
	OpenApi_CreateApiKeyInProject_InvalidRole()
	OpenApi_CreateApiKeyInProject_NonOrgProjectOwnerCanNotCreate()
	OpenApi_GetApiKey()
	OpenApi_ListApiKeys()
	OpenApi_PatchApiKey_BlankRoleAndName()
}

func OpenApi_CreateApiKeyInOrg_Normal() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgOwnerKey

	body := `{
		"displayName": "e2e: create api key in org",
		"role": "org:owner"
	}`

	code, data, err := RestyExec("POST", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "CreateKeyInOrg_Normal", CaseDetail{
		Url:       url,
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 200,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_CreateApiKeyInOrg_InvalidRole() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgOwnerKey

	body := `{
		"displayName": "e2e: create api key in org",
		"role": "project:owner"
	}`

	code, data, err := RestyExec("POST", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "CreateKeyInOrg_InvalidRole", CaseDetail{
		Url:       url,
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 400,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_CreateApiKeyInOrg_NonOrgOwnerCanNotCreate() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgMemberKey

	body := `{
		"displayName": "e2e: create api key in org",
		"role": "org:owner"
	}`

	code, data, err := RestyExec("POST", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "CreateKeyInOrg_NonOrgOwnerCanNotCreate", CaseDetail{
		Url:       url,
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 403,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_CreateKeyInProject_Normal() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgOwnerKey

	body := `{
		"displayName": "e2e: create api key in project",
		"projectId": 3199935,
		"role": "project:owner"
	}`

	code, data, err := RestyExec("POST", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "CreateKeyInProject_Normal", CaseDetail{
		Url:       url,
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 200,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_CreateApiKeyInProject_InvalidRole() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgOwnerKey

	body := `{
		"displayName": "e2e: create api key in project",
		"projectId": 3199935,
		"role": "org:owner"
	}`

	code, data, err := RestyExec("POST", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "CreateKeyInProject_InvalidRole", CaseDetail{
		Url:       url,
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 400,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_CreateApiKeyInProject_NonOrgProjectOwnerCanNotCreate() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgMemberKey

	body := `{
		"displayName": "e2e: create api key in project",
		"projectId": 3199935,
		"role": "project:owner"
	}`

	code, data, err := RestyExec("POST", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "CreateKeyInOrg_NonOrgProjectOwnerCanNotCreate", CaseDetail{
		Url:       url,
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 403,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_GetApiKey() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys/C2DKHJE0"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgOwnerKey

	code, data, err := RestyExec("GET", url, header, "")
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "GetApiKey", CaseDetail{
		Url:       url,
		ReqHeader: header,
		Pass:      code == 200,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_ListApiKeys() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys?pageSize=3"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgOwnerKey

	code, data, err := RestyExec("GET", url, header, "")
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "ListApiKeys", CaseDetail{
		Url:       url,
		ReqHeader: header,
		Pass:      code == 200,
		RspCode:   code,
		RspData:   data,
	})
}

func OpenApi_PatchApiKey_BlankRoleAndName() {
	url := DevIamOpenApiHost + "/v1beta1/apikeys/C2DKHJE0"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header[DigestAuthUserHeader] = orgOwnerKey

	body := `{
		"displayName": "",
    	"role": ""
	}`

	code, data, err := RestyExec("PATCH", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("OpenApi_ApiKey", "PatchApiKey_BlankRoleAndName", CaseDetail{
		Url:       url,
		ReqHeader: header,
		Pass:      code == 400,
		RspCode:   code,
		RspData:   data,
	})
}
