// +build integration

/*
 * 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 integration

import (
	"context"
	"testing"
)

import (
	"github.com/apache/dubbo-go/common/constant"

	"github.com/stretchr/testify/assert"
)

func TestGetUser(t *testing.T) {
	rspContext := &ContextContent{}

	// add field that client wants to send
	atta := make(map[string]interface{})
	atta["string-value"] = "string-demo"
	atta["int-value"] = 1231242
	atta["user-defined-value"] = ContextContent{InterfaceName: "test.interface.name"}
	reqContext := context.WithValue(context.Background(), constant.DubboCtxKey("attachment"), atta)

	// invoke with reqContext
	err := userProvider.GetContext(reqContext, []interface{}{"A001"}, rspContext)

	// assert dubbo-go fields
	assert.Nil(t, err)
	assert.Equal(t, "org.apache.dubbo.UserProvider", rspContext.InterfaceName)
	assert.Equal(t, "org.apache.dubbo.UserProvider", rspContext.Path)
	assert.NotNil(t, rspContext.LocalAddr)
	assert.NotNil(t, rspContext.RemoteAddr)
	assert.NotNil(t, rspContext.DubboVersion)

	// assert user defined fields
	assert.Equal(t, "test.interface.name", rspContext.UserDefinedStrVal)
	assert.Equal(t, "string-demo", rspContext.CtxStrVal)
	assert.Equal(t, int64(1231242), rspContext.CtxIntVal)
}
