package executor

import "testing"

func TestQuoteTiDBAccount(t *testing.T) {
	got := quoteTiDBAccount("a'b\\c", "%")
	want := "'a''b\\c'@'%'"
	if got != want {
		t.Fatalf("quoteTiDBAccount() = %q, want %q", got, want)
	}
}

func TestValidateTiDBUserName(t *testing.T) {
	if err := validateTiDBUserName("alice"); err != nil {
		t.Fatalf("valid user rejected: %v", err)
	}
	if err := validateTiDBUserName(""); err == nil {
		t.Fatalf("empty user accepted")
	}
	if err := validateTiDBUserName("123456789012345678901234567890123"); err == nil {
		t.Fatalf("overlong user accepted")
	}
}

func TestGrantPrivileges(t *testing.T) {
	tests := []struct {
		name        string
		permissions []string
		want        []string
		wantErr     bool
	}{
		{name: "select", permissions: []string{"SELECT"}, want: []string{"SELECT"}},
		{name: "modify", permissions: []string{"MODIFY"}, want: []string{"DELETE", "INSERT", "UPDATE"}},
		{name: "alter", permissions: []string{"ALTER"}, want: []string{"ALTER", "INDEX"}},
		{name: "all", permissions: []string{"ALL"}, want: []string{"ALTER", "CREATE", "DELETE", "DROP", "INDEX", "INSERT", "SELECT", "UPDATE"}},
		{name: "authorize unsupported", permissions: []string{"AUTHORIZE"}, wantErr: true},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := grantPrivileges(tt.permissions)
			if tt.wantErr {
				if err == nil {
					t.Fatalf("expected error")
				}
				return
			}
			if err != nil {
				t.Fatalf("grantPrivileges failed: %v", err)
			}
			if len(got) != len(tt.want) {
				t.Fatalf("grantPrivileges = %v, want %v", got, tt.want)
			}
			for i := range got {
				if got[i] != tt.want[i] {
					t.Fatalf("grantPrivileges = %v, want %v", got, tt.want)
				}
			}
		})
	}
}
