package redactor

import (
	"os"
	"testing"

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

func Test_doOnJSON(t *testing.T) {
	baseConfiguration, err := os.ReadFile("./testdata/example.json")
	require.NoError(t, err)

	anomConfiguration := doOnJSON(string(baseConfiguration))

	expectedConfiguration, err := os.ReadFile("./testdata/expected.json")
	require.NoError(t, err)

	assert.JSONEq(t, string(expectedConfiguration), anomConfiguration)
}

func Test_doOnJSON_simple(t *testing.T) {
	testCases := []struct {
		name           string
		input          string
		expectedOutput string
	}{
		{
			name: "email",
			input: `{
				"email1": "goo@example.com",
				"email2": "foo.bargoo@example.com",
				"email3": "foo.bargoo@example.com.us"
			}`,
			expectedOutput: `{
				"email1": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
				"email2": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
				"email3": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
			}`,
		},
		{
			name: "url",
			input: `{
				"URL": "foo domain.com foo",
				"URL": "foo sub.domain.com foo",
				"URL": "foo sub.sub.domain.com foo",
				"URL": "foo sub.sub.sub.domain.com.us foo",
				"URL":"https://hub.example.com","foo":"bar"
			}`,
			expectedOutput: `{
				"URL": "foo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx foo",
				"URL": "foo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx foo",
				"URL": "foo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx foo",
				"URL": "foo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx foo",
				"URL":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","foo":"bar"
			}`,
		},
	}

	for _, test := range testCases {
		test := test
		t.Run(test.name, func(t *testing.T) {
			t.Parallel()
			output := doOnJSON(test.input)
			assert.Equal(t, test.expectedOutput, output)
		})
	}
}
