package persistence

import (
	"database/sql"
	"strings"
	"testing"
)

func TestResolveCurrentBearerTokenSupportsLegacyRowsAndFailsClosedOnSplitState(t *testing.T) {
	tests := []struct {
		name        string
		stored      string
		current     sql.NullString
		want        string
		wantErrText string
	}{
		{name: "legacy raw bearer", stored: "legacy-token", want: "legacy-token"},
		{
			name:    "verifier and material",
			stored:  sessionTokenVerifier("current-token"),
			current: sql.NullString{String: "current-token", Valid: true},
			want:    "current-token",
		},
		{
			name:        "missing material",
			stored:      sessionTokenVerifier("current-token"),
			wantErrText: "missing",
		},
		{
			name:        "mismatched material",
			stored:      sessionTokenVerifier("current-token"),
			current:     sql.NullString{String: "other-token", Valid: true},
			wantErrText: "does not match",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := resolveCurrentBearerToken(tt.stored, tt.current)
			if tt.wantErrText != "" {
				if err == nil || !strings.Contains(err.Error(), tt.wantErrText) {
					t.Fatalf("resolveCurrentBearerToken error = %v, want %q", err, tt.wantErrText)
				}
				return
			}
			if err != nil || got != tt.want {
				t.Fatalf("resolveCurrentBearerToken = %q, %v; want %q, nil", got, err, tt.want)
			}
		})
	}
}

type sessionConnectedAppVisibilityPolicyStub map[string]bool

func (p sessionConnectedAppVisibilityPolicyStub) AllowsConnectedApp(ownerPack, _ string) bool {
	return p[ownerPack]
}
