package config

import (
	"context"
	"encoding/base64"
	"fmt"
	"net/http"
	"net/http/httptest"
	"testing"

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

func TestMetricsManager(t *testing.T) {
	ctx := context.Background()
	src := NewStaticSource(&Config{
		Options: &Options{
			MetricsAddr: "ADDRESS",
		},
	})
	mgr := NewMetricsManager(ctx, src)
	srv1 := httptest.NewServer(mgr)
	defer srv1.Close()
	srv2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		http.Error(w, "ERROR", http.StatusInternalServerError)
	}))
	defer srv2.Close()

	getStatusCode := func(addr string) int {
		res, err := http.Get(fmt.Sprintf("%s/metrics", addr))
		require.NoError(t, err)
		return res.StatusCode
	}

	assert.Equal(t, 200, getStatusCode(srv1.URL))
	assert.Equal(t, 500, getStatusCode(srv2.URL))
}

func TestMetricsManagerBasicAuth(t *testing.T) {
	src := NewStaticSource(&Config{
		Options: &Options{
			MetricsAddr:      "ADDRESS",
			MetricsBasicAuth: base64.StdEncoding.EncodeToString([]byte("x:y")),
		},
	})
	mgr := NewMetricsManager(context.Background(), src)
	srv1 := httptest.NewServer(mgr)
	defer srv1.Close()

	res, err := http.Get(fmt.Sprintf("%s/metrics", srv1.URL))
	assert.NoError(t, err)
	assert.Equal(t, http.StatusUnauthorized, res.StatusCode)

	req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/metrics", srv1.URL), nil)
	require.NoError(t, err)
	req.SetBasicAuth("x", "y")
	res, err = http.DefaultClient.Do(req)
	assert.NoError(t, err)
	assert.Equal(t, http.StatusOK, res.StatusCode)
}