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)) } }) } }