/*
 * 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"
//	"errors"
//	"fmt"
//	"strings"
//	"testing"
//	"time"
//)
//
//import (
//	"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/proxy/proxy_factory"
//	"dubbo.apache.org/dubbo-go/v3/config"
//	rest_config "dubbo.apache.org/dubbo-go/v3/protocol/rest/config"
//)
//
//func TestRestProtocolRefer(t *testing.T) {
//	// Refer
//	proto := GetRestProtocol()
//	url, err := common.NewURL(mockRestCommonUrl)
//	assert.NoError(t, err)
//	con := config.ConsumerConfig{
//		ConnectTimeout: "5s",
//		RequestTimeout: "5s",
//	}
//	config.SetConsumerConfig(con)
//	configMap := make(map[string]*rest_config.RestServiceConfig)
//	configMap["com.ikurento.user.UserProvider"] = &rest_config.RestServiceConfig{
//		Client: "resty",
//	}
//	rest_config.SetRestConsumerServiceConfigMap(configMap)
//	invoker := proto.Refer(url)
//
//	// make sure url
//	eq := invoker.GetURL().URLEqual(url)
//	assert.True(t, eq)
//
//	// make sure invokers after 'Destroy'
//	invokersLen := len(proto.(*RestProtocol).Invokers())
//	assert.Equal(t, 1, invokersLen)
//	proto.Destroy()
//	invokersLen = len(proto.(*RestProtocol).Invokers())
//	assert.Equal(t, 0, invokersLen)
//}
//
//func TestRestProtocolExport(t *testing.T) {
//	// Export
//	proto := GetRestProtocol()
//	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"
//	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,
//	}
//	configMap["com.ikurento.user.UserProvider"] = &rest_config.RestServiceConfig{
//		Server:               "go-restful",
//		RestMethodConfigsMap: methodConfigMap,
//	}
//	rest_config.SetRestProviderServiceConfigMap(configMap)
//	proxyFactory := extension.GetProxyFactory("default")
//	exporter := proto.Export(proxyFactory.GetInvoker(url))
//	// make sure url
//	eq := exporter.GetInvoker().GetURL().URLEqual(url)
//	assert.True(t, eq)
//	// make sure exporterMap after 'UnExport'
//	fmt.Println(url.Path)
//	_, ok := proto.(*RestProtocol).ExporterMap().Load(strings.TrimPrefix(url.Path, "/"))
//	assert.True(t, ok)
//	exporter.UnExport()
//	_, ok = proto.(*RestProtocol).ExporterMap().Load(strings.TrimPrefix(url.Path, "/"))
//	assert.False(t, ok)
//
//	// make sure serverMap after 'Destroy'
//	_, ok = proto.(*RestProtocol).serverMap[url.Location]
//	assert.True(t, ok)
//	proto.Destroy()
//	_, ok = proto.(*RestProtocol).serverMap[url.Location]
//	assert.False(t, ok)
//}
//
//type UserProvider struct{}
//
//func (p *UserProvider) Reference() string {
//	return "com.ikurento.user.UserProvider"
//}
//
//func (p *UserProvider) GetUser(ctx context.Context, id int, age int32, name string, contentType string) (*User, error) {
//	return &User{
//		ID:   id,
//		Time: nil,
//		Age:  age,
//		Name: name,
//	}, nil
//}
//
//func (p *UserProvider) GetUserOne(ctx context.Context, user *User) (*User, error) {
//	return user, nil
//}
//
//func (p *UserProvider) GetUserTwo(ctx context.Context, req []any, rsp *User) error {
//	m := req[0].(map[string]any)
//	rsp.Name = m["Name"].(string)
//	return nil
//}
//
//func (p *UserProvider) GetUserThree(ctx context.Context, user any) (*User, error) {
//	m := user.(map[string]any)
//
//	u := &User{}
//	u.Name = m["Name"].(string)
//	return u, nil
//}
//
//func (p *UserProvider) GetUserFour(ctx context.Context, user []any, id string) (*User, error) {
//	m := user[0].(map[string]any)
//
//	u := &User{}
//	u.Name = m["Name"].(string)
//	return u, nil
//}
//
//func (p *UserProvider) GetUserFive(ctx context.Context, user []any) (*User, error) {
//	return nil, errors.New("test error")
//}
//
//type User struct {
//	ID   int
//	Time *time.Time
//	Age  int32
//	Name string
//}
