// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package packer

import (
	"errors"
	"testing"

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

func TestFlattenConfigKeys_nil(t *testing.T) {
	f := flattenConfigKeys(nil)
	assert.Zero(t, f, "Expected empty list.")
}

func TestFlattenConfigKeys_nested(t *testing.T) {
	inp := make(map[string]interface{})
	inp["A"] = ""
	inp["B"] = []string{}

	c := make(map[string]interface{})
	c["X"] = ""
	d := make(map[string]interface{})
	d["a"] = ""

	c["Y"] = d
	inp["C"] = c

	assert.Equal(t,
		[]string{"A", "B", "C/X", "C/Y/a"},
		flattenConfigKeys(inp),
		"Input didn't flatten correctly.",
	)
}

func TestCheckpointTelemetry(t *testing.T) {
	defer func() {
		if r := recover(); r != nil {
			t.Error("a noop CheckpointTelemetry should not to panic but it did\n", r)
		}
	}()

	// A null CheckpointTelemetry obtained in Packer when the CHECKPOINT_DISABLE env var is set results in a NOOP reporter
	// The null reporter can be executable as a configured reporter but does not report any telemetry data.
	var c *CheckpointTelemetry
	c.SetTemplateType(HCL2Template)
	c.SetBundledUsage()
	c.AddSpan("mockprovisioner", "provisioner", nil)
	if err := c.ReportPanic("Bogus Panic"); err != nil {
		t.Errorf("calling ReportPanic on a nil checkpoint reporter should not error")
	}
	if err := c.Finalize("test", 1, errors.New("Bogus Error")); err != nil {
		t.Errorf("calling Finalize on a nil checkpoint reporter should not error")
	}
}
