/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 rest

//
//import (
//	"context"
//	"testing"
//	"time"
//)
//
//import (
//	"github.com/emicklei/go-restful/v3"
//
//	"github.com/stretchr/testify/assert"
//)
//
//import (
//	"dubbo.apache.org/dubbo-go/v3/common"
//	"dubbo.apache.org/dubbo-go/v3/common/extension"
//	"dubbo.apache.org/dubbo-go/v3/config"
//	"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
//	"dubbo.apache.org/dubbo-go/v3/protocol/rest/client"
//	"dubbo.apache.org/dubbo-go/v3/protocol/rest/client/client_impl"
//	rest_config "dubbo.apache.org/dubbo-go/v3/protocol/rest/config"
//	"dubbo.apache.org/dubbo-go/v3/protocol/rest/server/server_impl"
//)
//
//const (
//	mockRestCommonUrl = "rest://127.0.0.1:8877/com.ikurento.user.UserProvider?anyhost=true&" +
//		"application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&" +
//		"environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&" +
//		"module=dubbogo+user-info+server&org=ikurento.com&owner=ZX&pid=1447&revision=0.0.1&" +
//		"side=provider&timeout=3000&timestamp=1556509797245&bean.name=com.ikurento.user.UserProvider"
//)
//
//func TestRestInvokerInvoke(t *testing.T) {
//	// Refer
//	proto := GetRestProtocol()
//	defer proto.Destroy()
//	var filterNum int
//	server_impl.AddGoRestfulServerFilter(func(request *restful.Request, response *restful.Response, chain *restful.FilterChain) {
//		println(request.SelectedRoutePath())
//		filterNum = filterNum + 1
//		chain.ProcessFilter(request, response)
//	})
//	server_impl.AddGoRestfulServerFilter(func(request *restful.Request, response *restful.Response, chain *restful.FilterChain) {
//		println("filter2")
//		filterNum = filterNum + 1
//		chain.ProcessFilter(request, response)
//	})
//
//	url, err := common.NewURL(mockRestCommonUrl)
//	assert.NoError(t, err)
//	_, err = common.ServiceMap.Register(url.Service(), url.Protocol, "", "", &UserProvider{})
//	assert.NoError(t, err)
//	con := config.ProviderConfig{}
//	config.SetProviderConfig(con)
//	configMap := make(map[string]*rest_config.RestServiceConfig)
//	methodConfigMap := make(map[string]*rest_config.RestMethodConfig)
//	queryParamsMap := make(map[int]string)
//	queryParamsMap[1] = "age"
//	queryParamsMap[2] = "name"
//	pathParamsMap := make(map[int]string)
//	pathParamsMap[0] = "userid"
//	headersMap := make(map[int]string)
//	headersMap[3] = "Content-Type"
//	methodConfigMap["GetUserOne"] = &rest_config.RestMethodConfig{
//		InterfaceName:  "",
//		MethodName:     "GetUserOne",
//		Path:           "/GetUserOne",
//		Produces:       "application/json",
//		Consumes:       "application/json",
//		MethodType:     "POST",
//		PathParams:     "",
//		PathParamsMap:  nil,
//		QueryParams:    "",
//		QueryParamsMap: nil,
//		Body:           0,
//	}
//	methodConfigMap["GetUserTwo"] = &rest_config.RestMethodConfig{
//		InterfaceName:  "",
//		MethodName:     "GetUserTwo",
//		Path:           "/GetUserTwo",
//		Produces:       "application/json",
//		Consumes:       "application/json",
//		MethodType:     "POST",
//		PathParams:     "",
//		PathParamsMap:  nil,
//		QueryParams:    "",
//		QueryParamsMap: nil,
//		Body:           0,
//	}
//	methodConfigMap["GetUserThree"] = &rest_config.RestMethodConfig{
//		InterfaceName:  "",
//		MethodName:     "GetUserThree",
//		Path:           "/GetUserThree",
//		Produces:       "application/json",
//		Consumes:       "application/json",
//		MethodType:     "POST",
//		PathParams:     "",
//		PathParamsMap:  nil,
//		QueryParams:    "",
//		QueryParamsMap: nil,
//		Body:           0,
//	}
//	methodConfigMap["GetUserFour"] = &rest_config.RestMethodConfig{
//		InterfaceName:  "",
//		MethodName:     "GetUserFour",
//		Path:           "/GetUserFour",
//		Produces:       "application/json",
//		Consumes:       "application/json",
//		MethodType:     "POST",
//		PathParams:     "",
//		PathParamsMap:  nil,
//		QueryParams:    "",
//		QueryParamsMap: nil,
//		Body:           0,
//	}
//	methodConfigMap["GetUserFive"] = &rest_config.RestMethodConfig{
//		InterfaceName: "",
//		MethodName:    "GetUserFive",
//		Path:          "/GetUserFive",
//		Produces:      "*/*",
//		Consumes:      "*/*",
//		MethodType:    "GET",
//	}
//	methodConfigMap["GetUser"] = &rest_config.RestMethodConfig{
//		InterfaceName:  "",
//		MethodName:     "GetUser",
//		Path:           "/GetUser/{userid}",
//		Produces:       "application/json",
//		Consumes:       "application/json",
//		MethodType:     "GET",
//		PathParams:     "",
//		PathParamsMap:  pathParamsMap,
//		QueryParams:    "",
//		QueryParamsMap: queryParamsMap,
//		Body:           -1,
//		HeadersMap:     headersMap,
//	}
//
//	configMap["com.ikurento.user.UserProvider"] = &rest_config.RestServiceConfig{
//		Server:               "go-restful",
//		RestMethodConfigsMap: methodConfigMap,
//	}
//	rest_config.SetRestProviderServiceConfigMap(configMap)
//	proxyFactory := extension.GetProxyFactory("default")
//	proto.Export(proxyFactory.GetInvoker(url))
//	time.Sleep(5 * time.Second)
//	configMap = make(map[string]*rest_config.RestServiceConfig)
//	configMap["com.ikurento.user.UserProvider"] = &rest_config.RestServiceConfig{
//		RestMethodConfigsMap: methodConfigMap,
//	}
//	restClient := client_impl.NewRestyClient(&client.RestOptions{ConnectTimeout: 3 * time.Second, RequestTimeout: 3 * time.Second})
//	invoker := NewRestInvoker(url, &restClient, methodConfigMap)
//	user := &User{}
//	inv := invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUser"),
//		invocation.WithArguments([]any{1, int32(23), "username", "application/json"}), invocation.WithReply(user))
//	res := invoker.Invoke(context.Background(), inv)
//	assert.NoError(t, res.Error())
//	assert.Equal(t, User{ID: 1, Age: int32(23), Name: "username"}, *res.Result().(*User))
//	now := time.Now()
//	inv = invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUserOne"),
//		invocation.WithArguments([]any{&User{1, &now, int32(23), "username"}}), invocation.WithReply(user))
//	res = invoker.Invoke(context.Background(), inv)
//	assert.NoError(t, res.Error())
//	assert.NotNil(t, res.Result())
//	assert.Equal(t, 1, res.Result().(*User).ID)
//	assert.Equal(t, now.Unix(), res.Result().(*User).Time.Unix())
//	assert.Equal(t, int32(23), res.Result().(*User).Age)
//	assert.Equal(t, "username", res.Result().(*User).Name)
//	// test 1
//	inv = invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUserTwo"),
//		invocation.WithArguments([]any{&User{1, &now, int32(23), "username"}}), invocation.WithReply(user))
//	res = invoker.Invoke(context.Background(), inv)
//	assert.NoError(t, res.Error())
//	assert.NotNil(t, res.Result())
//	assert.Equal(t, "username", res.Result().(*User).Name)
//	// test 2
//	inv = invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUserThree"),
//		invocation.WithArguments([]any{&User{1, &now, int32(23), "username"}}), invocation.WithReply(user))
//	res = invoker.Invoke(context.Background(), inv)
//	assert.NoError(t, res.Error())
//	assert.NotNil(t, res.Result())
//	assert.Equal(t, "username", res.Result().(*User).Name)
//	// test 3
//	inv = invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUserFour"),
//		invocation.WithArguments([]any{[]User{{1, nil, int32(23), "username"}}}), invocation.WithReply(user))
//	res = invoker.Invoke(context.Background(), inv)
//	assert.NoError(t, res.Error())
//	assert.NotNil(t, res.Result())
//	assert.Equal(t, "username", res.Result().(*User).Name)
//	// test 4
//	inv = invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUserFive"), invocation.WithReply(user))
//	res = invoker.Invoke(context.Background(), inv)
//	assert.Error(t, res.Error(), "test error")
//
//	assert.Equal(t, filterNum, 12)
//	err = common.ServiceMap.UnRegister(url.Service(), url.Protocol, url.ServiceKey())
//	assert.NoError(t, err)
//}
