package prometheus

import (
	"bytes"
	"fmt"
	"testing"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/common/expfmt"
)

func gatherLatest(reg *prometheus.Registry) (result string, err error) {
	mfs, err := reg.Gather()
	if err != nil {
		return "", err
	}
	buf := &bytes.Buffer{}

	enc := expfmt.NewEncoder(buf, expfmt.FmtText)
	for _, mf := range mfs {
		if err = enc.Encode(mf); err != nil {
			return "", err
		}
	}
	return buf.String(), nil
}

func TestCounter(t *testing.T) {
	expect := `# HELP test_request_test_metric test
# TYPE test_request_test_metric counter
test_request_test_metric{code="test",kind="test",operation="test",reason="test"} %d
`

	counterVec := prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: "test",
		Name:      "test_metric",
		Subsystem: "request",
		Help:      "test",
	}, []string{"kind", "operation", "code", "reason"})

	counter := NewCounter(counterVec)
	counter.With("test", "test", "test", "test").Inc()

	reg := prometheus.NewRegistry()
	reg.MustRegister(counterVec)

	result, err := gatherLatest(reg)
	if err != nil {
		t.Fatal(err)
	}

	if result != fmt.Sprintf(expect, 1) {
		t.Fatal("metrics error")
	}

	counter.With("test", "test", "test", "test").Add(10)
	result, err = gatherLatest(reg)
	if err != nil {
		t.Fatal(err)
	}

	if result != fmt.Sprintf(expect, 11) {
		t.Fatal("metrics error")
	}
}