package dsd

import (
	"mime"
	"testing"

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

func TestMimeTypes(t *testing.T) {
	t.Parallel()

	// Test static maps.
	for _, mimeType := range FormatToMimeType {
		cleaned, _, err := mime.ParseMediaType(mimeType)
		require.NoError(t, err, "mime type must be parse-able")
		assert.Equal(t, mimeType, cleaned, "mime type should be clean in map already")
	}
	for mimeType := range MimeTypeToFormat {
		cleaned, _, err := mime.ParseMediaType(mimeType)
		require.NoError(t, err, "mime type must be parse-able")
		assert.Equal(t, mimeType, cleaned, "mime type should be clean in map already")
	}

	// Test assumptions.
	for accept, format := range map[string]uint8{
		"application/json, image/webp":       JSON,
		"image/webp, application/json":       JSON,
		"application/json;q=0.9, image/webp": JSON,
		"*":                                  DefaultSerializationFormat,
		"*/*":                                DefaultSerializationFormat,
		"text/yAMl":                          YAML,
		" * , yaml ":                         YAML,
		"yaml;charset ,*":                    YAML,
		"xml,*":                              DefaultSerializationFormat,
		"text/xml, text/other":               AUTO,
		"text/*":                             DefaultSerializationFormat,
		"yaml ;charset":                      AUTO, // Invalid mimetype format.
		"":                                   DefaultSerializationFormat,
		"x":                                  AUTO,
	} {
		derivedFormat := FormatFromAccept(accept)
		assert.Equal(t, format, derivedFormat, "assumption for %q should hold", accept)
	}
}