package log

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"go.uber.org/zap/zaptest/observer"
)

func TestWithRedactedRequest(t *testing.T) {
	core, observed := observer.New(zapcore.InfoLevel)
	logger := zap.New(core)
	req := struct {
		Name     string `json:"name"`
		Password string `json:"password"`
		Token    string `json:"token"`
	}{
		Name:     "changefeed",
		Password: "password-value",
		Token:    "token-value",
	}

	WithRedactedRequest(logger, req).Info("request failed")

	entries := observed.All()
	require.Len(t, entries, 1)
	request, ok := entries[0].ContextMap()["req"].(string)
	require.True(t, ok)
	assert.JSONEq(t, `{"name":"changefeed","password":"redacted","token":"redacted"}`, request)
	assert.NotContains(t, request, "password-value")
	assert.NotContains(t, request, "token-value")
}

func TestWithRedactedRequestOmitsRequestOnError(t *testing.T) {
	core, observed := observer.New(zapcore.InfoLevel)
	logger := zap.New(core)

	WithRedactedRequest(logger, make(chan struct{})).Info("request failed")

	entries := observed.All()
	require.Len(t, entries, 2)
	assert.Equal(t, "prepare request context error", entries[0].Message)
	_, exists := entries[1].ContextMap()["req"]
	assert.False(t, exists)
}
