// Copyright 2022 Woodpecker Authors
//
// 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.

package grpc

import (
	"context"
	"testing"

	"github.com/franela/goblin"
	"github.com/stretchr/testify/assert"
	"google.golang.org/grpc/metadata"

	"go.woodpecker-ci.org/woodpecker/v2/server/model"
	mocks_store "go.woodpecker-ci.org/woodpecker/v2/server/store/mocks"
)

func TestRegisterAgent(t *testing.T) {
	g := goblin.Goblin(t)
	g.Describe("When existing agent Name is empty", func() {
		g.It("Should update Name with hostname from metadata", func() {
			store := mocks_store.NewStore(t)
			storeAgent := new(model.Agent)
			storeAgent.ID = 1337
			updatedAgent := model.Agent{
				ID:          1337,
				Created:     0,
				Updated:     0,
				Name:        "hostname",
				OwnerID:     0,
				Token:       "",
				LastContact: 0,
				Platform:    "platform",
				Backend:     "backend",
				Capacity:    2,
				Version:     "version",
				NoSchedule:  false,
			}

			store.On("AgentFind", int64(1337)).Once().Return(storeAgent, nil)
			store.On("AgentUpdate", &updatedAgent).Once().Return(nil)
			rpc := RPC{
				store: store,
			}
			ctx := metadata.NewIncomingContext(
				context.Background(),
				metadata.Pairs("hostname", "hostname", "agent_id", "1337"),
			)
			capacity := int32(2)
			agentID, err := rpc.RegisterAgent(ctx, "platform", "backend", "version", capacity)
			if !assert.NoError(t, err) {
				return
			}

			assert.EqualValues(t, 1337, agentID)
		})
	})

	g.Describe("When existing agent hostname is present", func() {
		g.It("Should not update the hostname", func() {
			store := mocks_store.NewStore(t)
			storeAgent := new(model.Agent)
			storeAgent.ID = 1337
			storeAgent.Name = "originalHostname"
			updatedAgent := model.Agent{
				ID:          1337,
				Created:     0,
				Updated:     0,
				Name:        "originalHostname",
				OwnerID:     0,
				Token:       "",
				LastContact: 0,
				Platform:    "platform",
				Backend:     "backend",
				Capacity:    2,
				Version:     "version",
				NoSchedule:  false,
			}

			store.On("AgentFind", int64(1337)).Once().Return(storeAgent, nil)
			store.On("AgentUpdate", &updatedAgent).Once().Return(nil)
			rpc := RPC{
				store: store,
			}
			ctx := metadata.NewIncomingContext(
				context.Background(),
				metadata.Pairs("hostname", "newHostname", "agent_id", "1337"),
			)
			capacity := int32(2)
			agentID, err := rpc.RegisterAgent(ctx, "platform", "backend", "version", capacity)
			if !assert.NoError(t, err) {
				return
			}

			assert.EqualValues(t, 1337, agentID)
		})
	})
}
