package utils

import (
	"testing"

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

func TestMaskSensitiveJSON(t *testing.T) {
	tests := []struct {
		name     string
		input    string
		expected string // We'll check containment or specific structure
	}{
		{
			name:     "Flat object with password",
			input:    `{"username": "user", "password": "secret123"}`,
			expected: `{"password":"*****","username":"user"}`,
		},
		{
			name:     "Nested object with token",
			input:    `{"data": {"token": "abc-def", "id": 123}}`,
			expected: `{"data":{"id":123,"token":"*****"}}`,
		},
		{
			name:     "Case insensitive key",
			input:    `{"NewPassword": "changed"}`,
			expected: `{"NewPassword":"*****"}`,
		},
		{
			name:     "Array of objects",
			input:    `[{"secret": "s1"}, {"secret": "s2"}]`,
			expected: `[{"secret":"*****"},{"secret":"*****"}]`,
		},
		{
			name:     "Invalid JSON",
			input:    `not-json`,
			expected: `not-json`,
		},
		{
			name:     "Empty JSON",
			input:    ``,
			expected: ``,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := MaskSensitiveJSON([]byte(tt.input))
			// Since JSON map order is undefined, exact string match might fail if keys are reordered.
			// Ideally we should unmarshal and compare maps, or use assert.JSONEq
			if tt.name == "Invalid JSON" || tt.name == "Empty JSON" {
				assert.Equal(t, tt.expected, string(result))
			} else {
				assert.JSONEq(t, tt.expected, string(result))
			}
		})
	}
}
