package nomad

import (
	"testing"

	"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils"
	"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
)

func TestParseServicesFailure(t *testing.T) {
	f := func(s string) {
		t.Helper()
		sns, err := parseServices([]byte(s))
		if err == nil {
			t.Fatalf("expecting non-nil error")
		}
		if sns != nil {
			t.Fatalf("unexpected non-nil ServiceNodes: %v", sns)
		}
	}
	f(``)
	f(`[1,23]`)
	f(`{"items":[{"metadata":1}]}`)
}

func TestParseServiceNodesSuccess(t *testing.T) {
	data := `
	[
		{
			"ID": "_nomad-task-1a321d90-79b5-681f-e6fa-8a43c8ec6b69-web-doggo-web-http",
			"ServiceName": "doggo-web",
			"Namespace": "default",
			"NodeID": "9e02c85b-db59-45f1-ddee-40d0317bd33d",
			"Datacenter": "dc1",
			"JobID": "doggo",
			"AllocID": "1a321d90-79b5-681f-e6fa-8a43c8ec6b69",
			"Tags": [
				"doggo",
				"web"
			],
			"Address": "192.168.29.76",
			"Port": 23761,
			"CreateIndex": 402,
			"ModifyIndex": 402
		}
	]
`
	sns, err := parseServices([]byte(data))
	if err != nil {
		t.Fatalf("unexpected error: %s", err)
	}
	if len(sns) != 1 {
		t.Fatalf("unexpected length of ServiceNodes; got %d; want %d", len(sns), 1)
	}
	sn := sns[0]

	// Check sn.appendTargetLabels()
	tagSeparator := ","
	labelss := sn.appendTargetLabels(nil, tagSeparator)
	expectedLabelss := []*promutils.Labels{
		promutils.NewLabelsFromMap(map[string]string{
			"__address__":                   "192.168.29.76:23761",
			"__meta_nomad_dc":               "dc1",
			"__meta_nomad_node_id":          "9e02c85b-db59-45f1-ddee-40d0317bd33d",
			"__meta_nomad_address":          "192.168.29.76",
			"__meta_nomad_namespace":        "default",
			"__meta_nomad_service":          "doggo-web",
			"__meta_nomad_service_address":  "192.168.29.76",
			"__meta_nomad_service_alloc_id": "1a321d90-79b5-681f-e6fa-8a43c8ec6b69",
			"__meta_nomad_service_id":       "_nomad-task-1a321d90-79b5-681f-e6fa-8a43c8ec6b69-web-doggo-web-http",
			"__meta_nomad_service_job_id":   "doggo",
			"__meta_nomad_service_port":     "23761",
			"__meta_nomad_tag_doggo":        "",
			"__meta_nomad_tag_web":          "",
			"__meta_nomad_tagpresent_doggo": "true",
			"__meta_nomad_tagpresent_web":   "true",
			"__meta_nomad_tags":             ",doggo,web,",
		}),
	}
	discoveryutils.TestEqualLabelss(t, labelss, expectedLabelss)
}