// Licensed to the LF AI & Data foundation 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 eventlog

import (
	"encoding/json"
	"io/ioutil"
	"net/http"
	"net/http/httptest"
	"testing"

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

type HandlerSuite struct {
	suite.Suite
}

func (s *HandlerSuite) SetupTest() {
	s.cleanGrpcLog()
}

func (s *HandlerSuite) TearDownTest() {
	s.cleanGrpcLog()
}

func (s *HandlerSuite) cleanGrpcLog() {
	l := grpcLog.Load()
	if l != nil {
		l.Close()
	}
}

func (s *HandlerSuite) TestServerHTTP() {
	req := httptest.NewRequest(http.MethodGet, "/eventlog", nil)
	w := httptest.NewRecorder()

	handler := Handler()

	handler.ServeHTTP(w, req)

	res := w.Result()
	defer res.Body.Close()
	data, err := ioutil.ReadAll(res.Body)
	s.Require().NoError(err)

	resp := eventLogResponse{}

	err = json.Unmarshal(data, &resp)
	s.Require().NoError(err)

	s.Equal(http.StatusOK, resp.Status)

	l := grpcLog.Load()
	s.NotNil(l)
	s.Equal(l.port, resp.Port)
}

func TestHandler(t *testing.T) {
	suite.Run(t, new(HandlerSuite))
}
