// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package elasticsearch

import (
	"fmt"
	"net/http"
	"net/url"
	"testing"
	"time"

	"gitea.dev/modules/indexer/issues/internal/tests"
	"gitea.dev/modules/test"

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

func TestElasticsearchIndexer(t *testing.T) {
	// The elasticsearch instance started by pull-db-tests.yml > test-unit > services > elasticsearch
	rawURL := test.ExternalServiceHTTP(t, "TEST_ELASTICSEARCH_URL", "http://elastic:changeme@elasticsearch:9200")

	// Go's net/http does not auto-attach URL userinfo as Basic Auth, so extract
	// it and set the header explicitly; otherwise auth-enforced clusters answer
	// 401 and the probe never reports ready.
	parsed, err := url.Parse(rawURL)
	require.NoError(t, err)
	user := parsed.User
	parsed.User = nil
	probeURL := parsed.String()

	require.Eventually(t, func() bool {
		req, err := http.NewRequest(http.MethodGet, probeURL, nil)
		if err != nil {
			return false
		}
		if user != nil {
			pass, _ := user.Password()
			req.SetBasicAuth(user.Username(), pass)
		}
		resp, err := http.DefaultClient.Do(req)
		if err != nil {
			return false
		}
		defer resp.Body.Close()
		return resp.StatusCode == http.StatusOK
	}, time.Minute, time.Second, "Expected elasticsearch to be up")

	indexer := NewIndexer(rawURL, fmt.Sprintf("test_elasticsearch_indexer_%d", time.Now().Unix()))
	defer indexer.Close()

	tests.TestIndexer(t, indexer)
}
