// Code generated by mdatagen. DO NOT EDIT.

package metadata

import (
	"path/filepath"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"go.opentelemetry.io/collector/confmap/confmaptest"
)

func TestResourceAttributesConfig(t *testing.T) {
	tests := []struct {
		name string
		want ResourceAttributesConfig
	}{
		{
			name: "default",
			want: DefaultResourceAttributesConfig(),
		},
		{
			name: "all_set",
			want: ResourceAttributesConfig{
				MapResourceAttr:                  MapResourceAttrResourceAttributeConfig{Enabled: true},
				OptionalResourceAttr:             OptionalResourceAttrResourceAttributeConfig{Enabled: true},
				SliceResourceAttr:                SliceResourceAttrResourceAttributeConfig{Enabled: true},
				StringEnumResourceAttr:           StringEnumResourceAttrResourceAttributeConfig{Enabled: true},
				StringResourceAttr:               StringResourceAttrResourceAttributeConfig{Enabled: true},
				StringResourceAttrDisableWarning: StringResourceAttrDisableWarningResourceAttributeConfig{Enabled: true},
				StringResourceAttrRemoveWarning:  StringResourceAttrRemoveWarningResourceAttributeConfig{Enabled: true},
				StringResourceAttrToBeRemoved:    StringResourceAttrToBeRemovedResourceAttributeConfig{Enabled: true},
			},
		},
		{
			name: "none_set",
			want: ResourceAttributesConfig{
				MapResourceAttr:                  MapResourceAttrResourceAttributeConfig{Enabled: false},
				OptionalResourceAttr:             OptionalResourceAttrResourceAttributeConfig{Enabled: false},
				SliceResourceAttr:                SliceResourceAttrResourceAttributeConfig{Enabled: false},
				StringEnumResourceAttr:           StringEnumResourceAttrResourceAttributeConfig{Enabled: false},
				StringResourceAttr:               StringResourceAttrResourceAttributeConfig{Enabled: false},
				StringResourceAttrDisableWarning: StringResourceAttrDisableWarningResourceAttributeConfig{Enabled: false},
				StringResourceAttrRemoveWarning:  StringResourceAttrRemoveWarningResourceAttributeConfig{Enabled: false},
				StringResourceAttrToBeRemoved:    StringResourceAttrToBeRemovedResourceAttributeConfig{Enabled: false},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			cfg := loadResourceAttributesConfig(t, tt.name)
			diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(MapResourceAttrResourceAttributeConfig{}, OptionalResourceAttrResourceAttributeConfig{}, SliceResourceAttrResourceAttributeConfig{}, StringEnumResourceAttrResourceAttributeConfig{}, StringResourceAttrResourceAttributeConfig{}, StringResourceAttrDisableWarningResourceAttributeConfig{}, StringResourceAttrRemoveWarningResourceAttributeConfig{}, StringResourceAttrToBeRemovedResourceAttributeConfig{}))
			require.Emptyf(t, diff, "Config mismatch (-expected +actual):\n%s", diff)
		})
	}
}

func TestResourceAttributesOverrideConfig(t *testing.T) {
	cfg := loadResourceAttributesConfig(t, "override_set")
	assert.NotNil(t, cfg.MapResourceAttr.OverrideValue, "override_value should be set for map.resource.attr")
	assert.NotNil(t, cfg.OptionalResourceAttr.OverrideValue, "override_value should be set for optional.resource.attr")
	assert.NotNil(t, cfg.SliceResourceAttr.OverrideValue, "override_value should be set for slice.resource.attr")
	assert.NotNil(t, cfg.StringEnumResourceAttr.OverrideValue, "override_value should be set for string.enum.resource.attr")
	assert.NotNil(t, cfg.StringResourceAttr.OverrideValue, "override_value should be set for string.resource.attr")
	assert.NotNil(t, cfg.StringResourceAttrDisableWarning.OverrideValue, "override_value should be set for string.resource.attr_disable_warning")
	assert.NotNil(t, cfg.StringResourceAttrRemoveWarning.OverrideValue, "override_value should be set for string.resource.attr_remove_warning")
	assert.NotNil(t, cfg.StringResourceAttrToBeRemoved.OverrideValue, "override_value should be set for string.resource.attr_to_be_removed")
}

func TestResourceAttributesOverrideEnumValidation(t *testing.T) {
	{
		invalidVal := "invalid-enum-value"
		cfg := StringEnumResourceAttrResourceAttributeConfig{
			Enabled:       true,
			OverrideValue: &invalidVal,
		}
		assert.Error(t, cfg.Validate())
	}
}

func loadResourceAttributesConfig(t *testing.T, name string) ResourceAttributesConfig {
	cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml"))
	require.NoError(t, err)
	sub, err := cm.Sub(name)
	require.NoError(t, err)
	sub, err = sub.Sub("resource_attributes")
	require.NoError(t, err)
	cfg := DefaultResourceAttributesConfig()
	require.NoError(t, sub.Unmarshal(&cfg))
	return cfg
}
