package web

import (
	"github.com/google/go-cmp/cmp"
	"testing"
)

func TestExtractWhereArgs(t *testing.T) {

	var queryTests = []struct {
		where    string
		redacted string
		args     []interface{}
	}{
		{
			"name = 'xxxx' or name = :test",
			"name = :redacted1 or name = :test",
			[]interface{}{"xxxx"},
		},
		{
			"name = 'xxxx' or name is null",
			"name = :redacted1 or name is null",
			[]interface{}{"xxxx"},
		},
		{
			"name = 'xxxx' or name in ('yyyy', 'zzzz')",
			"name = :redacted1 or name in ::redacted2",
			[]interface{}{"xxxx", []interface{}{"yyyy", "zzzz"}},
		},
		{
			"id = 3232 or id in (2323, 3239, 483484)",
			"id = :redacted1 or id in ::redacted2",
			[]interface{}{"3232", []interface{}{"2323", "3239", "483484"}},
		},
	}

	t.Log("Given the need to ensure values are correctly extracted from a where query string.")
	{
		for i, tt := range queryTests {
			t.Logf("\tTest: %d\tWhen running test: #%d", i, i)
			{
				res, args, err := ExtractWhereArgs(tt.where)
				if err != nil {
					t.Log("\t\tGot :", err)
					t.Fatalf("\t\tExtract failed.")
				}

				if res != tt.redacted {
					t.Logf("\t\tGot : %+v", res)
					t.Logf("\t\tWant: %+v", tt.redacted)
					t.Fatalf("\t\tResulting where does not match expected.")
				}

				if diff := cmp.Diff(tt.args, args); diff != "" {
					t.Logf("\t\tGot : %+v", args)
					t.Logf("\t\tWant: %+v", tt.args)
					t.Fatalf("\t\tResulting args does not match expected. Diff:\n%s", diff)
				}

				t.Logf("\t\tOk.")
			}
		}
	}
}