package ignore

import (
	"net/url"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/paramtools"
	"go.skia.org/infra/go/testutils/unittest"
	data "go.skia.org/infra/golden/go/testutils/data_three_devices"
)

func TestToQuery(t *testing.T) {
	unittest.SmallTest(t)
	queries, err := toQuery([]*Rule{})
	require.NoError(t, err)
	require.Len(t, queries, 0)

	r1 := NewRule("jon@example.com", time.Now().Add(time.Hour), "config=gpu", "reason")
	queries, err = toQuery([]*Rule{r1})
	require.NoError(t, err)
	require.Equal(t, queries[0], url.Values{"config": []string{"gpu"}})

	// A bad rule won't get converted
	r1 = NewRule("jon@example.com", time.Now().Add(time.Hour), "bad=%", "reason")
	queries, err = toQuery([]*Rule{r1})
	require.NotNil(t, err)
	require.Empty(t, queries)
}

func TestFilterIgnored(t *testing.T) {
	unittest.SmallTest(t)

	// With no ignore rules, nothing is filtered
	ft, pm, err := FilterIgnored(data.MakeTestTile(), nil)
	require.NoError(t, err)
	require.Empty(t, pm)
	require.Equal(t, data.MakeTestTile(), ft)

	future := time.Now().Add(time.Hour)
	ignores := []*Rule{
		NewRule("user@example.com", future, "device=crosshatch", "note"),
	}

	// Now filter the tile and make sure those traces are filtered out.
	ft, pm, err = FilterIgnored(data.MakeTestTile(), ignores)
	require.NoError(t, err)
	require.Equal(t, paramtools.ParamMatcher{
		{
			"device": {"crosshatch"},
		},
	}, pm)
	require.Len(t, ft.Traces, 4)
	require.NotContains(t, ft.Traces, data.CrosshatchAlphaTraceID)
	require.NotContains(t, ft.Traces, data.CrosshatchBetaTraceID)
}
