/******************************************************************************
 * Copyright (c)  2022 PingCAP                                                *
 * 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.                                             *
 ******************************************************************************/

/*******************************************************************************
 * @File: clusterapi_test.go
 * @Description:
 * @Author: jiangxunyu@pingcap.com
 * @Version: 1.0.0
 * @Date: 2022/6/30 18:34
*******************************************************************************/

package globalapi

import (
	"net/http"
	"net/http/httptest"
	"net/url"
	"testing"

	"github.com/tidbcloud/observability/pkg/common/structs"

	"github.com/stretchr/testify/assert"

	"github.com/gin-gonic/gin"
)

func Test_CreateCluster(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodPost,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	CreateCluster(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_DetailCluster(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	DetailCluster(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_DeleteCluster(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodDelete,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	DeleteCluster(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_PauseCluster(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodPut,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	PauseCluster(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_ResumeCluster(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodPut,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	ResumeCluster(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_QueryClusters(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	QueryClusters(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_ModifyMonitorSpec(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodPut,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	ModifyMonitorSpec(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_ModifyMonitorMode(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodPut,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	ModifyMonitorMode(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func Test_ModifyAgentObserved(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodPost,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	ModifyAgentObserved(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func TestModifyMonitorStorage(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodPost,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	ModifyMonitorStorage(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func TestModifyMonitorResource(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	ModifyMonitorResource(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func TestUpdateAlertRules(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	UpdateAlertRules(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func TestQueryAlertRules(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	QueryAlertRules(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func TestModifyAlertRulesTemplate(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	ModifyAlertRulesTemplate(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func TestDeleteAlertRulesTemplate(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	DeleteAlertRulesTemplate(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}

func TestGetAlertRulesTemplate(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)

	// set context
	c.Set(structs.GlobalServerRequestParametersKey, requestParameters)

	c.Request = &http.Request{
		Method: http.MethodGet,
		URL: &url.URL{
			Path:     "/api/v1",
			RawQuery: "vendor=aws&region=us-west-2",
		},
	}

	t.Setenv("AWS_ROLE_ARN", "arn:aws:iam::1234567890:role/test")
	t.Setenv("AWS_WEB_IDENTITY_TOKEN_FILE", "./clusterapi_test.go")
	t.Setenv("AWS_REGION", "us-west-2")

	GetAlertRulesTemplate(c)

	assert.Equal(t, http.StatusOK, w.Code)
	assert.NotEmpty(t, w.Body.String())
}
